diff --git a/main.js b/main.js index 2c6707e..6c9deba 100644 --- a/main.js +++ b/main.js @@ -40586,6 +40586,40 @@ function v4(options, buf, offset) { } var v4_default = v4; +// src/utils/fileUtils.ts +function getMimeType(fileName) { + var _a; + const ext = (_a = fileName.split(".").pop()) == null ? void 0 : _a.toLowerCase(); + const mimeTypes = { + txt: "text/plain", + md: "text/markdown", + json: "application/json", + js: "text/javascript", + ts: "text/typescript", + html: "text/html", + css: "text/css", + pdf: "application/pdf", + png: "image/png", + jpg: "image/jpeg", + jpeg: "image/jpeg", + gif: "image/gif", + svg: "image/svg+xml", + webp: "image/webp", + xml: "application/xml", + csv: "text/csv", + zip: "application/zip", + py: "text/x-python", + java: "text/x-java", + cpp: "text/x-c++src", + c: "text/x-csrc", + h: "text/x-chdr", + sh: "application/x-sh", + yaml: "text/yaml", + yml: "text/yaml" + }; + return mimeTypes[ext || ""] || "application/octet-stream"; +} + // src/references/CacheManager.ts var CacheManager = class { constructor(plugin) { @@ -40670,7 +40704,7 @@ var CacheManager = class { uuid, cachedPath: cachedFileName, name: fileName, - mimeType: this.getMimeType(fileName) + mimeType: getMimeType(fileName) }; } /** @@ -40726,38 +40760,6 @@ var CacheManager = class { return false; } } - getMimeType(fileName) { - var _a; - const ext = (_a = fileName.split(".").pop()) == null ? void 0 : _a.toLowerCase(); - const mimeTypes = { - txt: "text/plain", - md: "text/markdown", - json: "application/json", - js: "text/javascript", - ts: "text/typescript", - html: "text/html", - css: "text/css", - pdf: "application/pdf", - png: "image/png", - jpg: "image/jpeg", - jpeg: "image/jpeg", - gif: "image/gif", - svg: "image/svg+xml", - webp: "image/webp", - xml: "application/xml", - csv: "text/csv", - zip: "application/zip", - py: "text/x-python", - java: "text/x-java", - cpp: "text/x-c++src", - c: "text/x-csrc", - h: "text/x-chdr", - sh: "application/x-sh", - yaml: "text/yaml", - yml: "text/yaml" - }; - return mimeTypes[ext || ""] || "application/octet-stream"; - } }; // src/references/ReferenceExpander.ts @@ -40834,7 +40836,7 @@ var ReferenceExpander = class { const cacheResult = await this.cacheManager.cacheVaultFile(file); cachedPath = cacheResult.cachedPath; uuid = cacheResult.uuid; - mimeType = this.getMimeType(file.name); + mimeType = getMimeType(file.name); sourcePath = file.path; } else { console.warn(`\u0424\u0430\u0439\u043B \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0432 vault: ${reference.path}`); @@ -40871,37 +40873,6 @@ var ReferenceExpander = class { attachments }; } - getMimeType(fileName) { - var _a; - const ext = (_a = fileName.split(".").pop()) == null ? void 0 : _a.toLowerCase(); - const mimeTypes = { - txt: "text/plain", - md: "text/markdown", - json: "application/json", - js: "text/javascript", - ts: "text/typescript", - html: "text/html", - css: "text/css", - pdf: "application/pdf", - png: "image/png", - jpg: "image/jpeg", - jpeg: "image/jpeg", - gif: "image/gif", - svg: "image/svg+xml", - xml: "application/xml", - csv: "text/csv", - zip: "application/zip", - py: "text/x-python", - java: "text/x-java", - cpp: "text/x-c++src", - c: "text/x-csrc", - h: "text/x-chdr", - sh: "application/x-sh", - yaml: "text/yaml", - yml: "text/yaml" - }; - return mimeTypes[ext || ""] || "application/octet-stream"; - } /** * Подготавливает сообщения для LLM с учетом вложений. * Раскрывает только постоянные (@@/##) ссылки и ссылки в последнем сообщении. @@ -46330,4 +46301,4 @@ use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.developme * LICENSE file in the root directory of this source tree. *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiLCAibm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UHVzaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVSZWdFeHAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUVhY2guanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUVhY2guanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JFYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXRlcmF0ZWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2hhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZWR1Y2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9yZWR1Y2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdTaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc2l6ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hTi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpY3RJbmRleE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2xvZGFzaC5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2dyYXBoLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9jb21wb25lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZGF0YS9wcmlvcml0eS1xdWV1ZS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2ZpbmQtY3ljbGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3RvcHNvcnQuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByZW9yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByaW0uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVGaW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC90b0ludGVnZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kSW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2ZvckluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL21hcFZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUd0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWF4LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUx0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWluQnkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmFuZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlUmFuZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9yYW5nZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU29ydEJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZU11bHRpcGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pcXVlSWQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVppcE9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3ppcE9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2xvZGFzaC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2RhdGEvbGlzdC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2dyZWVkeS1mYXMuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9hY3ljbGljLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL25vcm1hbGl6ZS5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvZmVhc2libGUtdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvbmV0d29yay1zaW1wbGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9uZXN0aW5nLWdyYXBoLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2Nvb3JkaW5hdGUtc3lzdGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5pdC1vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYmFyeWNlbnRlci5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3Jlc29sdmUtY29uZmxpY3RzLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3NvcnQtc3ViZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9idWlsZC1sYXllci1ncmFwaC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2xheW91dC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvaW5kZXguanMiLCAibWFpbi50cyIsICJzcmMvdXRpbHMvRXZlbnRCdXMudHMiLCAic3JjL3ZpZXdzL0dyYXBoVmlldy50cyIsICJzcmMvdXRpbHMvRGlhbG9nLnRzIiwgInNyYy9jb21wb25lbnRzL0hpc3RvcnlQYW5lbC50cyIsICJzcmMvY29tcG9uZW50cy9HcmFwaFBhbmVsLnRzIiwgIm5vZGVfbW9kdWxlcy9AcmVhY3RmbG93L2NvcmUvZGlzdC9lc20vaW5kZXgubWpzIiwgIm5vZGVfbW9kdWxlcy9jbGFzc2NhdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvenVzdGFuZC9lc20vdHJhZGl0aW9uYWwubWpzIiwgIm5vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS92YW5pbGxhLm1qcyIsICJub2RlX21vZHVsZXMvenVzdGFuZC9lc20vc2hhbGxvdy5tanMiLCAibm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3JBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2RyYWcuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvc3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsICJub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kdXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHRUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2VuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwgIm5vZGVfbW9kdWxlcy9AcmVhY3RmbG93L2NvbnRyb2xzL2Rpc3QvZXNtL2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvQHJlYWN0Zmxvdy9iYWNrZ3JvdW5kL2Rpc3QvZXNtL2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvQHJlYWN0Zmxvdy9ub2RlLXRvb2xiYXIvZGlzdC9lc20vaW5kZXgubWpzIiwgInNyYy9tb2RhbHMvR3JhcGhTZXR0aW5nc01vZGFsLnRzIiwgInNyYy92aWV3cy9DaGF0Vmlldy50cyIsICJzcmMvcmVmZXJlbmNlcy9BdXRvY29tcGxldGVNYW5hZ2VyLnRzIiwgInNyYy9yZWZlcmVuY2VzL1JlZmVyZW5jZUF1dG9jb21wbGV0ZS50cyIsICJzcmMvcmVmZXJlbmNlcy9SZWZlcmVuY2VFeHBhbmRlci50cyIsICJzcmMvcmVmZXJlbmNlcy9SZWZlcmVuY2VQYXJzZXIudHMiLCAic3JjL3JlZmVyZW5jZXMvQ2FjaGVNYW5hZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3Qvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3Qvcm5nLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvbmF0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvdjQuanMiLCAic3JjL3JlZmVyZW5jZXMvVGVtcGxhdGVFbmdpbmUudHMiLCAic3JjL3JlZmVyZW5jZXMvUmVmZXJlbmNlQm94LnRzIiwgInNyYy9jb21wb25lbnRzL0NoYXRQYW5lbC50cyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vY29tbW9ucy5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vZW5jb2RlUGFja2V0LmJyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvZXNtL2NvbnRyaWIvYmFzZTY0LWFycmF5YnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9kZWNvZGVQYWNrZXQuYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0Bzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXIvbGliL2VzbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vZ2xvYmFscy5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdXRpbC5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vY29udHJpYi9wYXJzZXFzLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnQuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydHMvcG9sbGluZy5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vY29udHJpYi9oYXMtY29ycy5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy93ZWJzb2NrZXQuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydHMvd2VidHJhbnNwb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL3BhcnNldXJpLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9zb2NrZXQuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS91cmwuanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvZXNtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tcGFyc2VyL2J1aWxkL2VzbS9pcy1iaW5hcnkuanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvZXNtL2JpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vb24uanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL3NvY2tldC5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vY29udHJpYi9iYWNrbzIuanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL21hbmFnZXIuanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL2luZGV4LmpzIiwgInNyYy91dGlscy9XZWJTb2NrZXRTZXJ2aWNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdFZlcnNpb24gPSAnMTguMy4xJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHRyYW5zaXRpb246IG51bGxcbn07XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IHtcbiAgY3VycmVudDogbnVsbCxcbiAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS5cbiAgaXNCYXRjaGluZ0xlZ2FjeTogZmFsc2UsXG4gIGRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlOiBmYWxzZVxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxudmFyIGVuYWJsZUNhY2hlRWxlbWVudCA9IGZhbHNlO1xudmFyIGVuYWJsZVRyYW5zaXRpb25UcmFjaW5nID0gZmFsc2U7IC8vIE5vIGtub3duIGJ1Z3MsIGJ1dCBuZWVkcyBwZXJmb3JtYW5jZSB0ZXN0aW5nXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG4vLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nXG4vLyBpc3N1ZXMgaW4gREVWIGJ1aWxkcy5cblxudmFyIGVuYWJsZURlYnVnVHJhY2luZyA9IGZhbHNlOyAvLyBUcmFjayB3aGljaCBGaWJlcihzKSBzY2hlZHVsZSByZW5kZXIgd29yay5cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzogUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gIFJlYWN0Q3VycmVudE93bmVyOiBSZWFjdEN1cnJlbnRPd25lclxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgdmFyIF9jb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gX2NvbnN0cnVjdG9yICYmIChfY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgX2NvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJztcbiAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyBcIi5cIiArIGNhbGxlck5hbWU7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXJyb3IoXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBcIiArICdUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiAnICsgJ0luc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCAnICsgJ2NsYXNzIHByb3BlcnR5IHdpdGggdGhlIGRlc2lyZWQgc3RhdGUgaW4gdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cblxuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiBwYXJ0aWFsU3RhdGUgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSAnICsgJ2Z1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4nKTtcbiAgfVxuXG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG59O1xuLyoqXG4gKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAqXG4gKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICpcbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuXG5Db21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xufTtcbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5cblxue1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG5cbiAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pO1xuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG5cbkNvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4vKipcbiAqIENvbnZlbmllbmNlIGNvbXBvbmVudCB3aXRoIGRlZmF1bHQgc2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igc0NVLlxuICovXG5cbmZ1bmN0aW9uIFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxudmFyIHB1cmVDb21wb25lbnRQcm90b3R5cGUgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7IC8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuXG5hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxuLy8gYW4gaW1tdXRhYmxlIG9iamVjdCB3aXRoIGEgc2luZ2xlIG11dGFibGUgdmFsdWVcbmZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcbiAgdmFyIHJlZk9iamVjdCA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZk9iamVjdCk7XG4gIH1cblxuICByZXR1cm4gcmVmT2JqZWN0O1xufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuICcgKyAnU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuICcgKyAnVGhpcyBjYXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbi4gJyArICdXZSBhc2sgeW91IHRvIG1hbnVhbGx5IGZpeCB0aGlzIGNhc2UgYnkgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuXG4gICAgICB7XG4gICAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBzZWxmID0gY29uZmlnLl9fc2VsZiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NlbGY7XG4gICAgc291cmNlID0gY29uZmlnLl9fc291cmNlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc291cmNlOyAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59XG5mdW5jdGlvbiBjbG9uZUFuZFJlcGxhY2VLZXkob2xkRWxlbWVudCwgbmV3S2V5KSB7XG4gIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBvbGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRFbGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY2xvbmVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgaWYgKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIpO1xuICB9XG5cbiAgdmFyIHByb3BOYW1lOyAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG5cbiAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOyAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLlxuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjsgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAge1xuICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChpc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gVGhlIGBpZmAgc3RhdGVtZW50IGhlcmUgcHJldmVudHMgYXV0by1kaXNhYmxpbmcgb2YgdGhlIHNhZmVcbiAgICAgICAgICAvLyBjb2VyY2lvbiBFU0xpbnQgcnVsZSwgc28gd2UgbXVzdCBtYW51YWxseSBkaXNhYmxlIGl0IGJlbG93LlxuICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICAgIGlmIChtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSkge1xuICAgICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihtYXBwZWRDaGlsZC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1hcHBlZENoaWxkID0gY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLCAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgICAgZXNjYXBlZFByZWZpeCArICggLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgIG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBleGlzdGluZyBlbGVtZW50J3Mga2V5IGNhbiBiZSBhIG51bWJlclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGNvdW50ID0gMDtcbiAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsICcnLCAnJywgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgY291bnQrKyk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvdW50Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIG4gPSAwO1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIG4rKzsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nXG4gIH0pO1xuICByZXR1cm4gbjtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5mb3JlYWNoXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5jXG4gKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LlxuICovXG5mdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIERvbid0IHJldHVybiBhbnl0aGluZy5cbiAgfSwgZm9yRWFjaENvbnRleHQpO1xufVxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cblxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHJldHVybiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9KSB8fCBbXTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cblxuXG5mdW5jdGlvbiBvbmx5Q2hpbGQoY2hpbGRyZW4pIHtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSkge1xuICAvLyBUT0RPOiBTZWNvbmQgYXJndW1lbnQgdXNlZCB0byBiZSBhbiBvcHRpb25hbCBgY2FsY3VsYXRlQ2hhbmdlZEJpdHNgXG4gIC8vIGZ1bmN0aW9uLiBXYXJuIHRvIHJlc2VydmUgZm9yIGZ1dHVyZSB1c2U/XG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgLy8gQXMgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29uY3VycmVudCByZW5kZXJlcnMsIHdlIGNhdGVnb3JpemVcbiAgICAvLyBzb21lIHJlbmRlcmVycyBhcyBwcmltYXJ5IGFuZCBvdGhlcnMgYXMgc2Vjb25kYXJ5LiBXZSBvbmx5IGV4cGVjdFxuICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZFxuICAgIC8vIEZhYnJpYyAoc2Vjb25kYXJ5KTsgUmVhY3QgRE9NIChwcmltYXJ5KSBhbmQgUmVhY3QgQVJUIChzZWNvbmRhcnkpLlxuICAgIC8vIFNlY29uZGFyeSByZW5kZXJlcnMgc3RvcmUgdGhlaXIgY29udGV4dCB2YWx1ZXMgb24gc2VwYXJhdGUgZmllbGRzLlxuICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgIC8vIFVzZWQgdG8gdHJhY2sgaG93IG1hbnkgY29uY3VycmVudCByZW5kZXJlcnMgdGhpcyBjb250ZXh0IGN1cnJlbnRseVxuICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgIF90aHJlYWRDb3VudDogMCxcbiAgICAvLyBUaGVzZSBhcmUgY2lyY3VsYXJcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBDb25zdW1lcjogbnVsbCxcbiAgICAvLyBBZGQgdGhlc2UgdG8gdXNlIHNhbWUgaGlkZGVuIGNsYXNzIGluIFZNIGFzIFNlcnZlckNvbnRleHRcbiAgICBfZGVmYXVsdFZhbHVlOiBudWxsLFxuICAgIF9nbG9iYWxOYW1lOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dFxuICAgIH07IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG5vdCBzZXR0aW5nIGEgdmFsdWUsIHdoaWNoIGlzIGludGVudGlvbmFsIGhlcmVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvbnN1bWVyLCB7XG4gICAgICBQcm92aWRlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuUHJvdmlkZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuUHJvdmlkZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuQ29uc3VtZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkaXNwbGF5TmFtZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5kaXNwbGF5TmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyKSB7XG4gICAgICAgICAgICB3YXJuKCdTZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gQ29udGV4dC5Db25zdW1lciBoYXMgbm8gZWZmZWN0LiAnICsgXCJZb3Ugc2hvdWxkIHNldCBpdCBkaXJlY3RseSBvbiB0aGUgY29udGV4dCB3aXRoIENvbnRleHQuZGlzcGxheU5hbWUgPSAnJXMnLlwiLCBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG5cbiAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7XG4gIH1cblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gbnVsbDtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG52YXIgVW5pbml0aWFsaXplZCA9IC0xO1xudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIGxhenlJbml0aWFsaXplcihwYXlsb2FkKSB7XG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICB2YXIgY3RvciA9IHBheWxvYWQuX3Jlc3VsdDtcbiAgICB2YXIgdGhlbmFibGUgPSBjdG9yKCk7IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgLy8gVGhpcyBtaWdodCB0aHJvdyBlaXRoZXIgYmVjYXVzZSBpdCdzIG1pc3Npbmcgb3IgdGhyb3dzLiBJZiBzbywgd2UgdHJlYXQgaXRcbiAgICAvLyBhcyBzdGlsbCB1bmluaXRpYWxpemVkIGFuZCB0cnkgYWdhaW4gbmV4dCB0aW1lLiBXaGljaCBpcyB0aGUgc2FtZSBhcyB3aGF0XG4gICAgLy8gaGFwcGVucyBpZiB0aGUgY3RvciBvciBhbnkgd3JhcHBlcnMgcHJvY2Vzc2luZyB0aGUgY3RvciB0aHJvd3MuIFRoaXMgbWlnaHRcbiAgICAvLyBlbmQgdXAgZml4aW5nIGl0IGlmIHRoZSByZXNvbHV0aW9uIHdhcyBhIGNvbmN1cnJlbmN5IGJ1Zy5cblxuICAgIHRoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZyB8fCBwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gbW9kdWxlT2JqZWN0O1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZyB8fCBwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgICAvLyBJbiBjYXNlLCB3ZSdyZSBzdGlsbCB1bmluaXRpYWxpemVkLCB0aGVuIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSB0aGVuYWJsZVxuICAgICAgLy8gdG8gcmVzb2x2ZS4gU2V0IGl0IGFzIHBlbmRpbmcgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgICAgcGVuZGluZy5fc3RhdHVzID0gUGVuZGluZztcbiAgICAgIHBlbmRpbmcuX3Jlc3VsdCA9IHRoZW5hYmxlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFJlc29sdmVkKSB7XG4gICAgdmFyIG1vZHVsZU9iamVjdCA9IHBheWxvYWQuX3Jlc3VsdDtcblxuICAgIHtcbiAgICAgIGlmIChtb2R1bGVPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXFxuXFxuXCIgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcHV0IGN1cmx5IGJyYWNlcyBhcm91bmQgdGhlIGltcG9ydD8nLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICghKCdkZWZhdWx0JyBpbiBtb2R1bGVPYmplY3QpKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcIiwgbW9kdWxlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogVW5pbml0aWFsaXplZCxcbiAgICBfcmVzdWx0OiBjdG9yXG4gIH07XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9wYXlsb2FkOiBwYXlsb2FkLFxuICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXJcbiAgfTtcblxuICB7XG4gICAgLy8gSW4gcHJvZHVjdGlvbiwgdGhpcyB3b3VsZCBqdXN0IHNldCBpdCBvbiB0aGUgb2JqZWN0LlxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgdmFyIHByb3BUeXBlczsgLy8gJEZsb3dGaXhNZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eVR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RlZmF1bHRQcm9wcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBkZWZhdWx0UHJvcHMgPSBuZXdEZWZhdWx0UHJvcHM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBwcm9wVHlwZXNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ3Byb3BUeXBlcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxhenlUeXBlO1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUmVmKHJlbmRlcikge1xuICB7XG4gICAgaWYgKHJlbmRlciAhPSBudWxsICYmIHJlbmRlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgcmVjZWl2ZWQgYSBgbWVtb2AgJyArICdjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgJyArICdtZW1vKGZvcndhcmRSZWYoLi4uKSkuJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVuZGVyLmxlbmd0aCAhPT0gMCAmJiByZW5kZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICBpZiAocmVuZGVyLmRlZmF1bHRQcm9wcyAhPSBudWxsIHx8IHJlbmRlci5wcm9wVHlwZXMgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgcmVuZGVyOiByZW5kZXJcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lOyAvLyBUaGUgaW5uZXIgY29tcG9uZW50IHNob3VsZG4ndCBpbmhlcml0IHRoaXMgZGlzcGxheSBuYW1lIGluIG1vc3QgY2FzZXMsXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBtYXkgYmUgdXNlZCBlbHNld2hlcmUuXG4gICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSxcbiAgICAgICAgLy8gc28gdGhhdCBvdXIgY29tcG9uZW50LXN0YWNrIGdlbmVyYXRpb24gbG9naWMgd2lsbCBkaXNwbGF5IHRoZWlyIGZyYW1lcy5cbiAgICAgICAgLy8gQW4gYW5vbnltb3VzIGZ1bmN0aW9uIGdlbmVyYWxseSBzdWdnZXN0cyBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCFyZW5kZXIubmFtZSAmJiAhcmVuZGVyLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgcmVuZGVyLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG52YXIgUkVBQ1RfTU9EVUxFX1JFRkVSRU5DRTtcblxue1xuICBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFID0gU3ltYm9sLmZvcigncmVhY3QubW9kdWxlLnJlZmVyZW5jZScpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgZW5hYmxlRGVidWdUcmFjaW5nICB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiAgfHwgdHlwZSA9PT0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgIHx8IGVuYWJsZUNhY2hlRWxlbWVudCAgfHwgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIFRoaXMgbmVlZHMgdG8gaW5jbHVkZSBhbGwgcG9zc2libGUgbW9kdWxlIHJlZmVyZW5jZSBvYmplY3RcbiAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlXG4gICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBGbGlnaHQgYnVpbGQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyB1c2VkXG4gICAgLy8gd2l0aC5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtZW1vKHR5cGUsIGNvbXBhcmUpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICBlcnJvcignbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTUVNT19UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgY29tcGFyZTogY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbXBhcmVcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lOyAvLyBUaGUgaW5uZXIgY29tcG9uZW50IHNob3VsZG4ndCBpbmhlcml0IHRoaXMgZGlzcGxheSBuYW1lIGluIG1vc3QgY2FzZXMsXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCBtYXkgYmUgdXNlZCBlbHNld2hlcmUuXG4gICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSxcbiAgICAgICAgLy8gc28gdGhhdCBvdXIgY29tcG9uZW50LXN0YWNrIGdlbmVyYXRpb24gbG9naWMgd2lsbCBkaXNwbGF5IHRoZWlyIGZyYW1lcy5cbiAgICAgICAgLy8gQW4gYW5vbnltb3VzIGZ1bmN0aW9uIGdlbmVyYWxseSBzdWdnZXN0cyBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBSZWFjdC5tZW1vKChwcm9wcykgPT4gey4uLn0pO1xuICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LlxuXG4gICAgICAgIGlmICghdHlwZS5uYW1lICYmICF0eXBlLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoZXIoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50O1xuXG4gIHtcbiAgICBpZiAoZGlzcGF0Y2hlciA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbiAgICB9XG4gIH0gLy8gV2lsbCByZXN1bHQgaW4gYSBudWxsIGFjY2VzcyBlcnJvciBpZiBhY2Nlc3NlZCBvdXRzaWRlIHJlbmRlciBwaGFzZS4gV2VcbiAgLy8gaW50ZW50aW9uYWxseSBkb24ndCB0aHJvdyBvdXIgb3duIGVycm9yIGJlY2F1c2UgdGhpcyBpcyBpbiBhIGhvdCBwYXRoLlxuICAvLyBBbHNvIGhlbHBzIGVuc3VyZSB0aGlzIGlzIGlubGluZWQuXG5cblxuICByZXR1cm4gZGlzcGF0Y2hlcjtcbn1cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG5cbiAge1xuICAgIC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cbiAgICBpZiAoQ29udGV4dC5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG5cbiAgICAgIGlmIChyZWFsQ29udGV4dC5Db25zdW1lciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuUHJvdmlkZXIpIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuZnVuY3Rpb24gdXNlVHJhbnNpdGlvbigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VUcmFuc2l0aW9uKCk7XG59XG5mdW5jdGlvbiB1c2VEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VJZCgpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJZCgpO1xufVxuZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTsgLy8gSWYgb3VyIGNvbXBvbmVudCBmcmFtZSBpcyBsYWJlbGVkIFwiPGFub255bW91cz5cIlxuICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCBcImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAvLyBzcGxpY2UgaXQgaW4gdG8gbWFrZSB0aGUgc3RhY2sgbW9yZSByZWFkYWJsZS5cblxuXG4gICAgICAgICAgICAgICAgaWYgKGZuLmRpc3BsYXlOYW1lICYmIF9mcmFtZS5pbmNsdWRlcygnPGFub255bW91cz4nKSkge1xuICAgICAgICAgICAgICAgICAgX2ZyYW1lID0gX2ZyYW1lLnJlcGxhY2UoJzxhbm9ueW1vdXM+JywgZm4uZGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcy5fX3NvdXJjZSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gIH1cblxuICB7XG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gIGlmICghdmFsaWRUeXBlKSB7XG4gICAgdmFyIGluZm8gPSAnJztcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgIH1cblxuICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgIGluZm8gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IGV4cG9ydCBhIEpTWCBsaXRlcmFsIGluc3RlYWQgb2YgYSBjb21wb25lbnQ/JztcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICBpZiAodmFsaWRUeXBlKSB7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uKHR5cGUpIHtcbiAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24uYmluZChudWxsLCB0eXBlKTtcbiAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlwZTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSkge1xuICAgICAgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdSZWFjdC5jcmVhdGVGYWN0b3J5KCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gQ29uc2lkZXIgdXNpbmcgSlNYICcgKyAnb3IgdXNlIFJlYWN0LmNyZWF0ZUVsZW1lbnQoKSBkaXJlY3RseSBpbnN0ZWFkLicpO1xuICAgIH0gLy8gTGVnYWN5IGhvb2s6IHJlbW92ZSBpdFxuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsaWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCdGYWN0b3J5LnR5cGUgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHRoZSBjbGFzcyBkaXJlY3RseSAnICsgJ2JlZm9yZSBwYXNzaW5nIGl0IHRvIGNyZWF0ZUZhY3RvcnkuJyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge1xuICAgICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5O1xufVxuZnVuY3Rpb24gY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24oZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciBuZXdFbGVtZW50ID0gY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzY29wZSwgb3B0aW9ucykge1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNjb3BlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAge1xuICAgICAgaWYgKHByZXZUcmFuc2l0aW9uID09PSBudWxsICYmIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHZhciB1cGRhdGVkRmliZXJzQ291bnQgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmliZXJzQ291bnQgPiAxMCkge1xuICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IGZhbHNlO1xudmFyIGVucXVldWVUYXNrSW1wbCA9IG51bGw7XG5mdW5jdGlvbiBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gIGlmIChlbnF1ZXVlVGFza0ltcGwgPT09IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgLy8gcmVhZCByZXF1aXJlIG9mZiB0aGUgbW9kdWxlIG9iamVjdCB0byBnZXQgYXJvdW5kIHRoZSBidW5kbGVycy5cbiAgICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlbSB0byBkZXRlY3QgYSByZXF1aXJlIGFuZCBidW5kbGUgYSBOb2RlIHBvbHlmaWxsLlxuICAgICAgdmFyIHJlcXVpcmVTdHJpbmcgPSAoJ3JlcXVpcmUnICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7XG4gICAgICB2YXIgbm9kZVJlcXVpcmUgPSBtb2R1bGUgJiYgbW9kdWxlW3JlcXVpcmVTdHJpbmddOyAvLyBhc3N1bWluZyB3ZSdyZSBpbiBub2RlLCBsZXQncyB0cnkgdG8gZ2V0IG5vZGUnc1xuICAgICAgLy8gdmVyc2lvbiBvZiBzZXRJbW1lZGlhdGUsIGJ5cGFzc2luZyBmYWtlIHRpbWVycyBpZiBhbnkuXG5cbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IG5vZGVSZXF1aXJlLmNhbGwobW9kdWxlLCAndGltZXJzJykuc2V0SW1tZWRpYXRlO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIC8vIHdlJ3JlIGluIGEgYnJvd3NlclxuICAgICAgLy8gd2UgY2FuJ3QgdXNlIHJlZ3VsYXIgdGltZXJzIGJlY2F1c2UgdGhleSBtYXkgc3RpbGwgYmUgZmFrZWRcbiAgICAgIC8vIHNvIHdlIHRyeSBNZXNzYWdlQ2hhbm5lbCtwb3N0TWVzc2FnZSBpbnN0ZWFkXG4gICAgICBlbnF1ZXVlVGFza0ltcGwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmIChkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBoYXZlIGEgTWVzc2FnZUNoYW5uZWwgaW1wbGVtZW50YXRpb24sICcgKyAnc28gZW5xdWV1aW5nIHRhc2tzIHZpYSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aWxsIGZhaWwuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3VlcyAnICsgJ2lmIHlvdSBlbmNvdW50ZXIgdGhpcyB3YXJuaW5nLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVucXVldWVUYXNrSW1wbCh0YXNrKTtcbn1cblxudmFyIGFjdFNjb3BlRGVwdGggPSAwO1xudmFyIGRpZFdhcm5Ob0F3YWl0QWN0ID0gZmFsc2U7XG5mdW5jdGlvbiBhY3QoY2FsbGJhY2spIHtcbiAge1xuICAgIC8vIGBhY3RgIGNhbGxzIGNhbiBiZSBuZXN0ZWQsIHNvIHdlIHRyYWNrIHRoZSBkZXB0aC4gVGhpcyByZXByZXNlbnRzIHRoZVxuICAgIC8vIG51bWJlciBvZiBgYWN0YCBzY29wZXMgb24gdGhlIHN0YWNrLlxuICAgIHZhciBwcmV2QWN0U2NvcGVEZXB0aCA9IGFjdFNjb3BlRGVwdGg7XG4gICAgYWN0U2NvcGVEZXB0aCsrO1xuXG4gICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIG91dGVybW9zdCBgYWN0YCBzY29wZS4gSW5pdGlhbGl6ZSB0aGUgcXVldWUuIFRoZSByZWNvbmNpbGVyXG4gICAgICAvLyB3aWxsIGRldGVjdCB0aGUgcXVldWUgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIFNjaGVkdWxlci5cbiAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgcHJldklzQmF0Y2hpbmdMZWdhY3kgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5O1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS4gT25seVxuICAgICAgLy8gc2V0IHRvIGB0cnVlYCB3aGlsZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgaXMgZXhlY3V0ZWQsIG5vdCBmb3IgdXBkYXRlc1xuICAgICAgLy8gdHJpZ2dlcmVkIGR1cmluZyBhbiBhc3luYyBldmVudCwgYmVjYXVzZSB0aGlzIGlzIGhvdyB0aGUgbGVnYWN5XG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgYWN0YCBiZWhhdmVkLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeSA9IHRydWU7XG4gICAgICByZXN1bHQgPSBjYWxsYmFjaygpOyAvLyBSZXBsaWNhdGUgYmVoYXZpb3Igb2Ygb3JpZ2luYWwgYGFjdGAgaW1wbGVtZW50YXRpb24gaW4gbGVnYWN5IG1vZGUsXG4gICAgICAvLyB3aGljaCBmbHVzaGVkIHVwZGF0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNjb3BlIGZ1bmN0aW9uIGV4aXRzLCBldmVuXG4gICAgICAvLyBpZiBpdCdzIGFuIGFzeW5jIGZ1bmN0aW9uLlxuXG4gICAgICBpZiAoIXByZXZJc0JhdGNoaW5nTGVnYWN5ICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeSA9IHByZXZJc0JhdGNoaW5nTGVnYWN5O1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGhlbmFibGVSZXN1bHQgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBhbiBhc3luYyBmdW5jdGlvbiAoaS5lLiByZXR1cm5lZCBhIHByb21pc2UpLiBXYWl0XG4gICAgICAvLyBmb3IgaXQgdG8gcmVzb2x2ZSBiZWZvcmUgZXhpdGluZyB0aGUgY3VycmVudCBzY29wZS5cblxuICAgICAgdmFyIHdhc0F3YWl0ZWQgPSBmYWxzZTtcbiAgICAgIHZhciB0aGVuYWJsZSA9IHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHdhc0F3YWl0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoZW5hYmxlUmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7XG4gICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgICAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3ZlIGV4aXRlZCB0aGUgb3V0ZXJtb3N0IGFjdCBzY29wZS4gUmVjdXJzaXZlbHkgZmx1c2ggdGhlXG4gICAgICAgICAgICAgIC8vIHF1ZXVlIHVudGlsIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsuXG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayB0aHJldyBhbiBlcnJvci5cbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuTm9Bd2FpdEFjdCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHt9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2FzQXdhaXRlZCkge1xuICAgICAgICAgICAgICBkaWRXYXJuTm9Bd2FpdEFjdCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ1lvdSBjYWxsZWQgYWN0KGFzeW5jICgpID0+IC4uLikgd2l0aG91dCBhd2FpdC4gJyArICdUaGlzIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCB0ZXN0aW5nIGJlaGF2aW91ciwgJyArICdpbnRlcmxlYXZpbmcgbXVsdGlwbGUgYWN0IGNhbGxzIGFuZCBtaXhpbmcgdGhlaXIgJyArICdzY29wZXMuICcgKyAnWW91IHNob3VsZCAtIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJldHVyblZhbHVlID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgbm90IGFuIGFzeW5jIGZ1bmN0aW9uLiBFeGl0IHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICAvLyBpbW1lZGlhdGVseSwgd2l0aG91dCBhd2FpdGluZy5cblxuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuXG4gICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkge1xuICAgICAgICAvLyBFeGl0aW5nIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBGbHVzaCB0aGUgcXVldWUuXG4gICAgICAgIHZhciBfcXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50O1xuXG4gICAgICAgIGlmIChfcXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBmbHVzaEFjdFF1ZXVlKF9xdWV1ZSk7XG4gICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgIH0gLy8gUmV0dXJuIGEgdGhlbmFibGUuIElmIHRoZSB1c2VyIGF3YWl0cyBpdCwgd2UnbGwgZmx1c2ggYWdhaW4gaW5cbiAgICAgICAgLy8gY2FzZSBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZCBieSBhIG1pY3JvdGFzay5cblxuXG4gICAgICAgIHZhciBfdGhlbmFibGUgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgLy8gQ29uZmlybSB3ZSBoYXZlbid0IHJlLWVudGVyZWQgYW5vdGhlciBgYWN0YCBzY29wZSwgaW4gY2FzZVxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgZG9lcyBzb21ldGhpbmcgd2VpcmQgbGlrZSBhd2FpdCB0aGUgdGhlbmFibGVcbiAgICAgICAgICAgIC8vIG11bHRpcGxlIHRpbWVzLlxuICAgICAgICAgICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmx1c2ggdGhlIHF1ZXVlIHVudGlsIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsuXG4gICAgICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBbXTtcbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGVuYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIGluc2lkZSBhIG5lc3RlZCBgYWN0YCBzY29wZSwgdGhlIHJldHVybmVkIHRoZW5hYmxlXG4gICAgICAgIC8vIGltbWVkaWF0ZWx5IHJlc29sdmVzLiBUaGUgb3V0ZXIgc2NvcGUgd2lsbCBmbHVzaCB0aGUgcXVldWUuXG4gICAgICAgIHZhciBfdGhlbmFibGUyID0ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGVuYWJsZTI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKSB7XG4gIHtcbiAgICBpZiAocHJldkFjdFNjb3BlRGVwdGggIT09IGFjdFNjb3BlRGVwdGggLSAxKSB7XG4gICAgICBlcnJvcignWW91IHNlZW0gdG8gaGF2ZSBvdmVybGFwcGluZyBhY3QoKSBjYWxscywgdGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0JlIHN1cmUgdG8gYXdhaXQgcHJldmlvdXMgYWN0KCkgY2FsbHMgYmVmb3JlIG1ha2luZyBhIG5ldyBvbmUuICcpO1xuICAgIH1cblxuICAgIGFjdFNjb3BlRGVwdGggPSBwcmV2QWN0U2NvcGVEZXB0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpIHtcbiAge1xuICAgIHZhciBxdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gYWRkaXRpb25hbCB3b3JrIHdhcyBzY2hlZHVsZWQuIEZpbmlzaC5cbiAgICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEtlZXAgZmx1c2hpbmcgd29yayB1bnRpbCB0aGVyZSdzIG5vbmUgbGVmdC5cbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgaXNGbHVzaGluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSB7XG4gIHtcbiAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY2UuXG4gICAgICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayh0cnVlKTtcbiAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgc29tZXRoaW5nIHRocm93cywgbGVhdmUgdGhlIHJlbWFpbmluZyBjYWxsYmFja3Mgb24gdGhlIHF1ZXVlLlxuICAgICAgICBxdWV1ZSA9IHF1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBjcmVhdGVFbGVtZW50JDEgPSAgY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjbG9uZUVsZW1lbnQkMSA9ICBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY3JlYXRlRmFjdG9yeSA9ICBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24gO1xudmFyIENoaWxkcmVuID0ge1xuICBtYXA6IG1hcENoaWxkcmVuLFxuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBvbmx5OiBvbmx5Q2hpbGRcbn07XG5cbmV4cG9ydHMuQ2hpbGRyZW4gPSBDaGlsZHJlbjtcbmV4cG9ydHMuQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5leHBvcnRzLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IFB1cmVDb21wb25lbnQ7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG5leHBvcnRzLmFjdCA9IGFjdDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgICB2YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoJ3NjaGVkdWxlcicpO1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxudmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0U3VwcHJlc3NXYXJuaW5nKG5ld1N1cHByZXNzV2FybmluZykge1xuICB7XG4gICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nO1xuICB9XG59IC8vIEluIERFViwgY2FsbHMgdG8gY29uc29sZS53YXJuIGFuZCBjb25zb2xlLmVycm9yIGdldCByZXBsYWNlZFxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgRnVuY3Rpb25Db21wb25lbnQgPSAwO1xudmFyIENsYXNzQ29tcG9uZW50ID0gMTtcbnZhciBJbmRldGVybWluYXRlQ29tcG9uZW50ID0gMjsgLy8gQmVmb3JlIHdlIGtub3cgd2hldGhlciBpdCBpcyBmdW5jdGlvbiBvciBjbGFzc1xuXG52YXIgSG9zdFJvb3QgPSAzOyAvLyBSb290IG9mIGEgaG9zdCB0cmVlLiBDb3VsZCBiZSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgbm9kZS5cblxudmFyIEhvc3RQb3J0YWwgPSA0OyAvLyBBIHN1YnRyZWUuIENvdWxkIGJlIGFuIGVudHJ5IHBvaW50IHRvIGEgZGlmZmVyZW50IHJlbmRlcmVyLlxuXG52YXIgSG9zdENvbXBvbmVudCA9IDU7XG52YXIgSG9zdFRleHQgPSA2O1xudmFyIEZyYWdtZW50ID0gNztcbnZhciBNb2RlID0gODtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSA5O1xudmFyIENvbnRleHRQcm92aWRlciA9IDEwO1xudmFyIEZvcndhcmRSZWYgPSAxMTtcbnZhciBQcm9maWxlciA9IDEyO1xudmFyIFN1c3BlbnNlQ29tcG9uZW50ID0gMTM7XG52YXIgTWVtb0NvbXBvbmVudCA9IDE0O1xudmFyIFNpbXBsZU1lbW9Db21wb25lbnQgPSAxNTtcbnZhciBMYXp5Q29tcG9uZW50ID0gMTY7XG52YXIgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50ID0gMTc7XG52YXIgRGVoeWRyYXRlZEZyYWdtZW50ID0gMTg7XG52YXIgU3VzcGVuc2VMaXN0Q29tcG9uZW50ID0gMTk7XG52YXIgU2NvcGVDb21wb25lbnQgPSAyMTtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMjtcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyMztcbnZhciBDYWNoZUNvbXBvbmVudCA9IDI0O1xudmFyIFRyYWNpbmdNYXJrZXJDb21wb25lbnQgPSAyNTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2ggPSB0cnVlOyAvLyBUT0RPOiBOZWVkIHRvIHJldmlldyB0aGlzIGNvZGUgb25lIG1vcmUgdGltZSBiZWZvcmUgbGFuZGluZ1xuLy8gdGhlIHJlYWN0LXJlY29uY2lsZXIgcGFja2FnZS5cblxudmFyIGVuYWJsZU5ld1JlY29uY2lsZXIgPSBmYWxzZTsgLy8gU3VwcG9ydCBsZWdhY3kgUHJpbWVyIHN1cHBvcnQgb24gaW50ZXJuYWwgRkIgd3d3XG5cbnZhciBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uID0gZmFsc2U7IC8vIEZCLW9ubHkgdXNhZ2UuIFRoZSBuZXcgQVBJIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzLlxuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuXG52YXIgZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRml6elxuLy8gUmVhY3QgRE9NIENob3BwaW5nIEJsb2NrXG4vL1xuLy8gU2ltaWxhciB0byBtYWluIENob3BwaW5nIEJsb2NrIGJ1dCBvbmx5IGZsYWdzIHJlbGF0ZWQgdG8gUmVhY3QgRE9NLiBUaGVzZSBhcmVcbi8vIGdyb3VwZWQgYmVjYXVzZSB3ZSB3aWxsIGxpa2VseSBiYXRjaCBhbGwgb2YgdGhlbSBpbnRvIGEgc2luZ2xlIG1ham9yIHJlbGVhc2UuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzYWJsZSBzdXBwb3J0IGZvciBjb21tZW50IG5vZGVzIGFzIFJlYWN0IERPTSBjb250YWluZXJzLiBBbHJlYWR5IGRpc2FibGVkXG4vLyBpbiBvcGVuIHNvdXJjZSwgYnV0IHd3dyBjb2RlYmFzZSBzdGlsbCByZWxpZXMgb24gaXQuIE5lZWQgdG8gcmVtb3ZlLlxuXG52YXIgZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzID0gdHJ1ZTsgLy8gRGlzYWJsZSBqYXZhc2NyaXB0OiBVUkwgc3RyaW5ncyBpbiBocmVmIGZvciBYU1MgcHJvdGVjdGlvbi5cbi8vIGFuZCBjbGllbnQgcmVuZGVyaW5nLCBtb3N0bHkgdG8gYWxsb3cgSlNYIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIGN1c3RvbVxuLy8gZWxlbWVudCdzIG9iamVjdCBwcm9wZXJ0aWVzIGluc3RlYWQgb2Ygb25seSBIVE1MIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExMzQ3XG5cbnZhciBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID0gZmFsc2U7IC8vIERpc2FibGVzIGNoaWxkcmVuIGZvciA8dGV4dGFyZWE+IGVsZW1lbnRzXG52YXIgd2FybkFib3V0U3RyaW5nUmVmcyA9IHRydWU7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWJ1Z2dpbmcgYW5kIERldlRvb2xzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQWRkcyB1c2VyIHRpbWluZyBtYXJrcyBmb3IgZS5nLiBzdGF0ZSB1cGRhdGVzLCBzdXNwZW5zZSwgYW5kIHdvcmsgbG9vcCBzdHVmZixcbi8vIGZvciBhbiBleHBlcmltZW50YWwgdGltZWxpbmUgdG9vbC5cblxudmFyIGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlciA9IHRydWU7IC8vIEhlbHBzIGlkZW50aWZ5IHNpZGUgZWZmZWN0cyBpbiByZW5kZXItcGhhc2UgbGlmZWN5Y2xlIGhvb2tzIGFuZCBzZXRTdGF0ZVxuXG52YXIgZW5hYmxlUHJvZmlsZXJUaW1lciA9IHRydWU7IC8vIFJlY29yZCBkdXJhdGlvbnMgZm9yIGNvbW1pdCBhbmQgcGFzc2l2ZSBlZmZlY3RzIHBoYXNlcy5cblxudmFyIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgPSB0cnVlOyAvLyBQaGFzZSBwYXJhbSBwYXNzZWQgdG8gb25SZW5kZXIgY2FsbGJhY2sgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiBcInVwZGF0ZVwiIGFuZCBhIFwiY2FzY2FkaW5nLXVwZGF0ZVwiLlxuXG52YXIgYWxsTmF0aXZlRXZlbnRzID0gbmV3IFNldCgpO1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICovXG5cblxudmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTtcbi8qKlxuICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSByZWdpc3RyYXRpb24gbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sXG4gKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gKiBvbmx5IGluIHRydWUuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5cbnZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWVcblxuZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcyk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSArICdDYXB0dXJlJywgZGVwZW5kZW5jaWVzKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHtcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkge1xuICAgICAgZXJyb3IoJ0V2ZW50UmVnaXN0cnk6IE1vcmUgdGhhbiBvbmUgcGx1Z2luIGF0dGVtcHRlZCB0byBwdWJsaXNoIHRoZSBzYW1lICcgKyAncmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llcztcblxuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7XG4gIH1cbn1cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKlxuICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sXG4gKiBhbmQgVGVtcG9yYWwuKiB0eXBlcy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzIyMDY0LlxuICpcbiAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCxcbiAqIGVhc2llci10by1kZWJ1ZyBleGNlcHRpb24gd2l0aCBhIGNsZWFyIGVycm9ycyBtZXNzYWdlIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGVcbiAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvblxuICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS5cbiAqL1xuLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cbmZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7XG4gIHtcbiAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50XG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7XG4gICAgdmFyIHR5cGUgPSBoYXNUb1N0cmluZ1RhZyAmJiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddIHx8IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ09iamVjdCc7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn0gLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS5cblxuXG5mdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkge1xuICB7XG4gICAgdHJ5IHtcbiAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAvLyBJZiB5b3UgZW5kZWQgdXAgaGVyZSBieSBmb2xsb3dpbmcgYW4gZXhjZXB0aW9uIGNhbGwgc3RhY2ssIGhlcmUncyB3aGF0J3NcbiAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSxcbiAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0b1xuICAvLyBjb2VyY2UgaXQgdG8gYSBzdHJpbmcgdXNpbmcgYCcnICsgdmFsdWVgLCBhbiBleGNlcHRpb24gd2FzIHRocm93bi5cbiAgLy9cbiAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzXG4gIC8vIGFuZCBUZW1wb3JhbCBvYmplY3RzIGxpa2UgYFRlbXBvcmFsLkluc3RhbnRgLiBCdXQgYW55IG9iamVjdCB0aGF0IGhhcyBhXG4gIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpc1xuICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW5cbiAgLy8gbnVtZXJpYyBvcGVyYXRvcnMgbGlrZSBgK2Agb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgbGlrZSBgPj1gIGJlY2F1c2UgY3VzdG9tXG4gIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pXG4gIC8vXG4gIC8vIFRvIGZpeCB0aGUgcHJvYmxlbSwgY29lcmNlIHRoaXMgb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbiAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLlxuICAvL1xuICAvLyBUbyBmaW5kIHdoaWNoIHZhbHVlIGlzIHRocm93aW5nLCBjaGVjayB0aGUgYnJvd3NlciBvciBkZWJ1Z2dlciBjb25zb2xlLlxuICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXRcbiAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZVxuICAvLyBwcm9ibGVtIGFuZCBob3cgdGhhdCB0eXBlIHdhcyB1c2VkOiBrZXksIGF0cnJpYnV0ZSwgaW5wdXQgdmFsdWUgcHJvcCwgZXRjLlxuICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzXG4gIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC5cbiAgLy9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgYXR0cmlidXRlIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIGF0dHJpYnV0ZU5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tIdG1sU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuXG4vLyBJdCBpcyBoYW5kbGVkIGJ5IFJlYWN0IHNlcGFyYXRlbHkgYW5kIHNob3VsZG4ndCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG52YXIgUkVTRVJWRUQgPSAwOyAvLyBBIHNpbXBsZSBzdHJpbmcgYXR0cmlidXRlLlxuLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS5cblxudmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWRcbi8vIFwiZW51bWVyYXRlZFwiIGF0dHJpYnV0ZXMgd2l0aCBcInRydWVcIiBhbmQgXCJmYWxzZVwiIGFzIHBvc3NpYmxlIHZhbHVlcy5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwidHJ1ZVwiIHN0cmluZy5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcImZhbHNlXCIgc3RyaW5nLlxuXG52YXIgQk9PTEVBTklTSF9TVFJJTkcgPSAyOyAvLyBBIHJlYWwgYm9vbGVhbiBhdHRyaWJ1dGUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cblxudmFyIEJPT0xFQU4gPSAzOyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC5cbi8vIEZvciBhbnkgb3RoZXIgdmFsdWUsIHNob3VsZCBiZSBwcmVzZW50IHdpdGggdGhhdCB2YWx1ZS5cblxudmFyIE9WRVJMT0FERURfQk9PTEVBTiA9IDQ7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIE5VTUVSSUMgPSA1OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBQT1NJVElWRV9OVU1FUklDID0gNjtcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xudmFyIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgPSBcIjpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcIjtcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG52YXIgQVRUUklCVVRFX05BTUVfQ0hBUiA9IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyBcIlxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXCI7XG52YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xudmFyIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9O1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cbiAge1xuICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDtcbiAgfVxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgKG5hbWVbMF0gPT09ICdvJyB8fCBuYW1lWzBdID09PSAnTycpICYmIChuYW1lWzFdID09PSAnbicgfHwgbmFtZVsxXSA9PT0gJ04nKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzogLy8gJEZsb3dJc3N1ZSBzeW1ib2wgaXMgcGVyZmVjdGx5IHZhbGlkIGhlcmVcblxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAge1xuICAgICAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuICFwcm9wZXJ0eUluZm8uYWNjZXB0c0Jvb2xlYW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmVmaXggPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCwgNSk7XG4gICAgICAgICAgcmV0dXJuIHByZWZpeCAhPT0gJ2RhdGEtJyAmJiBwcmVmaXggIT09ICdhcmlhLSc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oZXhwZWN0ZWQsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5cbmZ1bmN0aW9uIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG5cbiAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgdmFsdWUgPSBudWxsO1xuICB9XG5cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7XG4gICAgaWYgKGlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHZhciBfYXR0cmlidXRlTmFtZSA9IG5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSwgICcnICsgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtdXN0VXNlUHJvcGVydHkgPSBwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5O1xuXG4gIGlmIChtdXN0VXNlUHJvcGVydHkpIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHR5cGUgPT09IEJPT0xFQU4gPyBmYWxzZSA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhlIHJlc3QgYXJlIHRyZWF0ZWQgYXMgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgY2FzZXMuXG5cblxuICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLFxuICAgICAgYXR0cmlidXRlTmFtZXNwYWNlID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX3R5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTtcbiAgICB2YXIgYXR0cmlidXRlVmFsdWU7XG5cbiAgICBpZiAoX3R5cGUgPT09IEJPT0xFQU4gfHwgX3R5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTiAmJiB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2lua1xuICAgICAgLy8gYW5kIHdlIHdvbid0IHJlcXVpcmUgVHJ1c3RlZCBUeXBlIGhlcmUuXG4gICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAvLyAoJycgKyB2YWx1ZSkgbWFrZXMgaXQgb3V0cHV0IHRoZSBjb3JyZWN0IHRvU3RyaW5nKCktdmFsdWUuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkge1xuICAgICAgICBzYW5pdGl6ZVVSTChhdHRyaWJ1dGVWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZXNwYWNlKSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpO1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zY29wZScpO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xudmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC50cmFjaW5nX21hcmtlcicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICggIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoY3RvciwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRmliZXIoZmliZXIpIHtcbiAgdmFyIG93bmVyID0gIGZpYmVyLl9kZWJ1Z093bmVyID8gZmliZXIuX2RlYnVnT3duZXIudHlwZSA6IG51bGwgO1xuICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7XG5cbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBkaXNwbGF5TmFtZSA9IG91dGVyVHlwZS5kaXNwbGF5TmFtZTtcblxuICBpZiAoZGlzcGxheU5hbWUpIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWU7XG4gIH1cblxuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCByZWFjdC1yZWNvbmNpbGVyL2dldENvbXBvbmVudE5hbWVGcm9tRmliZXJcblxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLlxuXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG5cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICB2YXIgb3V0ZXJOYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuXG4gICAgICAgIGlmIChvdXRlck5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJztcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn0gLy8gS2VlcCBpbiBzeW5jIHdpdGggc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lJDEodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHtcbiAgdmFyIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnQ2FjaGUnO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lJDEocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JztcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSQxKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuIFwiZGl2XCIsIFwiVmlld1wiKVxuICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuICdSb290JztcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gJ1RleHQnO1xuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAgLy8gTmFtZSBjb21lcyBmcm9tIHRoZSB0eXBlIGluIHRoaXMgY2FzZTsgd2UgZG9uJ3QgaGF2ZSBhIHRhZy5cbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkge1xuICAgICAgICAvLyBEb24ndCBiZSBsZXNzIHNwZWNpZmljIHRoYW4gc2hhcmVkL2dldENvbXBvbmVudE5hbWVGcm9tVHlwZVxuICAgICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01vZGUnO1xuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTY29wZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7XG4gICAgLy8gVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyB0YWdzIGNvbWUgZnJvbSB0aGUgdXNlci1wcm92aWRlZCB0eXBlOlxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbnZhciBjdXJyZW50ID0gbnVsbDtcbnZhciBpc1JlbmRlcmluZyA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3duZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZmliZXIgPT09IG51bGwgPyBudWxsIDogZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykge1xuICB7XG4gICAgaXNSZW5kZXJpbmcgPSByZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICAvLyBUaGUgY29lcmNpb24gc2FmZXR5IGNoZWNrIGlzIHBlcmZvcm1lZCBpbiBnZXRUb1N0cmluZ1ZhbHVlKCkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBmdW5jdGlvbiwgc3ltYm9sIGFyZSBhc3NpZ25lZCBhcyBlbXB0eSBzdHJpbmdzXG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxudmFyIGhhc1JlYWRPbmx5VmFsdWUgPSB7XG4gIGJ1dHRvbjogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBoaWRkZW46IHRydWUsXG4gIHJhZGlvOiB0cnVlLFxuICByZXNldDogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlXG59O1xuZnVuY3Rpb24gY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcyh0YWdOYW1lLCBwcm9wcykge1xuICB7XG4gICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCB8fCBwcm9wcy5jaGVja2VkID09IG51bGwpKSB7XG4gICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHtcbiAgdmFyIHR5cGUgPSBlbGVtLnR5cGU7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmFja2VyKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX3ZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7XG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgdmFsdWUgPSAnJztcblxuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAoaXNDaGVja2FibGUobm9kZSkpIHtcbiAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBub2RlLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpIHtcbiAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/ICdjaGVja2VkJyA6ICd2YWx1ZSc7XG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7XG5cbiAge1xuICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbihub2RlW3ZhbHVlRmllbGRdKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50VmFsdWUgPSAnJyArIG5vZGVbdmFsdWVGaWVsZF07IC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsXG4gIC8vIGJ1dCBpdCdzIGJldHRlciB0aGVuIGEgaGFyZCBmYWlsdXJlXG4gIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcblxuICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBkZXNjcmlwdG9yLnNldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldCxcbiAgICAgIHNldCA9IGRlc2NyaXB0b3Iuc2V0O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB7XG4gICAgICAgIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICB9LFxuICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTtcbiAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIHRyYWNrKG5vZGUpIHtcbiAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVE9ETzogT25jZSBpdCdzIGp1c3QgRmliZXIgd2UgY2FuIG1vdmUgdGhpcyB0byBub2RlLl93cmFwcGVyU3RhdGVcblxuXG4gIG5vZGUuX3ZhbHVlVHJhY2tlciA9IHRyYWNrVmFsdWVPbk5vZGUobm9kZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHlcbiAgLy8gdGhhdCB0cnlpbmcgYWdhaW4gd2lsbCBzdWNjZWVkXG5cbiAgaWYgKCF0cmFja2VyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICB2YXIgbmV4dFZhbHVlID0gZ2V0VmFsdWVGcm9tTm9kZShub2RlKTtcblxuICBpZiAobmV4dFZhbHVlICE9PSBsYXN0VmFsdWUpIHtcbiAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSB7XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcblxuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIFNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZFxuICB9KTtcbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHtcbiAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24obmFtZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuXG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG5cblxuICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7XG5cbiAgICAgIGlmICghb3RoZXJQcm9wcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSAnICsgJ3NhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gZmFsc2U7XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS5cbiAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1Bhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyAnICsgJ3doaWNoIHZhbHVlIHNob3VsZCBiZSBzZWxlY3RlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuXG52YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYSkge1xuICByZXR1cm4gaXNBcnJheUltcGwoYSk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMTtcblxue1xuICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gIGlmIChvd25lck5hbWUpIHtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcbi8qKlxuICogVmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKi9cblxuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3NlbGVjdCcsIHByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldO1xuXG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG5cbiAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSAmJiAhcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgcHJvcE5hbWVJc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgdmFyIG9wdGlvbnMgPSBub2RlLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWVzID0gcHJvcFZhbHVlO1xuICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBQcmVmaXggdG8gYXZvaWQgY2hhb3Mgd2l0aCBzcGVjaWFsIGtleXMuXG4gICAgICBzZWxlY3RlZFZhbHVlWyckJyArIHNlbGVjdGVkVmFsdWVzW2ldXSA9IHRydWU7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KCckJyArIG9wdGlvbnNbX2ldLnZhbHVlKTtcblxuICAgICAgaWYgKG9wdGlvbnNbX2ldLnNlbGVjdGVkICE9PSBzZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIERvIG5vdCBzZXQgYHNlbGVjdC52YWx1ZWAgYXMgZXhhY3QgYmVoYXZpb3IgaXNuJ3QgY29uc2lzdGVudCBhY3Jvc3MgYWxsXG4gICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy5cbiAgICB2YXIgX3NlbGVjdGVkVmFsdWUgPSB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BWYWx1ZSkpO1xuXG4gICAgdmFyIGRlZmF1bHRTZWxlY3RlZCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBvcHRpb25zLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIGlmIChvcHRpb25zW19pMl0udmFsdWUgPT09IF9zZWxlY3RlZFZhbHVlKSB7XG4gICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICAgIG9wdGlvbnNbX2kyXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHtcbiAgICAgICAgZGVmYXVsdFNlbGVjdGVkID0gb3B0aW9uc1tfaTJdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRTZWxlY3RlZC5zZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHJldHVybiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZFxuICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZVxuICB9O1xuXG4gIHtcbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEpIHtcbiAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlO1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdFVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSAhIXByb3BzLm11bHRpcGxlKSB7XG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLm11bHRpcGxlID8gW10gOiAnJywgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpO1xuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoaWxkcmVuOiB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKVxuICB9KTtcblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygndGV4dGFyZWEnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhIHRleHRhcmVhIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ1RleHRhcmVhIGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCB0ZXh0YXJlYSAnICsgJ2FuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50Jyk7XG5cbiAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5pdGlhbFZhbHVlID0gcHJvcHMudmFsdWU7IC8vIE9ubHkgYm90aGVyIGZldGNoaW5nIGRlZmF1bHQgdmFsdWUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIGl0XG5cbiAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nICcgKyAnY2hpbGRyZW4gb24gPHRleHRhcmVhPi4nKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBub2RlLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKGluaXRpYWxWYWx1ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy5kZWZhdWx0VmFsdWUpO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgdmFyIG5ld1ZhbHVlID0gdG9TdHJpbmcodmFsdWUpOyAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKGRlZmF1bHRWYWx1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMyhlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG5cbiAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG5cbiAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgaWYgKHRleHRDb250ZW50ICE9PSAnJyAmJiB0ZXh0Q29udGVudCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gIHVwZGF0ZVdyYXBwZXIkMShlbGVtZW50LCBwcm9wcyk7XG59XG5cbnZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbnZhciBNQVRIX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJztcbnZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJzsgLy8gQXNzdW1lcyB0aGVyZSBpcyBubyBwYXJlbnQgbmFtZXNwYWNlLlxuXG5mdW5jdGlvbiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSkge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdzdmcnOlxuICAgICAgcmV0dXJuIFNWR19OQU1FU1BBQ0U7XG5cbiAgICBjYXNlICdtYXRoJzpcbiAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkTmFtZXNwYWNlKHBhcmVudE5hbWVzcGFjZSwgdHlwZSkge1xuICBpZiAocGFyZW50TmFtZXNwYWNlID09IG51bGwgfHwgcGFyZW50TmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuXG4gICAgcmV0dXJuIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IFNWR19OQU1FU1BBQ0UgJiYgdHlwZSA9PT0gJ2ZvcmVpZ25PYmplY3QnKSB7XG4gICAgLy8gV2UncmUgbGVhdmluZyBTVkcuXG4gICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9IC8vIEJ5IGRlZmF1bHQsIHBhc3MgbmFtZXNwYWNlIGJlbG93LlxuXG5cbiAgcmV0dXJuIHBhcmVudE5hbWVzcGFjZTtcbn1cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcwLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxufTtcblxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IFNWR19OQU1FU1BBQ0UpIHtcblxuICAgIGlmICghKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgICAgIC8vIG5ldyBtYXJrdXAgaW4gYSB0ZW1wIG5vZGUgYW5kIHRoZW4gbW92ZSB0aGUgY2hpbGQgbm9kZXMgYWNyb3NzIGludG9cbiAgICAgIC8vIHRoZSB0YXJnZXQgbm9kZVxuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sLnZhbHVlT2YoKS50b1N0cmluZygpICsgJzwvc3ZnPic7XG4gICAgICB2YXIgc3ZnTm9kZSA9IHJldXNhYmxlU1ZHQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbn0pO1xuXG4vKipcbiAqIEhUTUwgbm9kZVR5cGUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIG9mIHRoZSBub2RlXG4gKi9cbnZhciBFTEVNRU5UX05PREUgPSAxO1xudmFyIFRFWFRfTk9ERSA9IDM7XG52YXIgQ09NTUVOVF9OT0RFID0gODtcbnZhciBET0NVTUVOVF9OT0RFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUuIEZvciB0ZXh0IHVwZGF0ZXMsIGl0J3MgZmFzdGVyXG4gKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZ1xuICogYC50ZXh0Q29udGVudGAgd2hpY2ggd2lsbCByZW1vdmUgdGhlIGV4aXN0aW5nIG5vZGUgYW5kIGNyZWF0ZSBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHtcbiAgaWYgKHRleHQpIHtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcblxuICAgIGlmIChmaXJzdENoaWxkICYmIGZpcnN0Q2hpbGQgPT09IG5vZGUubGFzdENoaWxkICYmIGZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuLy8gTGlzdCBkZXJpdmVkIGZyb20gR2Vja28gc291cmNlIGNvZGU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi80ZTYzOGVmYzcxL2xheW91dC9zdHlsZS90ZXN0L3Byb3BlcnR5X2RhdGFiYXNlLmpzXG52YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHtcbiAgYW5pbWF0aW9uOiBbJ2FuaW1hdGlvbkRlbGF5JywgJ2FuaW1hdGlvbkRpcmVjdGlvbicsICdhbmltYXRpb25EdXJhdGlvbicsICdhbmltYXRpb25GaWxsTW9kZScsICdhbmltYXRpb25JdGVyYXRpb25Db3VudCcsICdhbmltYXRpb25OYW1lJywgJ2FuaW1hdGlvblBsYXlTdGF0ZScsICdhbmltYXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICBiYWNrZ3JvdW5kOiBbJ2JhY2tncm91bmRBdHRhY2htZW50JywgJ2JhY2tncm91bmRDbGlwJywgJ2JhY2tncm91bmRDb2xvcicsICdiYWNrZ3JvdW5kSW1hZ2UnLCAnYmFja2dyb3VuZE9yaWdpbicsICdiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknLCAnYmFja2dyb3VuZFJlcGVhdCcsICdiYWNrZ3JvdW5kU2l6ZSddLFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sXG4gIGJvcmRlcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCcsICdib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tFbmQ6IFsnYm9yZGVyQmxvY2tFbmRDb2xvcicsICdib3JkZXJCbG9ja0VuZFN0eWxlJywgJ2JvcmRlckJsb2NrRW5kV2lkdGgnXSxcbiAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLFxuICBib3JkZXJCb3R0b206IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnXSxcbiAgYm9yZGVyQ29sb3I6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyVG9wQ29sb3InXSxcbiAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sXG4gIGJvcmRlcklubGluZUVuZDogWydib3JkZXJJbmxpbmVFbmRDb2xvcicsICdib3JkZXJJbmxpbmVFbmRTdHlsZScsICdib3JkZXJJbmxpbmVFbmRXaWR0aCddLFxuICBib3JkZXJJbmxpbmVTdGFydDogWydib3JkZXJJbmxpbmVTdGFydENvbG9yJywgJ2JvcmRlcklubGluZVN0YXJ0U3R5bGUnLCAnYm9yZGVySW5saW5lU3RhcnRXaWR0aCddLFxuICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sXG4gIGJvcmRlclJhZGl1czogWydib3JkZXJCb3R0b21MZWZ0UmFkaXVzJywgJ2JvcmRlckJvdHRvbVJpZ2h0UmFkaXVzJywgJ2JvcmRlclRvcExlZnRSYWRpdXMnLCAnYm9yZGVyVG9wUmlnaHRSYWRpdXMnXSxcbiAgYm9yZGVyUmlnaHQ6IFsnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJSaWdodFN0eWxlJywgJ2JvcmRlclJpZ2h0V2lkdGgnXSxcbiAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSxcbiAgYm9yZGVyVG9wOiBbJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGJvcmRlcldpZHRoOiBbJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcFdpZHRoJ10sXG4gIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSxcbiAgY29sdW1uczogWydjb2x1bW5Db3VudCcsICdjb2x1bW5XaWR0aCddLFxuICBmbGV4OiBbJ2ZsZXhCYXNpcycsICdmbGV4R3JvdycsICdmbGV4U2hyaW5rJ10sXG4gIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSxcbiAgZm9udDogWydmb250RmFtaWx5JywgJ2ZvbnRGZWF0dXJlU2V0dGluZ3MnLCAnZm9udEtlcm5pbmcnLCAnZm9udExhbmd1YWdlT3ZlcnJpZGUnLCAnZm9udFNpemUnLCAnZm9udFNpemVBZGp1c3QnLCAnZm9udFN0cmV0Y2gnLCAnZm9udFN0eWxlJywgJ2ZvbnRWYXJpYW50JywgJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nLCAnZm9udFdlaWdodCcsICdsaW5lSGVpZ2h0J10sXG4gIGZvbnRWYXJpYW50OiBbJ2ZvbnRWYXJpYW50QWx0ZXJuYXRlcycsICdmb250VmFyaWFudENhcHMnLCAnZm9udFZhcmlhbnRFYXN0QXNpYW4nLCAnZm9udFZhcmlhbnRMaWdhdHVyZXMnLCAnZm9udFZhcmlhbnROdW1lcmljJywgJ2ZvbnRWYXJpYW50UG9zaXRpb24nXSxcbiAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZDogWydncmlkQXV0b0NvbHVtbnMnLCAnZ3JpZEF1dG9GbG93JywgJ2dyaWRBdXRvUm93cycsICdncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgZ3JpZEFyZWE6IFsnZ3JpZENvbHVtbkVuZCcsICdncmlkQ29sdW1uU3RhcnQnLCAnZ3JpZFJvd0VuZCcsICdncmlkUm93U3RhcnQnXSxcbiAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLFxuICBncmlkQ29sdW1uR2FwOiBbJ2NvbHVtbkdhcCddLFxuICBncmlkR2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSxcbiAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkUm93R2FwOiBbJ3Jvd0dhcCddLFxuICBncmlkVGVtcGxhdGU6IFsnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sXG4gIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sXG4gIG1hcmdpbjogWydtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Ub3AnXSxcbiAgbWFya2VyOiBbJ21hcmtlckVuZCcsICdtYXJrZXJNaWQnLCAnbWFya2VyU3RhcnQnXSxcbiAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sXG4gIG1hc2tQb3NpdGlvbjogWydtYXNrUG9zaXRpb25YJywgJ21hc2tQb3NpdGlvblknXSxcbiAgb3V0bGluZTogWydvdXRsaW5lQ29sb3InLCAnb3V0bGluZVN0eWxlJywgJ291dGxpbmVXaWR0aCddLFxuICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sXG4gIHBhZGRpbmc6IFsncGFkZGluZ0JvdHRvbScsICdwYWRkaW5nTGVmdCcsICdwYWRkaW5nUmlnaHQnLCAncGFkZGluZ1RvcCddLFxuICBwbGFjZUNvbnRlbnQ6IFsnYWxpZ25Db250ZW50JywgJ2p1c3RpZnlDb250ZW50J10sXG4gIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSxcbiAgcGxhY2VTZWxmOiBbJ2FsaWduU2VsZicsICdqdXN0aWZ5U2VsZiddLFxuICB0ZXh0RGVjb3JhdGlvbjogWyd0ZXh0RGVjb3JhdGlvbkNvbG9yJywgJ3RleHREZWNvcmF0aW9uTGluZScsICd0ZXh0RGVjb3JhdGlvblN0eWxlJ10sXG4gIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLFxuICB0cmFuc2l0aW9uOiBbJ3RyYW5zaXRpb25EZWxheScsICd0cmFuc2l0aW9uRHVyYXRpb24nLCAndHJhbnNpdGlvblByb3BlcnR5JywgJ3RyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiddLFxuICB3b3JkV3JhcDogWydvdmVyZmxvd1dyYXAnXVxufTtcblxuLyoqXG4gKiBDU1MgcHJvcGVydGllcyB3aGljaCBhY2NlcHQgbnVtYmVycyBidXQgYXJlIG5vdCBpbiB1bml0cyBvZiBcInB4XCIuXG4gKi9cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYXNwZWN0UmF0aW86IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGNvbHVtbnM6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkQXJlYTogdHJ1ZSxcbiAgZ3JpZFJvdzogdHJ1ZSxcbiAgZ3JpZFJvd0VuZDogdHJ1ZSxcbiAgZ3JpZFJvd1NwYW46IHRydWUsXG4gIGdyaWRSb3dTdGFydDogdHJ1ZSxcbiAgZ3JpZENvbHVtbjogdHJ1ZSxcbiAgZ3JpZENvbHVtbkVuZDogdHJ1ZSxcbiAgZ3JpZENvbHVtblNwYW46IHRydWUsXG4gIGdyaWRDb2x1bW5TdGFydDogdHJ1ZSxcbiAgZm9udFdlaWdodDogdHJ1ZSxcbiAgbGluZUNsYW1wOiB0cnVlLFxuICBsaW5lSGVpZ2h0OiB0cnVlLFxuICBvcGFjaXR5OiB0cnVlLFxuICBvcmRlcjogdHJ1ZSxcbiAgb3JwaGFuczogdHJ1ZSxcbiAgdGFiU2l6ZTogdHJ1ZSxcbiAgd2lkb3dzOiB0cnVlLFxuICB6SW5kZXg6IHRydWUsXG4gIHpvb206IHRydWUsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhblxuLy8gaW5maW5pdGUgbG9vcCwgYmVjYXVzZSBpdCBpdGVyYXRlcyBvdmVyIHRoZSBuZXdseSBhZGRlZCBwcm9wcyB0b28uXG5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWBcbiAqIHNob3VsZCBiZSBsb2dpY2FsIChubyBoeXBoZW5zKSwgYXMgc3BlY2lmaWVkXG4gKiBpbiBgQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcmAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIHByb3BlcnR5IG5hbWUgc3VjaCBhcyBgdG9wTWFyZ2luYC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQ1NTIHByb3BlcnR5IHZhbHVlIHN1Y2ggYXMgYDEwcHhgLlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5cbmZ1bmN0aW9uIGRhbmdlcm91c1N0eWxlVmFsdWUobmFtZSwgdmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcblxuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICghaXNDdXN0b21Qcm9wZXJ0eSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSAwICYmICEoaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7IC8vIFByZXN1bWVzIGltcGxpY2l0ICdweCcgc3VmZml4IGZvciB1bml0bGVzcyBudW1iZXJzXG4gIH1cblxuICB7XG4gICAgY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgfVxuXG4gIHJldHVybiAoJycgKyB2YWx1ZSkudHJpbSgpO1xufVxuXG52YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG52YXIgbXNQYXR0ZXJuID0gL15tcy0vO1xuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxudmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gJ21zVHJhbnNmb3JtJyBpcyBjb3JyZWN0LCBidXQgdGhlIG90aGVyIHByZWZpeGVzIHNob3VsZCBiZSBjYXBpdGFsaXplZFxuICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vO1xuICB2YXIgbXNQYXR0ZXJuJDEgPSAvXi1tcy0vO1xuICB2YXIgaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7IC8vIHN0eWxlIHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvblxuXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcbiAgdmFyIHdhcm5lZFN0eWxlTmFtZXMgPSB7fTtcbiAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307XG4gIHZhciB3YXJuZWRGb3JOYU5WYWx1ZSA9IGZhbHNlO1xuICB2YXIgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IGZhbHNlO1xuXG4gIHZhciBjYW1lbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3Rlcikge1xuICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICAgIC8vIChodHRwOi8vd3d3LmFuZGlzbWl0aC5jb20vYmxvZy8yMDEyLzAyL21vZGVybml6ci1wcmVmaXhlZC8pLCBhbiBgLW1zYCBwcmVmaXhcbiAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSkpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG5cbiAgICBlcnJvcihcIlN0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuJ3QgY29udGFpbiBhIHNlbWljb2xvbi4gXCIgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZEZvck5hTlZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRGb3JJbmZpbml0eVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7XG5cbiAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7XG4gIH07XG5cbiAgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUkMSA9IHdhcm5WYWxpZFN0eWxlO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBDU1MgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgY3JlYXRlcyBhIHN0cmluZyB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHN0eWxlXG4gKiBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGJ5IHNlcnZlci1zaWRlIHJlbmRlcmluZy4gSXQgYnktcGFzc2VzIHdhcm5pbmdzIGFuZFxuICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW5cbiAqIGNvbXBhcmlzb24uIEl0IGlzIG9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhzdHlsZXMpIHtcbiAge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgdmFyIGRlbGltaXRlciA9ICcnO1xuXG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRlbGltaXRlciArIChpc0N1c3RvbVByb3BlcnR5ID8gc3R5bGVOYW1lIDogaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSkpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgICAgZGVsaW1pdGVyID0gJzsnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJpYWxpemVkIHx8IG51bGw7XG4gIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICogJycgKGVtcHR5IHN0cmluZyksIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IHdpbGwgYmUgdW5zZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gc3R5bGVzXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JTdHlsZXMobm9kZSwgc3R5bGVzKSB7XG4gIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG5cbiAgICB7XG4gICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUkMShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgaXNDdXN0b21Qcm9wZXJ0eSk7XG5cbiAgICBpZiAoc3R5bGVOYW1lID09PSAnZmxvYXQnKSB7XG4gICAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICAgIH1cblxuICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShzdHlsZU5hbWUsIHN0eWxlVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbn1cbi8qKlxuICogR2l2ZW4ge2NvbG9yOiAncmVkJywgb3ZlcmZsb3c6ICdoaWRkZW4nfSByZXR1cm5zIHtcbiAqICAgY29sb3I6ICdjb2xvcicsXG4gKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JyxcbiAqICAgb3ZlcmZsb3dZOiAnb3ZlcmZsb3cnLFxuICogfS4gVGhpcyBjYW4gYmUgcmVhZCBhcyBcInRoZSBvdmVyZmxvd1kgcHJvcGVydHkgd2FzIHNldCBieSB0aGUgb3ZlcmZsb3dcbiAqIHNob3J0aGFuZFwiLiBUaGF0IGlzLCB0aGUgdmFsdWVzIGFyZSB0aGUgcHJvcGVydHkgdGhhdCBlYWNoIHdhcyBkZXJpdmVkIGZyb20uXG4gKi9cblxuXG5mdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVzKSB7XG4gIHZhciBleHBhbmRlZCA9IHt9O1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGFuZGVkW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZGVkO1xufVxuLyoqXG4gKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmXG4gKiB3ZSBleHBlY3QgYW4gaW5jb3JyZWN0IHJlc3VsdCB0byBvY2N1ci4gSW4gcGFydGljdWxhciwgd2Ugd2FybiBmb3I6XG4gKlxuICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdiYXonLCBmb250VmFyaWFudDogJ2Jhcid9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnQgPSAnYmF6J1xuICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOlxuICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICcnXG4gKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2Zvbyd9XG4gKiAgIGJlY29tZXMgLnN0eWxlLmZvbnRWYXJpYW50ID0gJydcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRTdHlsZXMpIHtcbiAge1xuICAgIGlmICghbmV4dFN0eWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTtcbiAgICB2YXIgZXhwYW5kZWRTdHlsZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAobmV4dFN0eWxlcyk7XG4gICAgdmFyIHdhcm5lZEFib3V0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gZXhwYW5kZWRVcGRhdGVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTtcbiAgICAgIHZhciBjb3JyZWN0T3JpZ2luYWxLZXkgPSBleHBhbmRlZFN0eWxlc1trZXldO1xuXG4gICAgICBpZiAoY29ycmVjdE9yaWdpbmFsS2V5ICYmIG9yaWdpbmFsS2V5ICE9PSBjb3JyZWN0T3JpZ2luYWxLZXkpIHtcbiAgICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvcmlnaW5hbEtleSArICcsJyArIGNvcnJlY3RPcmlnaW5hbEtleTtcblxuICAgICAgICBpZiAod2FybmVkQWJvdXRbd2FybmluZ0tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhcm5lZEFib3V0W3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXMgYSBzdHlsZSBwcm9wZXJ0eSBkdXJpbmcgcmVyZW5kZXIgKCVzKSB3aGVuIGEgJyArICdjb25mbGljdGluZyBwcm9wZXJ0eSBpcyBzZXQgKCVzKSBjYW4gbGVhZCB0byBzdHlsaW5nIGJ1Z3MuIFRvICcgKyBcImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyBcIiArICdmb3IgdGhlIHNhbWUgdmFsdWU7IGluc3RlYWQsIHJlcGxhY2UgdGhlIHNob3J0aGFuZCB3aXRoICcgKyAnc2VwYXJhdGUgdmFsdWVzLicsIGlzVmFsdWVFbXB0eShzdHlsZVVwZGF0ZXNbb3JpZ2luYWxLZXldKSA/ICdSZW1vdmluZycgOiAnVXBkYXRpbmcnLCBvcmlnaW5hbEtleSwgY29ycmVjdE9yaWdpbmFsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvclxuLy8gdGhvc2Ugc3BlY2lhbC1jYXNlIHRhZ3MuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgYXJlYTogdHJ1ZSxcbiAgYmFzZTogdHJ1ZSxcbiAgYnI6IHRydWUsXG4gIGNvbDogdHJ1ZSxcbiAgZW1iZWQ6IHRydWUsXG4gIGhyOiB0cnVlLFxuICBpbWc6IHRydWUsXG4gIGlucHV0OiB0cnVlLFxuICBrZXlnZW46IHRydWUsXG4gIGxpbms6IHRydWUsXG4gIG1ldGE6IHRydWUsXG4gIHBhcmFtOiB0cnVlLFxuICBzb3VyY2U6IHRydWUsXG4gIHRyYWNrOiB0cnVlLFxuICB3YnI6IHRydWUgLy8gTk9URTogbWVudWl0ZW0ncyBjbG9zZSB0YWcgc2hvdWxkIGJlIG9taXR0ZWQsIGJ1dCB0aGF0IGNhdXNlcyBwcm9ibGVtcy5cblxufTtcblxuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKHByb3BzLmNoaWxkcmVuICE9IG51bGwgfHwgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZyArIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgXCIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSAnb2JqZWN0JyB8fCAhKEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHN0eWxlYCBwcm9wIGV4cGVjdHMgYSBtYXBwaW5nIGZyb20gc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMsICcgKyBcIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiBcIiArICd1c2luZyBKU1guJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgaWYgKHRhZ05hbWUuaW5kZXhPZignLScpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgLy8gVGhlc2UgYXJlIHJlc2VydmVkIFNWRyBhbmQgTWF0aE1MIGVsZW1lbnRzLlxuICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuXG4gICAgLy8gVGhlIGFsdGVybmF0aXZlIGlzIHRvIHRyYWNrIHRoZSBuYW1lc3BhY2UgaW4gYSBmZXcgcGxhY2VzIHdoaWNoIGlzIGNvbnZvbHV0ZWQuXG4gICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9jdXN0b20vI2N1c3RvbS1lbGVtZW50cy1jb3JlLWNvbmNlcHRzXG4gICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOlxuICAgIGNhc2UgJ2NvbG9yLXByb2ZpbGUnOlxuICAgIGNhc2UgJ2ZvbnQtZmFjZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6XG4gICAgY2FzZSAnZm9udC1mYWNlLXVyaSc6XG4gICAgY2FzZSAnZm9udC1mYWNlLWZvcm1hdCc6XG4gICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOlxuICAgIGNhc2UgJ21pc3NpbmctZ2x5cGgnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhlIEhUTUwgb3IgU1ZHIGFsbG93ZWQgYXR0cmlidXRlIGxpc3QsIGJlIHN1cmUgdG9cbi8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWVcbi8vIHdhcm5pbmdzLlxudmFyIHBvc3NpYmxlU3RhbmRhcmROYW1lcyA9IHtcbiAgLy8gSFRNTFxuICBhY2NlcHQ6ICdhY2NlcHQnLFxuICBhY2NlcHRjaGFyc2V0OiAnYWNjZXB0Q2hhcnNldCcsXG4gICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JyxcbiAgYWNjZXNza2V5OiAnYWNjZXNzS2V5JyxcbiAgYWN0aW9uOiAnYWN0aW9uJyxcbiAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJyxcbiAgYWx0OiAnYWx0JyxcbiAgYXM6ICdhcycsXG4gIGFzeW5jOiAnYXN5bmMnLFxuICBhdXRvY2FwaXRhbGl6ZTogJ2F1dG9DYXBpdGFsaXplJyxcbiAgYXV0b2NvbXBsZXRlOiAnYXV0b0NvbXBsZXRlJyxcbiAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsXG4gIGF1dG9mb2N1czogJ2F1dG9Gb2N1cycsXG4gIGF1dG9wbGF5OiAnYXV0b1BsYXknLFxuICBhdXRvc2F2ZTogJ2F1dG9TYXZlJyxcbiAgY2FwdHVyZTogJ2NhcHR1cmUnLFxuICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJyxcbiAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsXG4gIGNoYWxsZW5nZTogJ2NoYWxsZW5nZScsXG4gIGNoYXJzZXQ6ICdjaGFyU2V0JyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjaGlsZHJlbjogJ2NoaWxkcmVuJyxcbiAgY2l0ZTogJ2NpdGUnLFxuICBjbGFzczogJ2NsYXNzTmFtZScsXG4gIGNsYXNzaWQ6ICdjbGFzc0lEJyxcbiAgY2xhc3NuYW1lOiAnY2xhc3NOYW1lJyxcbiAgY29sczogJ2NvbHMnLFxuICBjb2xzcGFuOiAnY29sU3BhbicsXG4gIGNvbnRlbnQ6ICdjb250ZW50JyxcbiAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJyxcbiAgY29udGV4dG1lbnU6ICdjb250ZXh0TWVudScsXG4gIGNvbnRyb2xzOiAnY29udHJvbHMnLFxuICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLFxuICBjb29yZHM6ICdjb29yZHMnLFxuICBjcm9zc29yaWdpbjogJ2Nyb3NzT3JpZ2luJyxcbiAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsXG4gIGRhdGE6ICdkYXRhJyxcbiAgZGF0ZXRpbWU6ICdkYXRlVGltZScsXG4gIGRlZmF1bHQ6ICdkZWZhdWx0JyxcbiAgZGVmYXVsdGNoZWNrZWQ6ICdkZWZhdWx0Q2hlY2tlZCcsXG4gIGRlZmF1bHR2YWx1ZTogJ2RlZmF1bHRWYWx1ZScsXG4gIGRlZmVyOiAnZGVmZXInLFxuICBkaXI6ICdkaXInLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsXG4gIGRpc2FibGVyZW1vdGVwbGF5YmFjazogJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsXG4gIGRvd25sb2FkOiAnZG93bmxvYWQnLFxuICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLFxuICBlbmN0eXBlOiAnZW5jVHlwZScsXG4gIGVudGVya2V5aGludDogJ2VudGVyS2V5SGludCcsXG4gIGZvcjogJ2h0bWxGb3InLFxuICBmb3JtOiAnZm9ybScsXG4gIGZvcm1tZXRob2Q6ICdmb3JtTWV0aG9kJyxcbiAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLFxuICBmb3JtZW5jdHlwZTogJ2Zvcm1FbmNUeXBlJyxcbiAgZm9ybW5vdmFsaWRhdGU6ICdmb3JtTm9WYWxpZGF0ZScsXG4gIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JyxcbiAgZnJhbWVib3JkZXI6ICdmcmFtZUJvcmRlcicsXG4gIGhlYWRlcnM6ICdoZWFkZXJzJyxcbiAgaGVpZ2h0OiAnaGVpZ2h0JyxcbiAgaGlkZGVuOiAnaGlkZGVuJyxcbiAgaGlnaDogJ2hpZ2gnLFxuICBocmVmOiAnaHJlZicsXG4gIGhyZWZsYW5nOiAnaHJlZkxhbmcnLFxuICBodG1sZm9yOiAnaHRtbEZvcicsXG4gIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsXG4gICdodHRwLWVxdWl2JzogJ2h0dHBFcXVpdicsXG4gIGljb246ICdpY29uJyxcbiAgaWQ6ICdpZCcsXG4gIGltYWdlc2l6ZXM6ICdpbWFnZVNpemVzJyxcbiAgaW1hZ2VzcmNzZXQ6ICdpbWFnZVNyY1NldCcsXG4gIGlubmVyaHRtbDogJ2lubmVySFRNTCcsXG4gIGlucHV0bW9kZTogJ2lucHV0TW9kZScsXG4gIGludGVncml0eTogJ2ludGVncml0eScsXG4gIGlzOiAnaXMnLFxuICBpdGVtaWQ6ICdpdGVtSUQnLFxuICBpdGVtcHJvcDogJ2l0ZW1Qcm9wJyxcbiAgaXRlbXJlZjogJ2l0ZW1SZWYnLFxuICBpdGVtc2NvcGU6ICdpdGVtU2NvcGUnLFxuICBpdGVtdHlwZTogJ2l0ZW1UeXBlJyxcbiAga2V5cGFyYW1zOiAna2V5UGFyYW1zJyxcbiAga2V5dHlwZTogJ2tleVR5cGUnLFxuICBraW5kOiAna2luZCcsXG4gIGxhYmVsOiAnbGFiZWwnLFxuICBsYW5nOiAnbGFuZycsXG4gIGxpc3Q6ICdsaXN0JyxcbiAgbG9vcDogJ2xvb3AnLFxuICBsb3c6ICdsb3cnLFxuICBtYW5pZmVzdDogJ21hbmlmZXN0JyxcbiAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsXG4gIG1hcmdpbmhlaWdodDogJ21hcmdpbkhlaWdodCcsXG4gIG1heDogJ21heCcsXG4gIG1heGxlbmd0aDogJ21heExlbmd0aCcsXG4gIG1lZGlhOiAnbWVkaWEnLFxuICBtZWRpYWdyb3VwOiAnbWVkaWFHcm91cCcsXG4gIG1ldGhvZDogJ21ldGhvZCcsXG4gIG1pbjogJ21pbicsXG4gIG1pbmxlbmd0aDogJ21pbkxlbmd0aCcsXG4gIG11bHRpcGxlOiAnbXVsdGlwbGUnLFxuICBtdXRlZDogJ211dGVkJyxcbiAgbmFtZTogJ25hbWUnLFxuICBub21vZHVsZTogJ25vTW9kdWxlJyxcbiAgbm9uY2U6ICdub25jZScsXG4gIG5vdmFsaWRhdGU6ICdub1ZhbGlkYXRlJyxcbiAgb3BlbjogJ29wZW4nLFxuICBvcHRpbXVtOiAnb3B0aW11bScsXG4gIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsXG4gIHBsYXlzaW5saW5lOiAncGxheXNJbmxpbmUnLFxuICBwb3N0ZXI6ICdwb3N0ZXInLFxuICBwcmVsb2FkOiAncHJlbG9hZCcsXG4gIHByb2ZpbGU6ICdwcm9maWxlJyxcbiAgcmFkaW9ncm91cDogJ3JhZGlvR3JvdXAnLFxuICByZWFkb25seTogJ3JlYWRPbmx5JyxcbiAgcmVmZXJyZXJwb2xpY3k6ICdyZWZlcnJlclBvbGljeScsXG4gIHJlbDogJ3JlbCcsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICByZXZlcnNlZDogJ3JldmVyc2VkJyxcbiAgcm9sZTogJ3JvbGUnLFxuICByb3dzOiAncm93cycsXG4gIHJvd3NwYW46ICdyb3dTcGFuJyxcbiAgc2FuZGJveDogJ3NhbmRib3gnLFxuICBzY29wZTogJ3Njb3BlJyxcbiAgc2NvcGVkOiAnc2NvcGVkJyxcbiAgc2Nyb2xsaW5nOiAnc2Nyb2xsaW5nJyxcbiAgc2VhbWxlc3M6ICdzZWFtbGVzcycsXG4gIHNlbGVjdGVkOiAnc2VsZWN0ZWQnLFxuICBzaGFwZTogJ3NoYXBlJyxcbiAgc2l6ZTogJ3NpemUnLFxuICBzaXplczogJ3NpemVzJyxcbiAgc3BhbjogJ3NwYW4nLFxuICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsXG4gIHNyYzogJ3NyYycsXG4gIHNyY2RvYzogJ3NyY0RvYycsXG4gIHNyY2xhbmc6ICdzcmNMYW5nJyxcbiAgc3Jjc2V0OiAnc3JjU2V0JyxcbiAgc3RhcnQ6ICdzdGFydCcsXG4gIHN0ZXA6ICdzdGVwJyxcbiAgc3R5bGU6ICdzdHlsZScsXG4gIHN1bW1hcnk6ICdzdW1tYXJ5JyxcbiAgdGFiaW5kZXg6ICd0YWJJbmRleCcsXG4gIHRhcmdldDogJ3RhcmdldCcsXG4gIHRpdGxlOiAndGl0bGUnLFxuICB0eXBlOiAndHlwZScsXG4gIHVzZW1hcDogJ3VzZU1hcCcsXG4gIHZhbHVlOiAndmFsdWUnLFxuICB3aWR0aDogJ3dpZHRoJyxcbiAgd21vZGU6ICd3bW9kZScsXG4gIHdyYXA6ICd3cmFwJyxcbiAgLy8gU1ZHXG4gIGFib3V0OiAnYWJvdXQnLFxuICBhY2NlbnRoZWlnaHQ6ICdhY2NlbnRIZWlnaHQnLFxuICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAnYWNjdW11bGF0ZScsXG4gIGFkZGl0aXZlOiAnYWRkaXRpdmUnLFxuICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgJ2FsaWdubWVudC1iYXNlbGluZSc6ICdhbGlnbm1lbnRCYXNlbGluZScsXG4gIGFsbG93cmVvcmRlcjogJ2FsbG93UmVvcmRlcicsXG4gIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJyxcbiAgYW1wbGl0dWRlOiAnYW1wbGl0dWRlJyxcbiAgYXJhYmljZm9ybTogJ2FyYWJpY0Zvcm0nLFxuICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsXG4gIGFzY2VudDogJ2FzY2VudCcsXG4gIGF0dHJpYnV0ZW5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvcmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogJ2F6aW11dGgnLFxuICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VsaW5lc2hpZnQ6ICdiYXNlbGluZVNoaWZ0JyxcbiAgJ2Jhc2VsaW5lLXNoaWZ0JzogJ2Jhc2VsaW5lU2hpZnQnLFxuICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmJveDogJ2Jib3gnLFxuICBiZWdpbjogJ2JlZ2luJyxcbiAgYmlhczogJ2JpYXMnLFxuICBieTogJ2J5JyxcbiAgY2FsY21vZGU6ICdjYWxjTW9kZScsXG4gIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsXG4gICdjYXAtaGVpZ2h0JzogJ2NhcEhlaWdodCcsXG4gIGNsaXA6ICdjbGlwJyxcbiAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsXG4gICdjbGlwLXBhdGgnOiAnY2xpcFBhdGgnLFxuICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNsaXBydWxlOiAnY2xpcFJ1bGUnLFxuICAnY2xpcC1ydWxlJzogJ2NsaXBSdWxlJyxcbiAgY29sb3I6ICdjb2xvcicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gICdjb2xvci1pbnRlcnBvbGF0aW9uJzogJ2NvbG9ySW50ZXJwb2xhdGlvbicsXG4gIGNvbG9yaW50ZXJwb2xhdGlvbmZpbHRlcnM6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJyxcbiAgY29sb3Jwcm9maWxlOiAnY29sb3JQcm9maWxlJyxcbiAgJ2NvbG9yLXByb2ZpbGUnOiAnY29sb3JQcm9maWxlJyxcbiAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsXG4gICdjb2xvci1yZW5kZXJpbmcnOiAnY29sb3JSZW5kZXJpbmcnLFxuICBjb250ZW50c2NyaXB0dHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6ICdjdXJzb3InLFxuICBjeDogJ2N4JyxcbiAgY3k6ICdjeScsXG4gIGQ6ICdkJyxcbiAgZGF0YXR5cGU6ICdkYXRhdHlwZScsXG4gIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJyxcbiAgZGVzY2VudDogJ2Rlc2NlbnQnLFxuICBkaWZmdXNlY29uc3RhbnQ6ICdkaWZmdXNlQ29uc3RhbnQnLFxuICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLFxuICBkaXNwbGF5OiAnZGlzcGxheScsXG4gIGRpdmlzb3I6ICdkaXZpc29yJyxcbiAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLFxuICAnZG9taW5hbnQtYmFzZWxpbmUnOiAnZG9taW5hbnRCYXNlbGluZScsXG4gIGR1cjogJ2R1cicsXG4gIGR4OiAnZHgnLFxuICBkeTogJ2R5JyxcbiAgZWRnZW1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsXG4gIGVuYWJsZWJhY2tncm91bmQ6ICdlbmFibGVCYWNrZ3JvdW5kJyxcbiAgJ2VuYWJsZS1iYWNrZ3JvdW5kJzogJ2VuYWJsZUJhY2tncm91bmQnLFxuICBlbmQ6ICdlbmQnLFxuICBleHBvbmVudDogJ2V4cG9uZW50JyxcbiAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAnZmlsbCcsXG4gIGZpbGxvcGFjaXR5OiAnZmlsbE9wYWNpdHknLFxuICAnZmlsbC1vcGFjaXR5JzogJ2ZpbGxPcGFjaXR5JyxcbiAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsXG4gICdmaWxsLXJ1bGUnOiAnZmlsbFJ1bGUnLFxuICBmaWx0ZXI6ICdmaWx0ZXInLFxuICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RvcGFjaXR5OiAnZmxvb2RPcGFjaXR5JyxcbiAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JyxcbiAgZmxvb2Rjb2xvcjogJ2Zsb29kQ29sb3InLFxuICAnZmxvb2QtY29sb3InOiAnZmxvb2RDb2xvcicsXG4gIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsXG4gIGZvbnRmYW1pbHk6ICdmb250RmFtaWx5JyxcbiAgJ2ZvbnQtZmFtaWx5JzogJ2ZvbnRGYW1pbHknLFxuICBmb250c2l6ZTogJ2ZvbnRTaXplJyxcbiAgJ2ZvbnQtc2l6ZSc6ICdmb250U2l6ZScsXG4gIGZvbnRzaXplYWRqdXN0OiAnZm9udFNpemVBZGp1c3QnLFxuICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsXG4gIGZvbnRzdHJldGNoOiAnZm9udFN0cmV0Y2gnLFxuICAnZm9udC1zdHJldGNoJzogJ2ZvbnRTdHJldGNoJyxcbiAgZm9udHN0eWxlOiAnZm9udFN0eWxlJyxcbiAgJ2ZvbnQtc3R5bGUnOiAnZm9udFN0eWxlJyxcbiAgZm9udHZhcmlhbnQ6ICdmb250VmFyaWFudCcsXG4gICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLFxuICBmb250d2VpZ2h0OiAnZm9udFdlaWdodCcsXG4gICdmb250LXdlaWdodCc6ICdmb250V2VpZ2h0JyxcbiAgZm9ybWF0OiAnZm9ybWF0JyxcbiAgZnJvbTogJ2Zyb20nLFxuICBmeDogJ2Z4JyxcbiAgZnk6ICdmeScsXG4gIGcxOiAnZzEnLFxuICBnMjogJ2cyJyxcbiAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJyxcbiAgJ2dseXBoLW5hbWUnOiAnZ2x5cGhOYW1lJyxcbiAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6ICdnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbCcsXG4gICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJzogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsXG4gIGdseXBocmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnR1bml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAnaGFuZ2luZycsXG4gIGhvcml6YWR2eDogJ2hvcml6QWR2WCcsXG4gICdob3Jpei1hZHYteCc6ICdob3JpekFkdlgnLFxuICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLFxuICAnaG9yaXotb3JpZ2luLXgnOiAnaG9yaXpPcmlnaW5YJyxcbiAgaWRlb2dyYXBoaWM6ICdpZGVvZ3JhcGhpYycsXG4gIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICAnaW1hZ2UtcmVuZGVyaW5nJzogJ2ltYWdlUmVuZGVyaW5nJyxcbiAgaW4yOiAnaW4yJyxcbiAgaW46ICdpbicsXG4gIGlubGlzdDogJ2lubGlzdCcsXG4gIGludGVyY2VwdDogJ2ludGVyY2VwdCcsXG4gIGsxOiAnazEnLFxuICBrMjogJ2syJyxcbiAgazM6ICdrMycsXG4gIGs0OiAnazQnLFxuICBrOiAnaycsXG4gIGtlcm5lbG1hdHJpeDogJ2tlcm5lbE1hdHJpeCcsXG4gIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJyxcbiAga2VybmluZzogJ2tlcm5pbmcnLFxuICBrZXlwb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleXRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhhZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsXG4gICdsZXR0ZXItc3BhY2luZyc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgbGlnaHRpbmdjb2xvcjogJ2xpZ2h0aW5nQ29sb3InLFxuICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsXG4gIGxpbWl0aW5nY29uZWFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogJ2xvY2FsJyxcbiAgbWFya2VyZW5kOiAnbWFya2VyRW5kJyxcbiAgJ21hcmtlci1lbmQnOiAnbWFya2VyRW5kJyxcbiAgbWFya2VyaGVpZ2h0OiAnbWFya2VySGVpZ2h0JyxcbiAgbWFya2VybWlkOiAnbWFya2VyTWlkJyxcbiAgJ21hcmtlci1taWQnOiAnbWFya2VyTWlkJyxcbiAgbWFya2Vyc3RhcnQ6ICdtYXJrZXJTdGFydCcsXG4gICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLFxuICBtYXJrZXJ1bml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2Vyd2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6ICdtYXNrJyxcbiAgbWFza2NvbnRlbnR1bml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLFxuICBtb2RlOiAnbW9kZScsXG4gIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAnb2Zmc2V0JyxcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBvcGVyYXRvcjogJ29wZXJhdG9yJyxcbiAgb3JkZXI6ICdvcmRlcicsXG4gIG9yaWVudDogJ29yaWVudCcsXG4gIG9yaWVudGF0aW9uOiAnb3JpZW50YXRpb24nLFxuICBvcmlnaW46ICdvcmlnaW4nLFxuICBvdmVyZmxvdzogJ292ZXJmbG93JyxcbiAgb3ZlcmxpbmVwb3NpdGlvbjogJ292ZXJsaW5lUG9zaXRpb24nLFxuICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gIG92ZXJsaW5ldGhpY2tuZXNzOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICAnb3ZlcmxpbmUtdGhpY2tuZXNzJzogJ292ZXJsaW5lVGhpY2tuZXNzJyxcbiAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLFxuICAncGFpbnQtb3JkZXInOiAncGFpbnRPcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UxJyxcbiAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLFxuICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gIHBhdHRlcm5jb250ZW50dW5pdHM6ICdwYXR0ZXJuQ29udGVudFVuaXRzJyxcbiAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLFxuICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICBwb2ludGVyZXZlbnRzOiAncG9pbnRlckV2ZW50cycsXG4gICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJyxcbiAgcG9pbnRzOiAncG9pbnRzJyxcbiAgcG9pbnRzYXR4OiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzYXR6OiAncG9pbnRzQXRaJyxcbiAgcHJlZml4OiAncHJlZml4JyxcbiAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZXVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICBwcm9wZXJ0eTogJ3Byb3BlcnR5JyxcbiAgcjogJ3InLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuICByZWZ4OiAncmVmWCcsXG4gIHJlZnk6ICdyZWZZJyxcbiAgcmVuZGVyaW5naW50ZW50OiAncmVuZGVyaW5nSW50ZW50JyxcbiAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JyxcbiAgcmVwZWF0Y291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdGR1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkZmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzb3VyY2U6ICdyZXNvdXJjZScsXG4gIHJlc3RhcnQ6ICdyZXN0YXJ0JyxcbiAgcmVzdWx0OiAncmVzdWx0JyxcbiAgcmVzdWx0czogJ3Jlc3VsdHMnLFxuICByb3RhdGU6ICdyb3RhdGUnLFxuICByeDogJ3J4JyxcbiAgcnk6ICdyeScsXG4gIHNjYWxlOiAnc2NhbGUnLFxuICBzZWN1cml0eTogJ3NlY3VyaXR5JyxcbiAgc2VlZDogJ3NlZWQnLFxuICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgJ3NoYXBlLXJlbmRlcmluZyc6ICdzaGFwZVJlbmRlcmluZycsXG4gIHNsb3BlOiAnc2xvcGUnLFxuICBzcGFjaW5nOiAnc3BhY2luZycsXG4gIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJleHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogJ3NwZWVkJyxcbiAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRvZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAnc3RlbWgnLFxuICBzdGVtdjogJ3N0ZW12JyxcbiAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3Bjb2xvcjogJ3N0b3BDb2xvcicsXG4gICdzdG9wLWNvbG9yJzogJ3N0b3BDb2xvcicsXG4gIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLFxuICAnc3RvcC1vcGFjaXR5JzogJ3N0b3BPcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaHBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJyxcbiAgc3RyaWtldGhyb3VnaHRoaWNrbmVzczogJ3N0cmlrZXRocm91Z2hUaGlja25lc3MnLFxuICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gIHN0cmluZzogJ3N0cmluZycsXG4gIHN0cm9rZTogJ3N0cm9rZScsXG4gIHN0cm9rZWRhc2hhcnJheTogJ3N0cm9rZURhc2hhcnJheScsXG4gICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsXG4gIHN0cm9rZWRhc2hvZmZzZXQ6ICdzdHJva2VEYXNob2Zmc2V0JyxcbiAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsXG4gICdzdHJva2UtbGluZWNhcCc6ICdzdHJva2VMaW5lY2FwJyxcbiAgc3Ryb2tlbGluZWpvaW46ICdzdHJva2VMaW5lam9pbicsXG4gICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLFxuICBzdHJva2VtaXRlcmxpbWl0OiAnc3Ryb2tlTWl0ZXJsaW1pdCcsXG4gICdzdHJva2UtbWl0ZXJsaW1pdCc6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2Utd2lkdGgnOiAnc3Ryb2tlV2lkdGgnLFxuICBzdHJva2VvcGFjaXR5OiAnc3Ryb2tlT3BhY2l0eScsXG4gICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JyxcbiAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJyxcbiAgc3VwcHJlc3NoeWRyYXRpb253YXJuaW5nOiAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJyxcbiAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJyxcbiAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gIHRhYmxldmFsdWVzOiAndGFibGVWYWx1ZXMnLFxuICB0YXJnZXR4OiAndGFyZ2V0WCcsXG4gIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgdGV4dGFuY2hvcjogJ3RleHRBbmNob3InLFxuICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsXG4gIHRleHRkZWNvcmF0aW9uOiAndGV4dERlY29yYXRpb24nLFxuICAndGV4dC1kZWNvcmF0aW9uJzogJ3RleHREZWNvcmF0aW9uJyxcbiAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0ZXh0cmVuZGVyaW5nOiAndGV4dFJlbmRlcmluZycsXG4gICd0ZXh0LXJlbmRlcmluZyc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgdG86ICd0bycsXG4gIHRyYW5zZm9ybTogJ3RyYW5zZm9ybScsXG4gIHR5cGVvZjogJ3R5cGVvZicsXG4gIHUxOiAndTEnLFxuICB1MjogJ3UyJyxcbiAgdW5kZXJsaW5lcG9zaXRpb246ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLFxuICB1bmRlcmxpbmV0aGlja25lc3M6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICAndW5kZXJsaW5lLXRoaWNrbmVzcyc6ICd1bmRlcmxpbmVUaGlja25lc3MnLFxuICB1bmljb2RlOiAndW5pY29kZScsXG4gIHVuaWNvZGViaWRpOiAndW5pY29kZUJpZGknLFxuICAndW5pY29kZS1iaWRpJzogJ3VuaWNvZGVCaWRpJyxcbiAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJyxcbiAgJ3VuaWNvZGUtcmFuZ2UnOiAndW5pY29kZVJhbmdlJyxcbiAgdW5pdHNwZXJlbTogJ3VuaXRzUGVyRW0nLFxuICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLFxuICB1bnNlbGVjdGFibGU6ICd1bnNlbGVjdGFibGUnLFxuICB2YWxwaGFiZXRpYzogJ3ZBbHBoYWJldGljJyxcbiAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsXG4gIHZhbHVlczogJ3ZhbHVlcycsXG4gIHZlY3RvcmVmZmVjdDogJ3ZlY3RvckVmZmVjdCcsXG4gICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsXG4gIHZlcnNpb246ICd2ZXJzaW9uJyxcbiAgdmVydGFkdnk6ICd2ZXJ0QWR2WScsXG4gICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJyxcbiAgdmVydG9yaWdpbng6ICd2ZXJ0T3JpZ2luWCcsXG4gICd2ZXJ0LW9yaWdpbi14JzogJ3ZlcnRPcmlnaW5YJyxcbiAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsXG4gICd2ZXJ0LW9yaWdpbi15JzogJ3ZlcnRPcmlnaW5ZJyxcbiAgdmhhbmdpbmc6ICd2SGFuZ2luZycsXG4gICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLFxuICB2aWRlb2dyYXBoaWM6ICd2SWRlb2dyYXBoaWMnLFxuICAndi1pZGVvZ3JhcGhpYyc6ICd2SWRlb2dyYXBoaWMnLFxuICB2aWV3Ym94OiAndmlld0JveCcsXG4gIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogJ3Zpc2liaWxpdHknLFxuICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsXG4gICd2LW1hdGhlbWF0aWNhbCc6ICd2TWF0aGVtYXRpY2FsJyxcbiAgdm9jYWI6ICd2b2NhYicsXG4gIHdpZHRoczogJ3dpZHRocycsXG4gIHdvcmRzcGFjaW5nOiAnd29yZFNwYWNpbmcnLFxuICAnd29yZC1zcGFjaW5nJzogJ3dvcmRTcGFjaW5nJyxcbiAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsXG4gICd3cml0aW5nLW1vZGUnOiAnd3JpdGluZ01vZGUnLFxuICB4MTogJ3gxJyxcbiAgeDI6ICd4MicsXG4gIHg6ICd4JyxcbiAgeGNoYW5uZWxzZWxlY3RvcjogJ3hDaGFubmVsU2VsZWN0b3InLFxuICB4aGVpZ2h0OiAneEhlaWdodCcsXG4gICd4LWhlaWdodCc6ICd4SGVpZ2h0JyxcbiAgeGxpbmthY3R1YXRlOiAneGxpbmtBY3R1YXRlJyxcbiAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJyxcbiAgeGxpbmthcmNyb2xlOiAneGxpbmtBcmNyb2xlJyxcbiAgJ3hsaW5rOmFyY3JvbGUnOiAneGxpbmtBcmNyb2xlJyxcbiAgeGxpbmtocmVmOiAneGxpbmtIcmVmJyxcbiAgJ3hsaW5rOmhyZWYnOiAneGxpbmtIcmVmJyxcbiAgeGxpbmtyb2xlOiAneGxpbmtSb2xlJyxcbiAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJyxcbiAgeGxpbmtzaG93OiAneGxpbmtTaG93JyxcbiAgJ3hsaW5rOnNob3cnOiAneGxpbmtTaG93JyxcbiAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLFxuICAneGxpbms6dGl0bGUnOiAneGxpbmtUaXRsZScsXG4gIHhsaW5rdHlwZTogJ3hsaW5rVHlwZScsXG4gICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsXG4gIHhtbGJhc2U6ICd4bWxCYXNlJyxcbiAgJ3htbDpiYXNlJzogJ3htbEJhc2UnLFxuICB4bWxsYW5nOiAneG1sTGFuZycsXG4gICd4bWw6bGFuZyc6ICd4bWxMYW5nJyxcbiAgeG1sbnM6ICd4bWxucycsXG4gICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLFxuICB4bWxuc3hsaW5rOiAneG1sbnNYbGluaycsXG4gICd4bWxuczp4bGluayc6ICd4bWxuc1hsaW5rJyxcbiAgeG1sc3BhY2U6ICd4bWxTcGFjZScsXG4gIHkxOiAneTEnLFxuICB5MjogJ3kyJyxcbiAgeTogJ3knLFxuICB5Y2hhbm5lbHNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6ICd6JyxcbiAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nXG59O1xuXG52YXIgYXJpYVByb3BlcnRpZXMgPSB7XG4gICdhcmlhLWN1cnJlbnQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1kZXNjcmlwdGlvbic6IDAsXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJBUklBQ2FtZWwudGVzdChuYW1lKSkge1xuICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjb3JyZWN0TmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGFyaWFOYW1lKSA/IGFyaWFOYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgICAvLyBET00gcHJvcGVydGllcywgdGhlbiBpdCBpcyBhbiBpbnZhbGlkIGFyaWEtKiBhdHRyaWJ1dGUuXG5cbiAgICAgIGlmIChjb3JyZWN0TmFtZSA9PSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBjb3JyZWN0TmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBjb3JyZWN0TmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSA9PSBudWxsKSB7XG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuXG5cbiAgICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5JbnZhbGlkQVJJQVByb3BzKHR5cGUsIHByb3BzKSB7XG4gIHtcbiAgICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSh0eXBlLCBrZXkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpO1xufVxuXG52YXIgZGlkV2FyblZhbHVlTnVsbCA9IGZhbHNlO1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDEodHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIGlmICh0eXBlICE9PSAnaW5wdXQnICYmIHR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkge1xuICAgICAgZGlkV2FyblZhbHVlTnVsbCA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IGFycmF5IHdoZW4gYG11bHRpcGxlYCBpcyBzZXQgdG8gYHRydWVgICcgKyAndG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFByb3BlcnRpZXMkMSwgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllcyQxW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3VzaW4nIHx8IGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c291dCcpIHtcbiAgICAgIGVycm9yKCdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXZSBjYW4ndCByZWx5IG9uIHRoZSBldmVudCBzeXN0ZW0gYmVpbmcgaW5qZWN0ZWQgb24gdGhlIHNlcnZlci5cblxuXG4gICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSBldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IGV2ZW50UmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIEl0IHdpbGwgYmUgaWdub3JlZC4nLCBuYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFNvIHdlIGNhbid0IHRlbGwgaWYgdGhlIGV2ZW50IG5hbWUgaXMgY29ycmVjdCBmb3Igc3VyZSwgYnV0IHdlIGNhbiBmaWx0ZXJcbiAgICAgIC8vIG91dCBrbm93biBiYWQgb25lcyBsaWtlIGBvbmNsaWNrYC4gV2UgY2FuJ3Qgc3VnZ2VzdCBhIHNwZWNpZmljIHJlcGxhY2VtZW50IHRob3VnaC5cbiAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuICcgKyAnUmVhY3QgZXZlbnRzIHVzZSB0aGUgY2FtZWxDYXNlIG5hbWluZyBjb252ZW50aW9uLCBmb3IgZXhhbXBsZSBgb25DbGlja2AuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIExldCB0aGUgQVJJQSBhdHRyaWJ1dGUgaG9vayB2YWxpZGF0ZSBBUklBIGF0dHJpYnV0ZXNcblxuXG4gICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaW5uZXJodG1sJykge1xuICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2FyaWEnKSB7XG4gICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnaXMnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcbiAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuXG5cbiAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV07XG5cbiAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG5hbWUpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHN0YW5kYXJkTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZCAmJiBuYW1lICE9PSBsb3dlckNhc2VkTmFtZSkge1xuICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5XG4gICAgICAvLyB3aWxsIGJlIGNhc2VkIGFueXdheSB3aXRoIHNlcnZlciByZW5kZXJpbmcuXG4gICAgICBlcnJvcignUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91ICcgKyAnaW50ZW50aW9uYWxseSB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgRE9NIGFzIGEgY3VzdG9tICcgKyAnYXR0cmlidXRlLCBzcGVsbCBpdCBhcyBsb3dlcmNhc2UgYCVzYCBpbnN0ZWFkLiAnICsgJ0lmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgJyArICdpdCBmcm9tIHRoZSBET00gZWxlbWVudC4nLCBuYW1lLCBsb3dlckNhc2VkTmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgJiYgc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXFxuXFxuJyArICdJZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICcgKyAnJXM9XCIlc1wiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSwgbmFtZSwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIE5vdyB0aGF0IHdlJ3ZlIHZhbGlkYXRlZCBjYXNpbmcsIGRvIG5vdCB2YWxpZGF0ZVxuICAgIC8vIGRhdGEgdHlwZXMgZm9yIHJlc2VydmVkIHByb3BzXG5cblxuICAgIGlmIChpc1Jlc2VydmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlXG5cblxuICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBXYXJuIHdoZW4gcGFzc2luZyB0aGUgc3RyaW5ncyAnZmFsc2UnIG9yICd0cnVlJyBpbnRvIGEgYm9vbGVhbiBwcm9wXG5cblxuICAgIGlmICgodmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICd0cnVlJykgJiYgcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgdGhlIHN0cmluZyBgJXNgIGZvciB0aGUgYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC4gJyArICclcyAnICsgJ0RpZCB5b3UgbWVhbiAlcz17JXN9PycsIHZhbHVlLCBuYW1lLCB2YWx1ZSA9PT0gJ2ZhbHNlJyA/ICdUaGUgYnJvd3NlciB3aWxsIGludGVycHJldCBpdCBhcyBhIHRydXRoeSB2YWx1ZS4nIDogJ0FsdGhvdWdoIHRoaXMgd29ya3MsIGl0IHdpbGwgbm90IHdvcmsgYXMgZXhwZWN0ZWQgaWYgeW91IHBhc3MgdGhlIHN0cmluZyBcImZhbHNlXCIuJywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAge1xuICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5LCBwcm9wc1trZXldLCBldmVudFJlZ2lzdHJ5KTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gICAgfSkuam9pbignLCAnKTtcblxuICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSBpdCBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICBpZiAoaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTtcbn1cblxudmFyIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFID0gMTtcbnZhciBJU19OT05fREVMRUdBVEVEID0gMSA8PCAxO1xudmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7XG4vLyBzZXQgdG8gTEVHQUNZX0ZCX1NVUFBPUlQuIExFR0FDWV9GQl9TVVBQT1JUIG9ubHkgZ2V0cyBzZXQgd2hlblxuLy8gd2UgY2FsbCB3aWxsRGVmZXJMYXRlckZvckxlZ2FjeUZCU3VwcG9ydCwgdGh1cyBub3QgYmFpbGluZyBvdXRcbi8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC5cbi8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBkZWZlciBkdXJpbmcgZXZlbnQgcmVwbGF5aW5nLlxuXG52YXIgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMgPSBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSB8IElTX05PTl9ERUxFR0FURUQgfCBJU19DQVBUVVJFX1BIQVNFO1xuXG4vLyBUaGlzIGV4aXN0cyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gUmVhY3RET01FdmVudFJlcGxheWluZ1xuLy8gYW5kIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxudmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7XG5mdW5jdGlvbiBzZXRSZXBsYXlpbmdFdmVudChldmVudCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gYmUgbnVsbC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xufVxuZnVuY3Rpb24gcmVzZXRSZXBsYXlpbmdFdmVudCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50UmVwbGF5aW5nRXZlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIG5vdCBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50ID09PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDZcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdzsgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH0gLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcblxuXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IFRFWFRfTk9ERSA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG52YXIgcmVzdG9yZUltcGwgPSBudWxsO1xudmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xudmFyIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCkge1xuICAvLyBXZSBwZXJmb3JtIHRoaXMgdHJhbnNsYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgbG9vcCBzbyB0aGF0IHdlXG4gIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmVcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKHRhcmdldCk7XG5cbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgLy8gVW5tb3VudGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN0b3JlSW1wbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCAnICsgJ2V2ZW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuXG5cbiAgaWYgKHN0YXRlTm9kZSkge1xuICAgIHZhciBfcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgICByZXN0b3JlSW1wbChpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSwgaW50ZXJuYWxJbnN0YW5jZS50eXBlLCBfcHJvcHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gIHJlc3RvcmVJbXBsID0gaW1wbDtcbn1cbmZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7XG4gIGlmIChyZXN0b3JlVGFyZ2V0KSB7XG4gICAgaWYgKHJlc3RvcmVRdWV1ZSkge1xuICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdG9yZVF1ZXVlID0gW3RhcmdldF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQ7XG4gIH1cbn1cbmZ1bmN0aW9uIG5lZWRzU3RhdGVSZXN0b3JlKCkge1xuICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiByZXN0b3JlU3RhdGVJZk5lZWRlZCgpIHtcbiAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRhcmdldCA9IHJlc3RvcmVUYXJnZXQ7XG4gIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlO1xuICByZXN0b3JlVGFyZ2V0ID0gbnVsbDtcbiAgcmVzdG9yZVF1ZXVlID0gbnVsbDtcbiAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTtcblxuICBpZiAocXVldWVkVGFyZ2V0cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWVkVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQocXVldWVkVGFyZ2V0c1tpXSk7XG4gICAgfVxuICB9XG59XG5cbi8vIHRoZSByZW5kZXJlci4gU3VjaCBhcyB3aGVuIHdlJ3JlIGRpc3BhdGNoaW5nIGV2ZW50cyBvciBpZiB0aGlyZCBwYXJ0eVxuLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW5cbi8vIGV2ZXJ5dGhpbmcgaXMgYmF0Y2hlZCBieSBkZWZhdWx0LiBXZSdsbCB0aGVuIGhhdmUgYSBzaW1pbGFyIEFQSSB0byBvcHQtb3V0IG9mXG4vLyBzY2hlZHVsZWQgd29yayBhbmQgaW5zdGVhZCBkbyBzeW5jaHJvbm91cyB3b3JrLlxuLy8gRGVmYXVsdHNcblxudmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHtcbiAgcmV0dXJuIGZuKGJvb2trZWVwaW5nKTtcbn07XG5cbnZhciBmbHVzaFN5bmNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmaW5pc2hFdmVudEhhbmRsZXIoKSB7XG4gIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudFxuICAvLyB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAgdmFyIGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzID0gbmVlZHNTdGF0ZVJlc3RvcmUoKTtcblxuICBpZiAoY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMpIHtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZWQgZXZlbnQgd2FzIGZpcmVkLCB3ZSBtYXkgbmVlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZlxuICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0XG4gICAgLy8gYmFpbHMgb3V0IG9mIHRoZSB1cGRhdGUgd2l0aG91dCB0b3VjaGluZyB0aGUgRE9NLlxuICAgIC8vIFRPRE86IFJlc3RvcmUgc3RhdGUgaW4gdGhlIG1pY3JvdGFzaywgYWZ0ZXIgdGhlIGRpc2NyZXRlIHVwZGF0ZXMgZmx1c2gsXG4gICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuXG4gICAgZmx1c2hTeW5jSW1wbCgpO1xuICAgIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0XG4gICAgLy8gZnVsbHkgY29tcGxldGVzIGJlZm9yZSByZXN0b3Jpbmcgc3RhdGUuXG4gICAgcmV0dXJuIGZuKGEsIGIpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTtcbiAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgfVxufSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jXG5mdW5jdGlvbiBzZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKF9iYXRjaGVkVXBkYXRlc0ltcGwsIF9kaXNjcmV0ZVVwZGF0ZXNJbXBsLCBfZmx1c2hTeW5jSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VFbnRlcic6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTtcblxuICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcyAoZXg6IG9ubG9hZCBldmVudHMgaW4gaW5jcmVtZW50YWwgbW9kZSkuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7XG5cbiAgaWYgKHByb3BzID09PSBudWxsKSB7XG4gICAgLy8gV29yayBpbiBwcm9ncmVzcy5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuXG4gIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVyICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGBcIiArIHJlZ2lzdHJhdGlvbk5hbWUgKyBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgKyB0eXBlb2YgbGlzdGVuZXIgKyBcImAgdHlwZS5cIik7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbnZhciBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlOyAvLyBDaGVjayBpZiBicm93c2VyIHN1cHBvcnQgZXZlbnRzIHdpdGggcGFzc2l2ZSBsaXN0ZW5lcnNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnRcblxuaWYgKGNhblVzZURPTSkge1xuICB0cnkge1xuICAgIHZhciBvcHRpb25zID0ge307IC8vICRGbG93Rml4TWU6IElnbm9yZSBGbG93IGNvbXBsYWluaW5nIGFib3V0IG5lZWRpbmcgYSB2YWx1ZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMsICdwYXNzaXZlJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gIHRyeSB7XG4gICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7XG5cbntcbiAgLy8gSW4gREVWIG1vZGUsIHdlIHN3YXAgb3V0IGludm9rZUd1YXJkZWRDYWxsYmFjayBmb3IgYSBzcGVjaWFsIHZlcnNpb25cbiAgLy8gdGhhdCBwbGF5cyBtb3JlIG5pY2VseSB3aXRoIHRoZSBicm93c2VyJ3MgRGV2VG9vbHMuIFRoZSBpZGVhIGlzIHRvIHByZXNlcnZlXG4gIC8vIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLiBCZWNhdXNlIFJlYWN0IHdyYXBzIGFsbCB1c2VyLXByb3ZpZGVkXG4gIC8vIGZ1bmN0aW9ucyBpbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssIGFuZCB0aGUgcHJvZHVjdGlvbiB2ZXJzaW9uIG9mXG4gIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkXG4gIC8vIGxpa2UgY2F1Z2h0IGV4Y2VwdGlvbnMsIGFuZCB0aGUgRGV2VG9vbHMgd29uJ3QgcGF1c2UgdW5sZXNzIHRoZSBkZXZlbG9wZXJcbiAgLy8gdGFrZXMgdGhlIGV4dHJhIHN0ZXAgb2YgZW5hYmxpbmcgcGF1c2Ugb24gY2F1Z2h0IGV4Y2VwdGlvbnMuIFRoaXMgaXNcbiAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbVxuICAvLyB0aGUgZGV2ZWxvcGVyJ3MgcGVyc3BlY3RpdmUsIHRoZSBlcnJvciBpcyB1bmNhdWdodC5cbiAgLy9cbiAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkIFwiUGF1c2Ugb24gZXhjZXB0aW9uc1wiIGJlaGF2aW9yLCB3ZSBkb24ndCB1c2UgYVxuICAvLyB0cnktY2F0Y2ggaW4gREVWLiBJbnN0ZWFkLCB3ZSBzeW5jaHJvbm91c2x5IGRpc3BhdGNoIGEgZmFrZSBldmVudCB0byBhIGZha2VcbiAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXJcbiAgLy8gZm9yIHRoYXQgZmFrZSBldmVudC4gSWYgdGhlIGNhbGxiYWNrIHRocm93cywgdGhlIGVycm9yIGlzIFwiY2FwdHVyZWRcIiB1c2luZ1xuICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudFxuICAvLyBldmVudCBsb29wIGNvbnRleHQsIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgbm9ybWFsIHByb2dyYW0gZmxvdy5cbiAgLy8gRWZmZWN0aXZlbHksIHRoaXMgZ2l2ZXMgdXMgdHJ5LWNhdGNoIGJlaGF2aW9yIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmdcbiAgLy8gdHJ5LWNhdGNoLiBOZWF0IVxuICAvLyBDaGVjayB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBzcGVjaWFsXG4gIC8vIERFViB2ZXJzaW9uIG9mIGludm9rZUd1YXJkZWRDYWxsYmFja1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcblxuICAgIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBmdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tEZXYobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICAgLy8gSWYgZG9jdW1lbnQgZG9lc24ndCBleGlzdCB3ZSBrbm93IGZvciBzdXJlIHdlIHdpbGwgY3Jhc2ggaW4gdGhpcyBtZXRob2RcbiAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZ1xuICAgICAgLy8gZXJyb3JzOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9pc3N1ZXMvMzQ4MlxuICAgICAgLy8gU28gd2UgcHJlZW1wdGl2ZWx5IHRocm93IHdpdGggYSBiZXR0ZXIgbWVzc2FnZSBpbnN0ZWFkLlxuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgJyArICdkZWZpbmVkIGFueW1vcmUuIFRoaXMgY2FuIGhhcHBlbiBpbiBhIHRlc3QgZW52aXJvbm1lbnQgaWYgYSBjb21wb25lbnQgJyArICdzY2hlZHVsZXMgYW4gdXBkYXRlIGZyb20gYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrLCBidXQgdGhlIHRlc3QgaGFzIGFscmVhZHkgJyArICdmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgJyArICd0aGUgZW5kIG9mIHlvdXIgdGVzdCAoYW5kIGVuc3VyZSB0aGF0IGFueSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBnZXQgJyArICdjYW5jZWxlZCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgKSwgb3IgeW91IGNhbiBjaGFuZ2UgdGhlIHRlc3QgaXRzZWxmICcgKyAndG8gYmUgYXN5bmNocm9ub3VzLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZVxuICAgICAgLy8gc2V0IHRoaXMgdG8gdHJ1ZSBhdCB0aGUgYmVnaW5uaW5nLCB0aGVuIHNldCBpdCB0byBmYWxzZSByaWdodCBhZnRlclxuICAgICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBlcnJvcnMsIGBkaWRFcnJvcmAgd2lsbCBuZXZlciBiZVxuICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kXG4gICAgICAvLyBmYWlscyB0byBjYWxsIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlciwgYmVjYXVzZSBpdCBkb2Vzbid0IHJlbHkgb25cbiAgICAgIC8vIHRoZSBlcnJvciBldmVudCBhdCBhbGwuXG5cbiAgICAgIHZhciBkaWRFcnJvciA9IHRydWU7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZSBvZiB3aW5kb3cuZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgaXRcbiAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZVxuICAgICAgLy8gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0LlxuXG4gICAgICB2YXIgd2luZG93RXZlbnQgPSB3aW5kb3cuZXZlbnQ7IC8vIEtlZXBzIHRyYWNrIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHdpbmRvdy5ldmVudCB0byByZXN0b3JlIGl0IGFmdGVyIGV2ZW50XG4gICAgICAvLyBkaXNwYXRjaGluZzogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzY4OFxuXG4gICAgICB2YXIgd2luZG93RXZlbnREZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdldmVudCcpO1xuXG4gICAgICBmdW5jdGlvbiByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpIHtcbiAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0XG4gICAgICAgIC8vIG5lc3RlZCBgaW52b2tlR3VhcmRlZENhbGxiYWNrYCBjYWxscyBkbyBub3QgY2xhc2guIE90aGVyd2lzZSwgYVxuICAgICAgICAvLyBuZXN0ZWQgY2FsbCB3b3VsZCB0cmlnZ2VyIHRoZSBmYWtlIGV2ZW50IGhhbmRsZXJzIG9mIGFueSBjYWxsIGhpZ2hlclxuICAgICAgICAvLyBpbiB0aGUgc3RhY2suXG4gICAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFdlIGNoZWNrIGZvciB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykgdG8gcHJldmVudCB0aGVcbiAgICAgICAgLy8gd2luZG93LmV2ZW50IGFzc2lnbm1lbnQgaW4gYm90aCBJRSA8PSAxMCBhcyB0aGV5IHRocm93IGFuIGVycm9yXG4gICAgICAgIC8vIFwiTWVtYmVyIG5vdCBmb3VuZFwiIGluIHN0cmljdCBtb2RlLCBhbmQgaW4gRmlyZWZveCB3aGljaCBkb2VzIG5vdFxuICAgICAgICAvLyBzdXBwb3J0IHdpbmRvdy5ldmVudC5cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5ldmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpKSB7XG4gICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIG91ciBmYWtlIGV2ZW50LiBXZSB3aWxsIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZVxuICAgICAgLy8gY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjay5cblxuXG4gICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpO1xuXG4gICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7XG4gICAgICAgIGRpZENhbGwgPSB0cnVlO1xuICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpO1xuICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgICAgICAgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ3JlYXRlIGEgZ2xvYmFsIGVycm9yIGV2ZW50IGhhbmRsZXIuIFdlIHVzZSB0aGlzIHRvIGNhcHR1cmUgdGhlIHZhbHVlXG4gICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmVcbiAgICAgIC8vIHRoYW4gb25jZTsgZm9yIGV4YW1wbGUsIGlmIG5vbi1SZWFjdCBjb2RlIGFsc28gY2FsbHMgYGRpc3BhdGNoRXZlbnRgXG4gICAgICAvLyBhbmQgYSBoYW5kbGVyIGZvciB0aGF0IGV2ZW50IHRocm93cy4gV2Ugc2hvdWxkIGJlIHJlc2lsaWVudCB0byBtb3N0IG9mXG4gICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlXG4gICAgICAvLyBsYXN0IGVycm9yIGV2ZW50IGlzIGFsd2F5cyB1c2VkLiBJZiB0aGUgY2FsbGJhY2sgYWN0dWFsbHkgZG9lcyBlcnJvcixcbiAgICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBlcnJvciBldmVudCBpcyB0aGUgY29ycmVjdCBvbmUsIGJlY2F1c2UgaXQncyBub3RcbiAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2tcbiAgICAgIC8vIGVycm9yaW5nIGFuZCB0aGUgY29kZSB0aGF0IGZvbGxvd3MgdGhlIGBkaXNwYXRjaEV2ZW50YCBjYWxsIGJlbG93LiBJZlxuICAgICAgLy8gdGhlIGNhbGxiYWNrIGRvZXNuJ3QgZXJyb3IsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgd2FzIGZpcmVkLCB3ZSBrbm93IHRvXG4gICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS5cblxuXG4gICAgICB2YXIgZXJyb3I7IC8vIFVzZSB0aGlzIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGVycm9yIGV2ZW50IGlzIGV2ZXIgY2FsbGVkLlxuXG4gICAgICB2YXIgZGlkU2V0RXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHtcbiAgICAgICAgZXJyb3IgPSBldmVudC5lcnJvcjtcbiAgICAgICAgZGlkU2V0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCAmJiBldmVudC5jb2xubyA9PT0gMCAmJiBldmVudC5saW5lbm8gPT09IDApIHtcbiAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAvLyBTb21lIG90aGVyIGVycm9yIGhhbmRsZXIgaGFzIHByZXZlbnRlZCBkZWZhdWx0LlxuICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuXG4gICAgICAgICAgLy8gV2UnbGwgcmVtZW1iZXIgdGhpcyB0byBsYXRlciBkZWNpZGUgd2hldGhlciB0byBsb2cgaXQgb3Igbm90LlxuICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHsvLyBJZ25vcmUuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS5cblxuXG4gICAgICB2YXIgZXZ0VHlwZSA9IFwicmVhY3QtXCIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnNcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gU3luY2hyb25vdXNseSBkaXNwYXRjaCBvdXIgZmFrZSBldmVudC4gSWYgdGhlIHVzZXItcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgIC8vIGVycm9ycywgaXQgd2lsbCB0cmlnZ2VyIG91ciBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuXG4gICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdldmVudCcsIHdpbmRvd0V2ZW50RGVzY3JpcHRvcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWRDYWxsICYmIGRpZEVycm9yKSB7XG4gICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgZXJyb3JlZCwgYnV0IHRoZSBlcnJvciBldmVudCBuZXZlciBmaXJlZC5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArIFwiZG9lc24ndCBrbm93IHdoYXQgaXQgd2FzLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gYnJvd3NlciBcIiArICdmbGFraW5lc3MuIFJlYWN0IGRvZXMgaXRzIGJlc3QgdG8gcHJlc2VydmUgdGhlIFwiUGF1c2Ugb24gJyArICdleGNlcHRpb25zXCIgYmVoYXZpb3Igb2YgdGhlIERldlRvb2xzLCB3aGljaCByZXF1aXJlcyBzb21lICcgKyBcIkRFVi1tb2RlIG9ubHkgdHJpY2tzLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlc2UgZG9uJ3Qgd29yayBpbiBcIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ3Jvc3NPcmlnaW5FcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuXG4gKiBJZiB0aGlzIGJlY29tZXMgYW4gYWN0dWFsIE1hcCwgdGhhdCB3aWxsIGJyZWFrLlxuICovXG5mdW5jdGlvbiBnZXQoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gaGFzKGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscyAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAga2V5Ll9yZWFjdEludGVybmFscyA9IHZhbHVlO1xufVxuXG4vLyBEb24ndCBjaGFuZ2UgdGhlc2UgdHdvIHZhbHVlcy4gVGhleSdyZSB1c2VkIGJ5IFJlYWN0IERldiBUb29scy5cbnZhciBOb0ZsYWdzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIFBlcmZvcm1lZFdvcmsgPVxuLyogICAgICAgICAgICAgICAgKi9cbjE7IC8vIFlvdSBjYW4gY2hhbmdlIHRoZSByZXN0IChhbmQgYWRkIG1vcmUpLlxuXG52YXIgUGxhY2VtZW50ID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBVcGRhdGUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40O1xudmFyIENoaWxkRGVsZXRpb24gPVxuLyogICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIENvbnRlbnRSZXNldCA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjMyO1xudmFyIENhbGxiYWNrID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjY0O1xudmFyIERpZENhcHR1cmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBGb3JjZUNsaWVudFJlbmRlciA9XG4vKiAgICAgICAgICAgICovXG4yNTY7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTEyO1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgUGFzc2l2ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBIeWRyYXRpbmcgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIFZpc2liaWxpdHkgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgU3RvcmVDb25zaXN0ZW5jeSA9XG4vKiAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9IFBhc3NpdmUgfCBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFNuYXBzaG90IHwgU3RvcmVDb25zaXN0ZW5jeTsgLy8gVW5pb24gb2YgYWxsIGNvbW1pdCBmbGFncyAoZmxhZ3Mgd2l0aCB0aGUgbGlmZXRpbWUgb2YgYSBwYXJ0aWN1bGFyIGNvbW1pdClcblxudmFyIEhvc3RFZmZlY3RNYXNrID1cbi8qICAgICAgICAgICAgICAgKi9cbjMyNzY3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMzI3Njg7XG52YXIgU2hvdWxkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSA9XG4vKiAqL1xuMTMxMDcyO1xudmFyIEZvcmtlZCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsXG4vLyBlLmcuIGEgZmliZXIgdXNlcyBhIHBhc3NpdmUgZWZmZWN0IChldmVuIGlmIHRoZXJlIGFyZSBubyB1cGRhdGVzIG9uIHRoaXMgcGFydGljdWxhciByZW5kZXIpLlxuLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRlZmVyIG1vcmUgd29yayBpbiB0aGUgdW5tb3VudCBjYXNlLFxuLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsXG4vLyBhbmQgaW5zdGVhZCByZWx5IG9uIHRoZSBzdGF0aWMgZmxhZyBhcyBhIHNpZ25hbCB0aGF0IHRoZXJlIG1heSBiZSBjbGVhbnVwIHdvcmsuXG5cbnZhciBSZWZTdGF0aWMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yMDk3MTUyO1xudmFyIExheW91dFN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUGFzc2l2ZVN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAqL1xuODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50XG4vLyB3aXRob3V0IHRyYXZlcnNpbmcgdGhlIGVudGlyZSB0cmVlIGFmdGVyIGV2ZXJ5IGNvbW1pdCBmb3Jcbi8vIGRvdWJsZSBpbnZva2luZ1xuXG52YXIgTW91bnRMYXlvdXREZXYgPVxuLyogICAgICAgICAgICAgICAqL1xuMTY3NzcyMTY7XG52YXIgTW91bnRQYXNzaXZlRGV2ID1cbi8qICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7IC8vIEdyb3VwcyBvZiBmbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSBjb21taXQgcGhhc2UgdG8gc2tpcCBvdmVyIHRyZWVzIHRoYXRcbi8vIGRvbid0IGNvbnRhaW4gZWZmZWN0cywgYnkgY2hlY2tpbmcgc3VidHJlZUZsYWdzLlxuXG52YXIgQmVmb3JlTXV0YXRpb25NYXNrID0gLy8gVE9ETzogUmVtb3ZlIFVwZGF0ZSBmbGFnIGZyb20gYmVmb3JlIG11dGF0aW9uIHBoYXNlIGJ5IHJlLWxhbmRpbmcgVmlzaWJpbGl0eVxuLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MylcblVwZGF0ZSB8IFNuYXBzaG90IHwgKCAwKTtcbnZhciBNdXRhdGlvbk1hc2sgPSBQbGFjZW1lbnQgfCBVcGRhdGUgfCBDaGlsZERlbGV0aW9uIHwgQ29udGVudFJlc2V0IHwgUmVmIHwgSHlkcmF0aW5nIHwgVmlzaWJpbGl0eTtcbnZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFza1xuXG52YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuXG4vLyBUaGlzIGFsbG93cyBjZXJ0YWluIGNvbmNlcHRzIHRvIHBlcnNpc3Qgd2l0aG91dCByZWNhbGN1bGF0aW5nIHRoZW0sXG4vLyBlLmcuIHdoZXRoZXIgYSBzdWJ0cmVlIGNvbnRhaW5zIHBhc3NpdmUgZWZmZWN0cyBvciBwb3J0YWxzLlxuXG52YXIgU3RhdGljTWFzayA9IExheW91dFN0YXRpYyB8IFBhc3NpdmVTdGF0aWMgfCBSZWZTdGF0aWM7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xuZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikge1xuICB2YXIgbm9kZSA9IGZpYmVyO1xuICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBmaWJlcjtcblxuICBpZiAoIWZpYmVyLmFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWRcbiAgICAvLyB5ZXQuIElmIGl0IGlzLCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHBlbmRpbmcgaW5zZXJ0aW9uIGVmZmVjdCBvbiBpdC5cbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlO1xuXG4gICAgZG8ge1xuICAgICAgbm9kZSA9IG5leHROb2RlO1xuXG4gICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnNlcnRpb24gb3IgaW4tcHJvZ3Jlc3MgaHlkcmF0aW9uLiBUaGUgbmVhcmVzdCBwb3NzaWJsZVxuICAgICAgICAvLyBtb3VudGVkIGZpYmVyIGlzIHRoZSBwYXJlbnQgYnV0IHdlIG5lZWQgdG8gY29udGludWUgdG8gZmlndXJlIG91dFxuICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLlxuICAgICAgICBuZWFyZXN0TW91bnRlZCA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0Tm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5leHROb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAobm9kZS5yZXR1cm4pIHtcbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS50YWcgPT09IEhvc3RSb290KSB7XG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGhcbiAgICAvLyByZW5kZXJDb250YWluZXJJbnRvU3VidHJlZS5cbiAgICByZXR1cm4gbmVhcmVzdE1vdW50ZWQ7XG4gIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlXG4gIC8vIHRoYXQgaGFzIGJlZW4gdW5tb3VudGVkLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RSb290ID8gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gOiBudWxsO1xufVxuZnVuY3Rpb24gaXNGaWJlck1vdW50ZWQoZmliZXIpIHtcbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cbmZ1bmN0aW9uIGlzTW91bnRlZChjb21wb25lbnQpIHtcbiAge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmIChnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSAhPT0gZmliZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLlxuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXIgb2YgQSBhbmQgdGhlIHJldHVybiBwb2ludGVyIG9mIEIgcG9pbnQgdG8gZGlmZmVyZW50XG4gICAgICAvLyBmaWJlcnMuIFdlIGFzc3VtZSB0aGF0IHJldHVybiBwb2ludGVycyBuZXZlciBjcmlzcy1jcm9zcywgc28gQSBtdXN0XG4gICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkXG4gICAgICAvLyBzZXQgb2YgQi5yZXR1cm4uXG4gICAgICBhID0gcGFyZW50QTtcbiAgICAgIGIgPSBwYXJlbnRCO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmV0dXJuIHBvaW50ZXJzIHBvaW50IHRvIHRoZSBzYW1lIGZpYmVyLiBXZSdsbCBoYXZlIHRvIHVzZSB0aGVcbiAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlXG4gICAgICAvLyB3aGljaCBjaGlsZCBiZWxvbmdzIHRvIHdoaWNoIHNldC5cbiAgICAgIC8vXG4gICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXRcbiAgICAgIHZhciBkaWRGaW5kQ2hpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgYSA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0XG4gICAgICAgIF9jaGlsZCA9IHBhcmVudEIuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKF9jaGlsZCkge1xuICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYikge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlkRmluZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyAnICsgJ2luIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybiBwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLmFsdGVybmF0ZSAhPT0gYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBcIiArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLlxuICAvLyB1bm1vdW50ZWQuXG5cblxuICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGN1cnJlbnRQYXJlbnQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY2hpbGQpO1xuXG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuXG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuICByZXR1cm4gY3VycmVudFBhcmVudCAhPT0gbnVsbCA/IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHtcbiAgLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICBpZiAoY2hpbGQudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTtcblxuICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVGhpcyBtb2R1bGUgb25seSBleGlzdHMgYXMgYW4gRVNNIHdyYXBwZXIgYXJvdW5kIHRoZSBleHRlcm5hbCBDb21tb25KU1xudmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbnZhciBjYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbnZhciBzaG91bGRZaWVsZCA9IFNjaGVkdWxlci51bnN0YWJsZV9zaG91bGRZaWVsZDtcbnZhciByZXF1ZXN0UGFpbnQgPSBTY2hlZHVsZXIudW5zdGFibGVfcmVxdWVzdFBhaW50O1xudmFyIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk7XG52YXIgTG93UHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTG93UHJpb3JpdHk7XG52YXIgSWRsZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0lkbGVQcmlvcml0eTtcbi8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqXG4vLyBvbiBzY2hlZHVsZXIvdW5zdGFibGVfbW9jaywgd2hpY2ggd2UnbGwgbmVlZCBmb3IgaW50ZXJuYWwgdGVzdGluZ1xudmFyIHVuc3RhYmxlX3lpZWxkVmFsdWUgPSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZTtcbnZhciB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTtcblxudmFyIHJlbmRlcmVySUQgPSBudWxsO1xudmFyIGluamVjdGVkSG9vayA9IG51bGw7XG52YXIgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IG51bGw7XG52YXIgaGFzTG9nZ2VkRXJyb3IgPSBmYWxzZTtcbnZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBObyBEZXZUb29sc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gIGlmIChob29rLmlzRGlzYWJsZWQpIHtcbiAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dFxuICAgIC8vIG9mIERldlRvb2xzIGludGVncmF0aW9uIGFuZCBhc3NvY2lhdGVkIHdhcm5pbmdzIGFuZCBsb2dzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzg3N1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpIHtcbiAgICB7XG4gICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgfSAvLyBEZXZUb29scyBleGlzdHMsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGaWJlci5cblxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuXG4gICAgICAvLyBUaGlzIGdpdmVzIERldlRvb2xzIGEgd2F5IHRvIGZlYXR1cmUgZGV0ZWN0IHRoYXQgaXNuJ3QgdGllZCB0byB2ZXJzaW9uIG51bWJlclxuICAgICAgLy8gKHNpbmNlIHByb2ZpbGluZyBhbmQgdGltZWxpbmUgYXJlIGNvbnRyb2xsZWQgYnkgZGlmZmVyZW50IGZlYXR1cmUgZmxhZ3MpLlxuICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHtcbiAgICAgICAgZ2V0TGFuZUxhYmVsTWFwOiBnZXRMYW5lTGFiZWxNYXAsXG4gICAgICAgIGluamVjdFByb2ZpbGluZ0hvb2tzOiBpbmplY3RQcm9maWxpbmdIb29rc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscyk7IC8vIFdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGluamVjdGVkLCBzbyBub3cgaXQgaXMgc2FmZSB0byBzZXQgdXAgaG9va3MuXG5cbiAgICBpbmplY3RlZEhvb2sgPSBob29rO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcy4nLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChob29rLmNoZWNrRENFKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgcmVhbCBEZXZUb29scy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGxpa2VseSBhIGhvb2sgaW5zdGFsbGVkIGJ5IEZhc3QgUmVmcmVzaCBydW50aW1lLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHtcbiAge1xuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCBjaGlsZHJlbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0Um9vdChyb290LCBldmVudFByaW9yaXR5KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZGlkRXJyb3IgPSAocm9vdC5jdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IERpZENhcHR1cmU7XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyKSB7XG4gICAgICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHNjaGVkdWxlclByaW9yaXR5LCBkaWRFcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgdW5kZWZpbmVkLCBkaWRFcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Qb3N0Q29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB7XG4gICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG9uQ29tbWl0VW5tb3VudChmaWJlcikge1xuICBpZiAoaW5qZWN0ZWRIb29rICYmIHR5cGVvZiBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMobmV3SXNTdHJpY3RNb2RlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHVuc3RhYmxlX3lpZWxkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFdlJ3JlIGluIGEgdGVzdCBiZWNhdXNlIFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlIG9ubHkgZXhpc3RzXG4gICAgICAvLyBpbiBTY2hlZHVsZXJNb2NrLiBUbyByZWR1Y2UgdGhlIG5vaXNlIGluIHN0cmljdCBtb2RlIHRlc3RzLFxuICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlclxuICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIHNldFN1cHByZXNzV2FybmluZyhuZXdJc1N0cmljdE1vZGUpO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbmplY3RlZEhvb2suc2V0U3RyaWN0TW9kZShyZW5kZXJlcklELCBuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gUHJvZmlsZXIgQVBJIGhvb2tzXG5cbmZ1bmN0aW9uIGluamVjdFByb2ZpbGluZ0hvb2tzKHByb2ZpbGluZ0hvb2tzKSB7XG4gIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rcztcbn1cblxuZnVuY3Rpb24gZ2V0TGFuZUxhYmVsTWFwKCkge1xuICB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICB2YXIgbGFuZSA9IDE7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgVG90YWxMYW5lczsgaW5kZXgrKykge1xuICAgICAgdmFyIGxhYmVsID0gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpO1xuICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7XG4gICAgICBsYW5lICo9IDI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbW1pdFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZChmaWJlciwgdGhyb3duVmFsdWUsIGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFN1c3BlbmRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkKGZpYmVyLCB3YWtlYWJsZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlcllpZWxkZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIE5vTW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDsgLy8gVE9ETzogUmVtb3ZlIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdCB0YWcgaW5zdGVhZFxuXG52YXIgQ29uY3VycmVudE1vZGUgPVxuLyogICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFByb2ZpbGVNb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBTdHJpY3RMZWdhY3lNb2RlID1cbi8qICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgU3RyaWN0RWZmZWN0c01vZGUgPVxuLyogICAgICAgICAgICAgICovXG4xNjtcblxuLy8gVE9ETzogVGhpcyBpcyBwcmV0dHkgd2VsbCBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMuIE1heWJlIHdlIGNhbiBkcm9wIGl0LlxudmFyIGNsejMyID0gTWF0aC5jbHozMiA/IE1hdGguY2x6MzIgOiBjbHozMkZhbGxiYWNrOyAvLyBDb3VudCBsZWFkaW5nIHplcm9zLlxuLy8gQmFzZWQgb246XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2NsejMyXG5cbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxuZnVuY3Rpb24gY2x6MzJGYWxsYmFjayh4KSB7XG4gIHZhciBhc1VpbnQgPSB4ID4+PiAwO1xuXG4gIGlmIChhc1VpbnQgPT09IDApIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICByZXR1cm4gMzEgLSAobG9nKGFzVWludCkgLyBMTjIgfCAwKSB8IDA7XG59XG5cbi8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuXG5cbnZhciBUb3RhbExhbmVzID0gMzE7XG52YXIgTm9MYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4wO1xudmFyIE5vTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgU3luY0xhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICovXG4yO1xudmFyIElucHV0Q29udGludW91c0xhbmUgPVxuLyogICAgICAgICAgICAgKi9cbjQ7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAqL1xuODtcbnZhciBEZWZhdWx0TGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4xNjtcbnZhciBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE5NDI0MDtcbnZhciBUcmFuc2l0aW9uTGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgVHJhbnNpdGlvbkxhbmUyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEyODtcbnZhciBUcmFuc2l0aW9uTGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjU2O1xudmFyIFRyYW5zaXRpb25MYW5lNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgVHJhbnNpdGlvbkxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwMjQ7XG52YXIgVHJhbnNpdGlvbkxhbmU2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwNDg7XG52YXIgVHJhbnNpdGlvbkxhbmU3ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmU4ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgxOTI7XG52YXIgVHJhbnNpdGlvbkxhbmU5ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Mzg0O1xudmFyIFRyYW5zaXRpb25MYW5lMTAgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBUcmFuc2l0aW9uTGFuZTExID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjU1MzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEzMTA3MjtcbnZhciBUcmFuc2l0aW9uTGFuZTEzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjYyMTQ0O1xudmFyIFRyYW5zaXRpb25MYW5lMTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG41MjQyODg7XG52YXIgVHJhbnNpdGlvbkxhbmUxNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjEwNDg1NzY7XG52YXIgVHJhbnNpdGlvbkxhbmUxNiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgUmV0cnlMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMwMDIzNDI0O1xudmFyIFJldHJ5TGFuZTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MzA0O1xudmFyIFJldHJ5TGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG44Mzg4NjA4O1xudmFyIFJldHJ5TGFuZTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBSZXRyeUxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMzM1NTQ0MzI7XG52YXIgUmV0cnlMYW5lNSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIFNvbWVSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjEzNDIxNzcyODtcbnZhciBOb25JZGxlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTU7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMjY4NDM1NDU2O1xudmFyIElkbGVMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUzNjg3MDkxMjtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0OyAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBleHBlcmltZW50YWwgdGltZWxpbmUgKHJlYWN0LWRldnRvb2xzLXRpbWVsaW5lKVxuLy8gSXQgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBMYW5lcyB2YWx1ZXMgYWJvdmUuXG5cbmZ1bmN0aW9uIGdldExhYmVsRm9yTGFuZShsYW5lKSB7XG4gIHtcbiAgICBpZiAobGFuZSAmIFN5bmNMYW5lKSB7XG4gICAgICByZXR1cm4gJ1N5bmMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXNIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzTGFuZSkge1xuICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnRGVmYXVsdEh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1RyYW5zaXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykge1xuICAgICAgcmV0dXJuICdSZXRyeSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJZGxlSHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdJZGxlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGUnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgcmV0dXJuICdPZmZzY3JlZW4nO1xuICAgIH1cbiAgfVxufVxudmFyIE5vVGltZXN0YW1wID0gLTE7XG52YXIgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xudmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuXG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykge1xuICBzd2l0Y2ggKGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpKSB7XG4gICAgY2FzZSBTeW5jTGFuZTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0xhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBEZWZhdWx0TGFuZTpcbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7XG5cbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgcmV0dXJuIGxhbmVzICYgUmV0cnlMYW5lcztcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBJZGxlSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgICByZXR1cm4gSWRsZUxhbmU7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay5cblxuXG4gICAgICByZXR1cm4gbGFuZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzKSB7XG4gIC8vIEVhcmx5IGJhaWxvdXQgaWYgdGhlcmUncyBubyBwZW5kaW5nIHdvcmsgbGVmdC5cbiAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOyAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gIC8vIGV2ZW4gaWYgdGhlIHdvcmsgaXMgc3VzcGVuZGVkLlxuXG4gIHZhciBub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgTm9uSWRsZUxhbmVzO1xuXG4gIGlmIChub25JZGxlUGVuZGluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlVW5ibG9ja2VkTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzO1xuXG4gICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVQaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBvbmx5IHJlbWFpbmluZyB3b3JrIGlzIElkbGUuXG4gICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzO1xuXG4gICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh1bmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hhYmxlIGlmIHdlJ3JlIHN1c3BlbmRlZFxuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC5cbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfSAvLyBJZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgYSByZW5kZXIsIHN3aXRjaGluZyBsYW5lcyB3aWxsIGludGVycnVwdFxuICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmVcbiAgLy8gaGlnaGVyIHByaW9yaXR5LlxuXG5cbiAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndFxuICAvLyBib3RoZXIgd2FpdGluZyB1bnRpbCB0aGUgcm9vdCBpcyBjb21wbGV0ZS5cbiAgKHdpcExhbmVzICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpO1xuICAgIHZhciB3aXBMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSh3aXBMYW5lcyk7XG5cbiAgICBpZiAoIC8vIFRlc3RzIHdoZXRoZXIgdGhlIG5leHQgbGFuZSBpcyBlcXVhbCBvciBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSB3aXBcbiAgICAvLyBvbmUuIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYml0cyBkZWNyZWFzZSBpbiBwcmlvcml0eSBhcyB5b3UgZ28gbGVmdC5cbiAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZVxuICAgIC8vIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdXBkYXRlcyBhbmQgdHJhbnNpdGlvbiB1cGRhdGVzIGlzIHRoYXRcbiAgICAvLyBkZWZhdWx0IHVwZGF0ZXMgZG8gbm90IHN1cHBvcnQgcmVmcmVzaCB0cmFuc2l0aW9ucy5cbiAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAvLyBLZWVwIHdvcmtpbmcgb24gdGhlIGV4aXN0aW5nIGluLXByb2dyZXNzIHRyZWUuIERvIG5vdCBpbnRlcnJ1cHQuXG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfVxuICB9XG5cbiAgaWYgKChuZXh0TGFuZXMgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFdoZW4gdXBkYXRlcyBhcmUgc3luYyBieSBkZWZhdWx0LCB3ZSBlbnRhbmdsZSBjb250aW51b3VzIHByaW9yaXR5IHVwZGF0ZXNcbiAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uXG4gICAgLy8gdGhleSB1c2Ugc2VwYXJhdGUgbGFuZXMgaXMgYmVjYXVzZSBjb250aW51b3VzIHVwZGF0ZXMgc2hvdWxkIGludGVycnVwdFxuICAgIC8vIHRyYW5zaXRpb25zLCBidXQgZGVmYXVsdCB1cGRhdGVzIHNob3VsZCBub3QuXG4gICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lO1xuICB9IC8vIENoZWNrIGZvciBlbnRhbmdsZWQgbGFuZXMgYW5kIGFkZCB0aGVtIHRvIHRoZSBiYXRjaC5cbiAgLy9cbiAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyXG4gIC8vIGluIGEgYmF0Y2ggdGhhdCBkb2VzIG5vdCBhbHNvIGluY2x1ZGUgdGhlIG90aGVyIGxhbmUuIFR5cGljYWxseSB3ZSBkbyB0aGlzXG4gIC8vIHdoZW4gbXVsdGlwbGUgdXBkYXRlcyBoYXZlIHRoZSBzYW1lIHNvdXJjZSwgYW5kIHdlIG9ubHkgd2FudCB0byByZXNwb25kIHRvXG4gIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgYXBwbHkgZW50YW5nbGVtZW50cyAqYWZ0ZXIqIGNoZWNraW5nIGZvciBwYXJ0aWFsIHdvcmsgYWJvdmUuXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZVxuICAvLyBpdCdzIGFscmVhZHkgcmVuZGVyaW5nLCB3ZSB3b24ndCBpbnRlcnJ1cHQgaXQuIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNpbmNlXG4gIC8vIGVudGFuZ2xlbWVudCBpcyB1c3VhbGx5IFwiYmVzdCBlZmZvcnRcIjogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGVcbiAgLy8gbGFuZXMgaW4gdGhlIHNhbWUgYmF0Y2gsIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aHJvd2luZyBvdXQgcGFydGlhbGx5XG4gIC8vIGNvbXBsZXRlZCB3b3JrIGluIG9yZGVyIHRvIGRvIGl0LlxuICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29ya1xuICAvLyByZXByZXNlbnRzIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBzaG93IHRvIHRoZSB1c2VyLlxuICAvLyBBbmQgYnkgc3BlbmRpbmcgZXh0cmEgdGltZSBmaW5pc2hpbmcgaXQsIHdlJ3JlIGluY3JlYXNpbmcgdGhlIGFtb3VudCBvZlxuICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5XG4gIC8vIHdhaXRpbmcgZm9yLlxuICAvL1xuICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZVxuICAvLyB1c2VNdXRhYmxlU291cmNlLCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gcGFydGlhbCB3b3JrIGF0IHRoZVxuICAvLyB0aW1lIHdlIGFwcGx5IHRoZSBlbnRhbmdsZW1lbnQuXG5cblxuICB2YXIgZW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzO1xuXG4gIGlmIChlbnRhbmdsZWRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzO1xuXG4gICAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07XG4gICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dExhbmVzO1xufVxuZnVuY3Rpb24gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcykge1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciBldmVudFRpbWUgPSBldmVudFRpbWVzW2luZGV4XTtcblxuICAgIGlmIChldmVudFRpbWUgPiBtb3N0UmVjZW50RXZlbnRUaW1lKSB7XG4gICAgICBtb3N0UmVjZW50RXZlbnRUaW1lID0gZXZlbnRUaW1lO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG5cbiAgcmV0dXJuIG1vc3RSZWNlbnRFdmVudFRpbWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSkge1xuICBzd2l0Y2ggKGxhbmUpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICAvLyBVc2VyIGludGVyYWN0aW9ucyBzaG91bGQgZXhwaXJlIHNsaWdodGx5IG1vcmUgcXVpY2tseS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuXG4gICAgICAvLyBXaGVuIHdlIG1hZGUgaXQgbGFyZ2VyLCBhIHByb2R1Y3QgbWV0cmljIGluIHd3dyByZWdyZXNzZWQsIHN1Z2dlc3RpbmdcbiAgICAgIC8vIHRoZXJlJ3MgYSB1c2VyIGludGVyYWN0aW9uIHRoYXQncyBiZWluZyBzdGFydmVkIGJ5IGEgc2VyaWVzIG9mXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzXG4gICAgICAvLyB0byBmaXggdGhlIHN0YXJ2YXRpb24uIEhvd2V2ZXIsIHRoaXMgc2NlbmFyaW8gc3VwcG9ydHMgdGhlIGlkZWEgdGhhdFxuICAgICAgLy8gZXhwaXJhdGlvbiB0aW1lcyBhcmUgYW4gaW1wb3J0YW50IHNhZmVndWFyZCB3aGVuIHN0YXJ2YXRpb25cbiAgICAgIC8vIGRvZXMgaGFwcGVuLlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTc6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEwOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE2OlxuICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgNTAwMDtcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICAvLyBUT0RPOiBSZXRyaWVzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGV4cGlyZSBpZiB0aGV5IGFyZSBDUFUgYm91bmQgZm9yXG4gICAgICAvLyB0b28gbG9uZywgYnV0IHdoZW4gSSBtYWRlIHRoaXMgY2hhbmdlIGl0IGNhdXNlZCBhIHNwaWtlIGluIGJyb3dzZXJcbiAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXRcbiAgICAgIC8vIGlkZWFsbHkgc2hvdWxkIGZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIFVuZm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZVxuICAgICAgLy8gYSByZXBybyBmb3IgdGhlIGNyYXNoZXMsIG9ubHkgZGV0ZWN0ZWQgdmlhIHByb2R1Y3Rpb24gbWV0cmljcy5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcblxuICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUxhbmU6XG4gICAgY2FzZSBPZmZzY3JlZW5MYW5lOlxuICAgICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSkge1xuICAvLyBUT0RPOiBUaGlzIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgeWllbGQuIFdlIGNhbiBvcHRpbWl6ZSBieSBzdG9yaW5nXG4gIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dFxuICAvLyBvZiB0aGlzIGZ1bmN0aW9uLlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwZW5kaW5nIGxhbmVzIGFuZCBjaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZWlyXG4gIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmtcbiAgLy8gaXQgYXMgZXhwaXJlZCB0byBmb3JjZSBpdCB0byBmaW5pc2guXG5cbiAgdmFyIGxhbmVzID0gcGVuZGluZ0xhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV4cGlyYXRpb25UaW1lID0gZXhwaXJhdGlvblRpbWVzW2luZGV4XTtcblxuICAgIGlmIChleHBpcmF0aW9uVGltZSA9PT0gTm9UaW1lc3RhbXApIHtcbiAgICAgIC8vIEZvdW5kIGEgcGVuZGluZyBsYW5lIHdpdGggbm8gZXhwaXJhdGlvbiB0aW1lLiBJZiBpdCdzIG5vdCBzdXNwZW5kZWQsIG9yXG4gICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZVxuICAgICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgdGltZS5cbiAgICAgIGlmICgobGFuZSAmIHN1c3BlbmRlZExhbmVzKSA9PT0gTm9MYW5lcyB8fCAobGFuZSAmIHBpbmdlZExhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAgICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IGNvbXB1dGVFeHBpcmF0aW9uVGltZShsYW5lLCBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGhpcyBsYW5lIGV4cGlyZWRcbiAgICAgIHJvb3QuZXhwaXJlZExhbmVzIHw9IGxhbmU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn0gLy8gVGhpcyByZXR1cm5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHBlbmRpbmcgbGFuZXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXlcbi8vIGFyZSBzdXNwZW5kZWQuXG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7XG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290LnBlbmRpbmdMYW5lcyk7XG59XG5mdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7XG4gIHZhciBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+T2Zmc2NyZWVuTGFuZTtcblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybiBldmVyeXRoaW5nQnV0T2Zmc2NyZWVuO1xuICB9XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICByZXR1cm4gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzU3luY0xhbmUobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNMYW5lKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIE5vbklkbGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBSZXRyeUxhbmVzKSA9PT0gbGFuZXM7XG59XG5mdW5jdGlvbiBpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhsYW5lcykge1xuICB2YXIgVXJnZW50TGFuZXMgPSBTeW5jTGFuZSB8IElucHV0Q29udGludW91c0xhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSB7XG5cbiAgdmFyIFN5bmNEZWZhdWx0TGFuZXMgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRIeWRyYXRpb25MYW5lIHwgRGVmYXVsdExhbmU7XG4gIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuXG4gIC8vIGV4cGlyZSBhZnRlciBhIHJlbmRlciBoYXMgYWxyZWFkeSBzdGFydGVkLlxuICByZXR1cm4gKGxhbmVzICYgcm9vdC5leHBpcmVkTGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uTGFuZShsYW5lKSB7XG4gIHJldHVybiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpIHtcbiAgLy8gQ3ljbGUgdGhyb3VnaCB0aGUgbGFuZXMsIGFzc2lnbmluZyBlYWNoIG5ldyB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IGxhbmUuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2VcbiAgLy8gcnVuIG91dCBvZiBsYW5lcyBhbmQgY3ljbGUgYmFjayB0byB0aGUgYmVnaW5uaW5nLlxuICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uTGFuZTtcbiAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxO1xuXG4gIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRUcmFuc2l0aW9uTGFuZSA9IFRyYW5zaXRpb25MYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gY2xhaW1OZXh0UmV0cnlMYW5lKCkge1xuICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gIG5leHRSZXRyeUxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBuZXh0UmV0cnlMYW5lID0gUmV0cnlMYW5lMTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykge1xuICByZXR1cm4gbGFuZXMgJiAtbGFuZXM7XG59XG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZShsYW5lcykge1xuICAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZ2V0cyBpbmxpbmVkLiBPbmx5IGV4aXN0cyBzbyB0byBjb21tdW5pY2F0ZSB0aGF0IGl0XG4gIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dFxuICAvLyBhZmZlY3RpbmcgdGhlIGFsZ29yaXRobXMgd2hlcmUgaXRzIHVzZWQuIEhlcmUgSSdtIHVzaW5nXG4gIC8vIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUgYmVjYXVzZSBpdCByZXF1aXJlcyB0aGUgZmV3ZXN0IG9wZXJhdGlvbnMuXG4gIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcykge1xuICByZXR1cm4gMzEgLSBjbHozMihsYW5lcyk7XG59XG5cbmZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHtcbiAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZSk7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzU29tZUxhbmUoYSwgYikge1xuICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGlzU3Vic2V0T2ZMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDtcbn1cbmZ1bmN0aW9uIG1lcmdlTGFuZXMoYSwgYikge1xuICByZXR1cm4gYSB8IGI7XG59XG5mdW5jdGlvbiByZW1vdmVMYW5lcyhzZXQsIHN1YnNldCkge1xuICByZXR1cm4gc2V0ICYgfnN1YnNldDtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdExhbmVzKGEsIGIpIHtcbiAgcmV0dXJuIGEgJiBiO1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBJZiB0aGVyZSBhcmUgYW55IHN1c3BlbmRlZCB0cmFuc2l0aW9ucywgaXQncyBwb3NzaWJsZSB0aGlzIG5ldyB1cGRhdGVcbiAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmdcbiAgLy8gdGhlbSBhZ2Fpbi5cbiAgLy9cbiAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGVcbiAgLy8gYHN1YnRyZWVMYW5lc2Agb2YgdGhlIHVwZGF0ZWQgZmliZXIsIG9yIHRoZSB1cGRhdGUgbGFuZXMgb2YgdGhlIHJldHVyblxuICAvLyBwYXRoLiBUaGlzIHdvdWxkIGV4Y2x1ZGUgc3VzcGVuZGVkIHVwZGF0ZXMgaW4gYW4gdW5yZWxhdGVkIHNpYmxpbmcgdHJlZSxcbiAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuXG4gIC8vXG4gIC8vIFdlIGRvbid0IGRvIHRoaXMgaWYgdGhlIGluY29taW5nIHVwZGF0ZSBpcyBpZGxlLCBiZWNhdXNlIHdlIG5ldmVyIHByb2Nlc3NcbiAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm9cbiAgLy8gd2F5IGl0IGNvdWxkIHVuYmxvY2sgYSB0cmFuc2l0aW9uLlxuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBJZGxlTGFuZSkge1xuICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KHVwZGF0ZUxhbmUpOyAvLyBXZSBjYW4gYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0aW1lc3RhbXAgYmVjYXVzZSB3ZSBwcmVmZXIgdGhlIG1vc3RcbiAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuXG4gIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSB+c3VzcGVuZGVkTGFuZXM7IC8vIFRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBDUFUtYm91bmQuIENsZWFyIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICB2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkge1xuICByb290LnBpbmdlZExhbmVzIHw9IHJvb3Quc3VzcGVuZGVkTGFuZXMgJiBwaW5nZWRMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIC8vIEluIGFkZGl0aW9uIHRvIGVudGFuZ2xpbmcgZWFjaCBvZiB0aGUgZ2l2ZW4gbGFuZXMgd2l0aCBlYWNoIG90aGVyLCB3ZSBhbHNvXG4gIC8vIGhhdmUgdG8gY29uc2lkZXIgX3RyYW5zaXRpdmVfIGVudGFuZ2xlbWVudHMuIEZvciBlYWNoIGxhbmUgdGhhdCBpcyBhbHJlYWR5XG4gIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFsbCogdGhlIGdpdmVuIGxhbmVzLlxuICAvL1xuICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvXG4gIC8vIGVudGFuZ2xlcyBDIHdpdGggQi5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpc1xuICAvLyBmdW5jdGlvbiBhbmQgbG9vayBhdCB0aGUgdGVzdHMgdGhhdCBmYWlsIGluIFJlYWN0VHJhbnNpdGlvbi10ZXN0LmpzLiBUcnlcbiAgLy8gY29tbWVudGluZyBvdXQgb25lIG9mIHRoZSBjb25kaXRpb25zIGJlbG93LlxuICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lcztcbiAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gIHZhciBsYW5lcyA9IHJvb3RFbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMpIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG5cbiAgICBpZiAoIC8vIElzIHRoaXMgb25lIG9mIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgbGFuZSAmIGVudGFuZ2xlZExhbmVzIHwgLy8gSXMgdGhpcyBsYW5lIHRyYW5zaXRpdmVseSBlbnRhbmdsZWQgd2l0aCB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzP1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7XG4gIHZhciBsYW5lO1xuXG4gIHN3aXRjaCAocmVuZGVyTGFuZSkge1xuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgbGFuZSA9IERlZmF1bHRIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIGxhbmUgPSBJZGxlSHlkcmF0aW9uTGFuZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHJlYWR5IGVpdGhlciBhIGh5ZHJhdGlvbiBsYW5lLCBvciBzaG91bGRuJ3RcbiAgICAgIC8vIGJlIHJldHJpZWQgYXQgYSBoeWRyYXRpb24gbGFuZS5cbiAgICAgIGxhbmUgPSBOb0xhbmU7XG4gICAgICBicmVhaztcbiAgfSAvLyBDaGVjayBpZiB0aGUgbGFuZSB3ZSBjaG9zZSBpcyBzdXNwZW5kZWQuIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IHdlXG4gIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlXG4gIC8vIGFscmVhZHkgcmVuZGVyaW5nIHRoYXQgbGFuZSwgd2hpY2ggaXMgcmFyZSBidXQgY291bGQgaGFwcGVuLlxuXG5cbiAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHtcbiAgICAvLyBHaXZlIHVwIHRyeWluZyB0byBoeWRyYXRlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHJlbmRlci5cbiAgICByZXR1cm4gTm9MYW5lO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIHZhciB1cGRhdGVycyA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgIHVwZGF0ZXJzLmFkZChmaWJlcik7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykge1xuXG4gIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDtcbiAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG5cbiAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgIHVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCAhbWVtb2l6ZWRVcGRhdGVycy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB1cGRhdGVycy5jbGVhcigpO1xuICAgIH1cblxuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gU3luY0xhbmU7XG52YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lO1xudmFyIERlZmF1bHRFdmVudFByaW9yaXR5ID0gRGVmYXVsdExhbmU7XG52YXIgSWRsZUV2ZW50UHJpb3JpdHkgPSBJZGxlTGFuZTtcbnZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7XG5mdW5jdGlvbiBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKSB7XG4gIHJldHVybiBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkobmV3UHJpb3JpdHkpIHtcbiAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gbmV3UHJpb3JpdHk7XG59XG5mdW5jdGlvbiBydW5XaXRoUHJpb3JpdHkocHJpb3JpdHksIGZuKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gY3VycmVudFVwZGF0ZVByaW9yaXR5O1xuXG4gIHRyeSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTtcbiAgfVxufVxuZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhICE9PSAwICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSA9PT0gMCB8fCBhID4gYiA/IGEgOiBiO1xufVxuZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGI7XG59XG5mdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykge1xuICB2YXIgbGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xuXG4gIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7XG4gICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuICB9XG5cbiAgaWYgKGluY2x1ZGVzTm9uSWRsZVdvcmsobGFuZSkpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG59XG5cbi8vIFRoaXMgaXMgaW1wb3J0ZWQgYnkgdGhlIGV2ZW50IHJlcGxheWluZyBpbXBsZW1lbnRhdGlvbiBpbiBSZWFjdCBET00uIEl0J3Ncbi8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kXG4vLyB0aGUgcmVjb25jaWxlci5cbmZ1bmN0aW9uIGlzUm9vdERlaHlkcmF0ZWQocm9vdCkge1xuICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBjdXJyZW50U3RhdGUuaXNEZWh5ZHJhdGVkO1xufVxuXG52YXIgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbjtcblxuZnVuY3Rpb24gc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZuKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihmaWJlcikge1xuICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbn1cbnZhciBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7XG4gIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5O1xuZnVuY3Rpb24gc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSA9IGZuO1xufVxudmFyIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxO1xuZnVuY3Rpb24gc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGZuKSB7XG4gIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbi8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uXG5cbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc0Rpc2NyZXRlRXZlbnRUaGF0UmVxdWlyZXNIeWRyYXRpb24oZXZlbnRUeXBlKSB7XG4gIHJldHVybiBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMuaW5kZXhPZihldmVudFR5cGUpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICByZXR1cm4ge1xuICAgIGJsb2NrZWRPbjogYmxvY2tlZE9uLFxuICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLFxuICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgcXVldWVkRHJhZyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgICAgcXVldWVkTW91c2UgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShwb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmRlbGV0ZShfcG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoZXhpc3RpbmdRdWV1ZWRFdmVudCA9PT0gbnVsbCB8fCBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudCkge1xuICAgIHZhciBxdWV1ZWRFdmVudCA9IGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyB0YXJnZXQuXG4gICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWV1ZWRFdmVudDtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFscmVhZHkgcXVldWVkIHRoaXMgZXhhY3QgZXZlbnQsIHRoZW4gaXQncyBiZWNhdXNlXG4gIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLlxuICAvLyBXZSBjYW4gYWNjdW11bGF0ZSB0aGUgZmxhZ3MsIGFuZCB0aGUgdGFyZ2V0Q29udGFpbmVycywgYW5kXG4gIC8vIHN0b3JlIGEgc2luZ2xlIGV2ZW50IHRvIGJlIHJlcGxheWVkLlxuXG5cbiAgZXhpc3RpbmdRdWV1ZWRFdmVudC5ldmVudFN5c3RlbUZsYWdzIHw9IGV2ZW50U3lzdGVtRmxhZ3M7XG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuXG4gIGlmICh0YXJnZXRDb250YWluZXIgIT09IG51bGwgJiYgdGFyZ2V0Q29udGFpbmVycy5pbmRleE9mKHRhcmdldENvbnRhaW5lcikgPT09IC0xKSB7XG4gICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbn1cblxuZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZVxuICAvLyBtb3ZlZCBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdyAobm8gdGFyZ2V0KSBvbnRvIHRoZSB0YXJnZXQgb25jZSBpdCBoeWRyYXRlcy5cbiAgLy8gSW5zdGVhZCBvZiBtdXRhdGluZyB3ZSBjb3VsZCBjbG9uZSB0aGUgZXZlbnQuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICB7XG4gICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRGb2N1cywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZm9jdXNFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGRyYWdFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBtb3VzZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZE1vdXNlID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRNb3VzZSwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbW91c2VFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBwb2ludGVySWQgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5zZXQocG9pbnRlcklkLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIHBvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIF9wb2ludGVySWQyID0gX3BvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoX3BvaW50ZXJJZDIsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlckNhcHR1cmVzLmdldChfcG9pbnRlcklkMikgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgX3BvaW50ZXJFdmVudCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBzaGFyZXMgYSBsb3Qgb2YgbG9naWMgd2l0aCBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50LlxuICAvLyBUcnkgdG8gdW5pZnkgdGhlbS4gSXQncyBhIGJpdCB0cmlja3kgc2luY2UgaXQgd291bGQgcmVxdWlyZSB0d28gcmV0dXJuXG4gIC8vIHZhbHVlcy5cbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShxdWV1ZWRUYXJnZXQudGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIGJsb2NrZWQgb24gaHlkcmF0aW5nIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LlxuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBpbnN0YW5jZTtcbiAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIHdpbGwgcmVhZCB0aGUgcHJpb3JpdHkgaWYgaXQncyBkaXNwYXRjaGVkIGJ5IHRoZSBSZWFjdFxuICAvLyBldmVudCBzeXN0ZW0gYnV0IG5vdCBuYXRpdmUgZXZlbnRzLiBTaG91bGQgcmVhZCB3aW5kb3cuZXZlbnQudHlwZSwgbGlrZVxuICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLlxuICB2YXIgdXBkYXRlUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMSgpO1xuICB2YXIgcXVldWVkVGFyZ2V0ID0ge1xuICAgIGJsb2NrZWRPbjogbnVsbCxcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICBwcmlvcml0eTogdXBkYXRlUHJpb3JpdHlcbiAgfTtcbiAgdmFyIGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gU3RvcCBvbmNlIHdlIGhpdCB0aGUgZmlyc3QgdGFyZ2V0IHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhblxuICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7XG5cbiAgaWYgKGkgPT09IDApIHtcbiAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50ID0gcXVldWVkRXZlbnQubmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5hdGl2ZUV2ZW50LmNvbnN0cnVjdG9yKG5hdGl2ZUV2ZW50LnR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIG5hdGl2ZUV2ZW50LnRhcmdldC5kaXNwYXRjaEV2ZW50KG5hdGl2ZUV2ZW50Q2xvbmUpO1xuICAgICAgICByZXNldFJlcGxheWluZ0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTtcblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7IC8vIFRPRE86IGNhbiB3ZSBzdG9wIGV4cG9ydGluZyB0aGVzZT9cblxudmFyIF9lbmFibGVkID0gdHJ1ZTsgLy8gVGhpcyBpcyBleHBvcnRlZCBpbiBGQiBidWlsZHMgZm9yIHVzZSBieSBsZWdhY3kgRkIgbGF5ZXIgaW5mcmEuXG4vLyBXZSdkIGxpa2UgdG8gcmVtb3ZlIHRoaXMgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoaXMgaXMgc2FmZS5cblxuZnVuY3Rpb24gc2V0RW5hYmxlZChlbmFibGVkKSB7XG4gIF9lbmFibGVkID0gISFlbmFibGVkO1xufVxuZnVuY3Rpb24gaXNFbmFibGVkKCkge1xuICByZXR1cm4gX2VuYWJsZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTtcbiAgdmFyIGxpc3RlbmVyV3JhcHBlcjtcblxuICBzd2l0Y2ggKGV2ZW50UHJpb3JpdHkpIHtcbiAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoQ29udGludW91c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJXcmFwcGVyLmJpbmQobnVsbCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaERpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KENvbnRpbnVvdXNFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50V2l0aEVuYWJsZUNhcHR1cmVQaGFzZVNlbGVjdGl2ZUh5ZHJhdGlvbldpdGhvdXREaXNjcmV0ZUV2ZW50UmVwbGF5KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgYmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gIGlmIChibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7XG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHtcbiAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gIC8vIHF1ZXVlaW5nIGlzIGFjY3VtdWxhdGl2ZS5cblxuXG4gIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7XG4gICAgd2hpbGUgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsXG4gIC8vIGluIGNhc2UgdGhlIGV2ZW50IHN5c3RlbSBuZWVkcyB0byB0cmFjZSBpdC5cblxuXG4gIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpO1xufVxuXG52YXIgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsOyAvLyBSZXR1cm5zIGEgU3VzcGVuc2VJbnN0YW5jZSBvciBDb250YWluZXIgaWYgaXQncyBibG9ja2VkLlxuLy8gVGhlIHJldHVybl90YXJnZXRJbnN0IGZpZWxkIGFib3ZlIGlzIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUuXG5cbmZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgdHJlZSBoYXMgYmVlbiB1bm1vdW50ZWQgYWxyZWFkeS4gRGlzcGF0Y2ggd2l0aG91dCBhIHRhcmdldC5cbiAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBRdWV1ZSB0aGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQgbGF0ZXIuIEFib3J0IGRpc3BhdGNoaW5nIHNpbmNlIHdlXG4gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0aGlzIGV2ZW50IGRpc3BhdGNoZWQgdHdpY2UgdGhyb3VnaCB0aGUgZXZlbnQgc3lzdGVtLlxuICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIHRoaXMgYm91bmRhcnkuXG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nXG4gICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0sIGRpc3BhdGNoIHRoZSBldmVudCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgICAvLyBUT0RPOiBXYXJuLlxuXG5cbiAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7IC8vIFdlJ3JlIG5vdCBibG9ja2VkIG9uIGFueXRoaW5nLlxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBVc2VkIGJ5IFNpbXBsZUV2ZW50UGx1Z2luOlxuICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgY2FzZSAnY2xpY2snOlxuICAgIGNhc2UgJ2Nsb3NlJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdpbnZhbGlkJzpcbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgIGNhc2UgJ3BhdXNlJzpcbiAgICBjYXNlICdwbGF5JzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICBjYXNlICdyYXRlY2hhbmdlJzpcbiAgICBjYXNlICdyZXNldCc6XG4gICAgY2FzZSAncmVzaXplJzpcbiAgICBjYXNlICdzZWVrZWQnOlxuICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICBjYXNlICd2b2x1bWVjaGFuZ2UnOiAvLyBVc2VkIGJ5IHBvbHlmaWxsczpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICBjYXNlICd0ZXh0SW5wdXQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzpcbiAgICBjYXNlICdjb21wb3NpdGlvbnVwZGF0ZSc6IC8vIE9ubHkgZW5hYmxlQ3JlYXRlRXZlbnRIYW5kbGVBUEk6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnYmVmb3JlaW5wdXQnOlxuICAgIGNhc2UgJ2JsdXInOlxuICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOlxuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICBjYXNlICdoYXNoY2hhbmdlJzpcbiAgICBjYXNlICdwb3BzdGF0ZSc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdzZWxlY3RzdGFydCc6XG4gICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgY2FzZSAndG9nZ2xlJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3doZWVsJzogLy8gTm90IHVzZWQgYnkgUmVhY3QgYnV0IGNvdWxkIGJlIGJ5IHVzZXIgY29kZTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJlbnRlcic6XG4gICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcblxuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLlxuICAgICAgICAvLyBFdmVudHVhbGx5IHRoaXMgbWVjaGFuaXNtIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSBjaGVja1xuICAgICAgICAvLyBvZiB0aGUgY3VycmVudCBwcmlvcml0eSBvbiB0aGUgbmF0aXZlIHNjaGVkdWxlci5cbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7XG4gICAgICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lcikge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBjYXB0dXJlOiB0cnVlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHtcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH0pO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5cbi8qKlxuICogVGhlc2UgdmFyaWFibGVzIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICpcbiAqL1xudmFyIHJvb3QgPSBudWxsO1xudmFyIHN0YXJ0VGV4dCA9IG51bGw7XG52YXIgZmFsbGJhY2tUZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGluaXRpYWxpemUobmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICBzdGFydFRleHQgPSBnZXRUZXh0KCk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzZXQoKSB7XG4gIHJvb3QgPSBudWxsO1xuICBzdGFydFRleHQgPSBudWxsO1xuICBmYWxsYmFja1RleHQgPSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgaWYgKGZhbGxiYWNrVGV4dCkge1xuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG4gIH1cblxuICB2YXIgc3RhcnQ7XG4gIHZhciBzdGFydFZhbHVlID0gc3RhcnRUZXh0O1xuICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgdmFyIGVuZDtcbiAgdmFyIGVuZFZhbHVlID0gZ2V0VGV4dCgpO1xuICB2YXIgZW5kTGVuZ3RoID0gZW5kVmFsdWUubGVuZ3RoO1xuXG4gIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuXG4gIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUZXh0ID0gZW5kVmFsdWUuc2xpY2Uoc3RhcnQsIHNsaWNlVGFpbCk7XG4gIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0KCkge1xuICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7XG4gICAgcmV0dXJuIHJvb3QudmFsdWU7XG4gIH1cblxuICByZXR1cm4gcm9vdC50ZXh0Q29udGVudDtcbn1cblxuLyoqXG4gKiBgY2hhckNvZGVgIHJlcHJlc2VudHMgdGhlIGFjdHVhbCBcImNoYXJhY3RlciBjb2RlXCIgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGhcbiAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgcHJvZHVjZSBhIHZhbGlkIGBjaGFyQ29kZWAsIHRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIEVudGVyLlxuICogVGhlIFRhYi1rZXkgaXMgY29uc2lkZXJlZCBub24tcHJpbnRhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGEgYGNoYXJDb2RlYCxcbiAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7IC8vIEZGIGRvZXMgbm90IHNldCBgY2hhckNvZGVgIGZvciB0aGUgRW50ZXIta2V5LCBjaGVjayBhZ2FpbnN0IGBrZXlDb2RlYC5cblxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH0gLy8gSUUgYW5kIEVkZ2UgKG9uIFdpbmRvd3MpIGFuZCBDaHJvbWUgLyBTYWZhcmkgKG9uIFdpbmRvd3MgYW5kIExpbnV4KVxuICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuXG5cblxuICBpZiAoY2hhckNvZGUgPT09IDEwKSB7XG4gICAgY2hhckNvZGUgPSAxMztcbiAgfSAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cblxuXG4gIGlmIChjaGFyQ29kZSA+PSAzMiB8fCBjaGFyQ29kZSA9PT0gMTMpIHtcbiAgICByZXR1cm4gY2hhckNvZGU7XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWUoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGEgZmFjdG9yeSBzbyB0aGF0IHdlIGhhdmUgZGlmZmVyZW50IHJldHVybmVkIGNvbnN0cnVjdG9ycy5cbi8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuXG5cblxuZnVuY3Rpb24gY3JlYXRlU3ludGhldGljRXZlbnQoSW50ZXJmYWNlKSB7XG4gIC8qKlxuICAgKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gICAqIHRvcC1sZXZlbCBldmVudCBkZWxlZ2F0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gICAqIGNvbGxlY3Rpb24uIFRoZSBzeXN0ZW0gc2hvdWxkIGNoZWNrIGBpc1BlcnNpc3RlbnRgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZVxuICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gICAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gICAqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAgICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAgICogRE9NIGludGVyZmFjZTsgY3VzdG9tIGFwcGxpY2F0aW9uLXNwZWNpZmljIGV2ZW50cyBjYW4gYWxzbyBzdWJjbGFzcyB0aGlzLlxuICAgKi9cbiAgZnVuY3Rpb24gU3ludGhldGljQmFzZUV2ZW50KHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHRoaXMuX3JlYWN0TmFtZSA9IHJlYWN0TmFtZTtcbiAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICB0aGlzLnR5cGUgPSByZWFjdEV2ZW50VHlwZTtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB0aGlzLmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtfcHJvcE5hbWVdO1xuXG4gICAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW19wcm9wTmFtZV0gPSBuYXRpdmVFdmVudFtfcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcblxuICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcbiAgcmV0dXJuIFN5bnRoZXRpY0Jhc2VFdmVudDtcbn1cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxuXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGV2ZW50UGhhc2U6IDAsXG4gIGJ1YmJsZXM6IDAsXG4gIGNhbmNlbGFibGU6IDAsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiAwLFxuICBpc1RydXN0ZWQ6IDBcbn07XG52YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7XG5cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHNjcmVlblg6IDAsXG4gIHNjcmVlblk6IDAsXG4gIGNsaWVudFg6IDAsXG4gIGNsaWVudFk6IDAsXG4gIHBhZ2VYOiAwLFxuICBwYWdlWTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IDAsXG4gIGJ1dHRvbnM6IDAsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5yZWxhdGVkVGFyZ2V0ID09PSB1bmRlZmluZWQpIHJldHVybiBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50O1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0O1xuICB9LFxuICBtb3ZlbWVudFg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRYJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDtcbiAgICB9XG5cbiAgICB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCk7XG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gIH0sXG4gIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFknIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZO1xuICAgIH0gLy8gRG9uJ3QgbmVlZCB0byBjYWxsIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKCkgaGVyZVxuICAgIC8vIGJlY2F1c2UgaXQncyBndWFyYW50ZWVkIHRvIGhhdmUgYWxyZWFkeSBydW4gd2hlbiBtb3ZlbWVudFhcbiAgICAvLyB3YXMgY29waWVkLlxuXG5cbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WTtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoTW91c2VFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgRHJhZ0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGFUcmFuc2ZlcjogMFxufSk7XG5cbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgYW5pbWF0aW9uTmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChBbmltYXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY2xpcGJvYXJkLWFwaXMvXG4gKi9cblxudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cblxudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGNvZGU6IDAsXG4gIGxvY2F0aW9uOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICByZXBlYXQ6IDAsXG4gIGxvY2FsZTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFBvaW50ZXJFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzL1xuICovXG5cbnZhciBQb2ludGVyRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgcG9pbnRlcklkOiAwLFxuICB3aWR0aDogMCxcbiAgaGVpZ2h0OiAwLFxuICBwcmVzc3VyZTogMCxcbiAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLFxuICB0aWx0WDogMCxcbiAgdGlsdFk6IDAsXG4gIHR3aXN0OiAwLFxuICBwb2ludGVyVHlwZTogMCxcbiAgaXNQcmltYXJ5OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cblxudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHByb3BlcnR5TmFtZTogMCxcbiAgZWxhcHNlZFRpbWU6IDAsXG4gIHBzZXVkb0VsZW1lbnQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFYJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWCA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGEnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGEgOiAwO1xuICB9LFxuICBkZWx0YVo6IDAsXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1doZWVsRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIEVORF9LRVlDT0RFUyA9IFs5LCAxMywgMjcsIDMyXTsgLy8gVGFiLCBSZXR1cm4sIEVzYywgU3BhY2VcblxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG52YXIgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiAnQ29tcG9zaXRpb25FdmVudCcgaW4gd2luZG93O1xudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5cbmlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHtcbiAgZG9jdW1lbnRNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufSAvLyBXZWJraXQgb2ZmZXJzIGEgdmVyeSB1c2VmdWwgYHRleHRJbnB1dGAgZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCB0b1xuLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXNcbi8vIHVzZWZ1bCwgc28gd2UgZG9uJ3QgdXNlIGl0LlxuXG5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cblxudmFyIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID0gY2FuVXNlRE9NICYmICghY2FuVXNlQ29tcG9zaXRpb25FdmVudCB8fCBkb2N1bWVudE1vZGUgJiYgZG9jdW1lbnRNb2RlID4gOCAmJiBkb2N1bWVudE1vZGUgPD0gMTEpO1xudmFyIFNQQUNFQkFSX0NPREUgPSAzMjtcbnZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25CZWZvcmVJbnB1dCcsIFsnY29tcG9zaXRpb25lbmQnLCAna2V5cHJlc3MnLCAndGV4dElucHV0JywgJ3Bhc3RlJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25FbmQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkNvbXBvc2l0aW9uVXBkYXRlJywgWydjb21wb3NpdGlvbnVwZGF0ZScsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTtcbn0gLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxuXG5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLlxuICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIEZpcmVmb3ggZmlyZXMgYGtleXByZXNzYCBldmVudHMgZm9yIGtleSBjb21tYW5kc1xuICogKGN1dCwgY29weSwgc2VsZWN0LWFsbCwgZXRjLikgZXZlbiB0aG91Z2ggbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLlxuICovXG5cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiYgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgbmF0aXZlIHRvcCBsZXZlbCBldmVudHMgaW50byBldmVudCB0eXBlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2NvbXBvc2l0aW9uc3RhcnQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJztcblxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzpcbiAgICAgIHJldHVybiAnb25Db21wb3NpdGlvblVwZGF0ZSc7XG4gIH1cbn1cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBtb2RlIHRoaW5rIHRoYXQgdGhpcyBldmVudCBpcyB0aGUgZW5kIG9mIGNvbXBvc2l0aW9uP1xuICovXG5cblxuZnVuY3Rpb24gaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICAvLyBDb21tYW5kIGtleXMgaW5zZXJ0IG9yIGNsZWFyIElNRSBpbnB1dC5cbiAgICAgIHJldHVybiBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKSAhPT0gLTE7XG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsO1xuXG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENoZWNrIGlmIGEgY29tcG9zaXRpb24gZXZlbnQgd2FzIHRyaWdnZXJlZCBieSBLb3JlYW4gSU1FLlxuICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLFxuICogc28ganVzdCB1c2UgbmF0aXZlIGNvbXBvc2l0aW9uIGV2ZW50cyB3aGVuIEtvcmVhbiBJTUUgaXMgdXNlZC5cbiAqIEFsdGhvdWdoIENvbXBvc2l0aW9uRXZlbnQubG9jYWxlIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsXG4gKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cblxuZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbmF0aXZlRXZlbnQubG9jYWxlID09PSAna28nO1xufSAvLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gc3RhdHVzLCBpZiBhbnkuXG5cblxudmFyIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuXG5mdW5jdGlvbiBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgZXZlbnRUeXBlO1xuICB2YXIgZmFsbGJhY2tEYXRhO1xuXG4gIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7XG4gICAgZXZlbnRUeXBlID0gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmICghaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uU3RhcnQnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvbkVuZCc7XG4gIH1cblxuICBpZiAoIWV2ZW50VHlwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWlzQ29tcG9zaW5nICYmIGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25TdGFydCcpIHtcbiAgICAgIGlzQ29tcG9zaW5nID0gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIGV2ZW50VHlwZSk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG5cbiAgICBpZiAoZmFsbGJhY2tEYXRhKSB7XG4gICAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgICBldmVudC5kYXRhID0gZmFsbGJhY2tEYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyhkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBJZiBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRzIGFyZSBhdmFpbGFibGUsIG91ciBnb2FsIGlzIHRvIG1ha2VcbiAgICAgICAqIHVzZSBvZiB0aGVtLiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZTogdGhlIHNwYWNlYmFyIGtleS5cbiAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnRcbiAgICAgICAqIGNhbmNlbHMgY2hhcmFjdGVyIGluc2VydGlvbiwgYnV0IGl0ICphbHNvKiBjYXVzZXMgdGhlIGJyb3dzZXJcbiAgICAgICAqIHRvIGZhbGwgYmFjayB0byBpdHMgZGVmYXVsdCBzcGFjZWJhciBiZWhhdmlvciBvZiBzY3JvbGxpbmcgdGhlXG4gICAgICAgKiBwYWdlLlxuICAgICAgICpcbiAgICAgICAqIFRyYWNraW5nIGF0OlxuICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwM1xuICAgICAgICpcbiAgICAgICAqIFRvIGF2b2lkIHRoaXMgaXNzdWUsIHVzZSB0aGUga2V5cHJlc3MgZXZlbnQgYXMgaWYgbm8gYHRleHRJbnB1dGBcbiAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAqL1xuICAgICAgdmFyIHdoaWNoID0gbmF0aXZlRXZlbnQud2hpY2g7XG5cbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7IC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LlxuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gZ2V0RGF0YSgpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gY2hhcnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgLy8gSUUgZmlyZXMgdGhlIGBrZXlwcmVzc2AgZXZlbnQgd2hlbiBhIHVzZXIgdHlwZXMgYW4gZW1vamkgdmlhXG4gICAgICAgIC8vIFRvdWNoIGtleWJvYXJkIG9mIFdpbmRvd3MuICBJbiBzdWNoIGEgY2FzZSwgdGhlIGBjaGFyYCBwcm9wZXJ0eVxuICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXFx1RDgzRFxcdURFMEFgLiAgQmVjYXVzZSBpdHMgbGVuZ3RoXG4gICAgICAgIC8vIGlzIDIsIHRoZSBwcm9wZXJ0eSBgd2hpY2hgIGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbW9qaSBjb3JyZWN0bHkuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVzaW5nIGB3aGljaGAuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIG5hdGl2ZUV2ZW50LmNoYXIubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKG5hdGl2ZUV2ZW50LndoaWNoKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhICYmICFpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICB2YXIgY2hhcnM7XG5cbiAgaWYgKGNhblVzZVRleHRJbnB1dEV2ZW50KSB7XG4gICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIGNoYXJzID0gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG5cblxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsICdvbkJlZm9yZUlucHV0Jyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICAgIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgfVxufVxuLyoqXG4gKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoXG4gKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNS8jZXZlbnRzLWlucHV0ZXZlbnRzLlxuICpcbiAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnRcbiAqIGF2YWlsYWJsZSBpbiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEsIGFuZCBJRS4gVGhpcyBldmVudCBmaXJlcyBhZnRlclxuICogYG9uS2V5UHJlc3NgIGFuZCBgb25Db21wb3NpdGlvbkVuZGAsIGJ1dCBiZWZvcmUgYG9uSW5wdXRgLlxuICpcbiAqIGBiZWZvcmVJbnB1dGAgaXMgc3BlYydkIGJ1dCBub3QgaW1wbGVtZW50ZWQgaW4gYW55IGJyb3dzZXJzLCBhbmRcbiAqIHRoZSBgaW5wdXRgIGV2ZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGhhc1xuICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0XG4gKiBhdmFpbGFibGUgZXZlbnQgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gaW5zZXJ0ZWRcbiAqIGludG8gdGhlIHRhcmdldCBub2RlLlxuICpcbiAqIFRoaXMgcGx1Z2luIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGBjb21wb3NpdGlvbmAgZXZlbnRzLCB0aHVzXG4gKiBhbGxvd2luZyB1cyB0byBzaGFyZSBjb21wb3NpdGlvbiBmYWxsYmFjayBjb2RlIGZvciBib3RoIGBiZWZvcmVJbnB1dGAgYW5kXG4gKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgY29sb3I6IHRydWUsXG4gIGRhdGU6IHRydWUsXG4gIGRhdGV0aW1lOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICBlbWFpbDogdHJ1ZSxcbiAgbW9udGg6IHRydWUsXG4gIG51bWJlcjogdHJ1ZSxcbiAgcGFzc3dvcmQ6IHRydWUsXG4gIHJhbmdlOiB0cnVlLFxuICBzZWFyY2g6IHRydWUsXG4gIHRlbDogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgdGltZTogdHJ1ZSxcbiAgdXJsOiB0cnVlLFxuICB3ZWVrOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBpc1RleHRJbnB1dEVsZW1lbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0Jykge1xuICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTtcbiAgfVxuXG4gIGlmIChub2RlTmFtZSA9PT0gJ3RleHRhcmVhJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCkge1xuICBpZiAoIWNhblVzZURPTSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQxKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgLy8gRmxhZyB0aGlzIGV2ZW50IGxvb3AgYXMgbmVlZGluZyBzdGF0ZSByZXN0b3JlLlxuICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoaW5zdCwgJ29uQ2hhbmdlJyk7XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvbkNoYW5nZScsICdjaGFuZ2UnLCBudWxsLCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufVxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xuXG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVzZUNoYW5nZUV2ZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwgbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAnZmlsZSc7XG59XG5cbmZ1bmN0aW9uIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTsgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG5cbiAgYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgMCk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KSB7XG4gIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTtcblxuICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xuXG5cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcblxuaWYgKGNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG4vKipcbiAqIChGb3IgSUUgPD05KSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5cblxuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7XG4gICAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c2luJykge1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmIChkb21FdmVudE5hbWUgPT09ICdmb2N1c291dCcpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICB9XG59IC8vIEZvciBJRTggYW5kIElFOS5cblxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcgfHwgZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKGFjdGl2ZUVsZW1lbnRJbnN0KTtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNsaWNrYCBldmVudFxuICovXG5cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW0udHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAoZG9tRXZlbnROYW1lID09PSAnaW5wdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIobm9kZSkge1xuICB2YXIgc3RhdGUgPSBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcbiAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG5cbiAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICB9XG5cbiAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpO1xuXG4gICAgaWYgKGluc3QpIHtcbiAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgfSAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuXG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0Tm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUVudGVyJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VMZWF2ZScsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Qb2ludGVyTGVhdmUnLCBbJ3BvaW50ZXJvdXQnLCAncG9pbnRlcm92ZXInXSk7XG59XG4vKipcbiAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gKiBgbW91c2VvdmVyYCBhbmQgYG1vdXNlb3V0YCBldmVudCB0aGF0IG9jY3Vycy4gT25seSB1c2UgYG1vdXNlb3V0YCBzbyB0aGF0XG4gKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAqIHRoZSBgbW91c2VvdmVyYCB0b3AtbGV2ZWwgZXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDIoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJztcbiAgdmFyIGlzT3V0RXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCc7XG5cbiAgaWYgKGlzT3ZlckV2ZW50ICYmICFpc1JlcGxheWluZ0V2ZW50KG5hdGl2ZUV2ZW50KSkge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gb3ZlciBldmVudCB3aXRoIGEgdGFyZ2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgZGlzcGF0Y2hlZFxuICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsXG4gICAgLy8gdGhlbiBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgZGlzcGF0Y2ggYWdhaW5zdCB0aGlzIHRhcmdldCBwcmV2aW91c2x5XG4gICAgLy8gc28gd2UgaGF2ZSB0byBkbyBpdCBub3cgaW5zdGVhZC5cbiAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7XG5cbiAgICBpZiAocmVsYXRlZCkge1xuICAgICAgLy8gSWYgdGhlIHJlbGF0ZWQgbm9kZSBpcyBtYW5hZ2VkIGJ5IFJlYWN0LCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgaGF2ZVxuICAgICAgLy8gYWxyZWFkeSBkaXNwYXRjaGVkIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50cyBkdXJpbmcgaXRzIG1vdXNlb3V0LlxuICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzT3V0RXZlbnQgJiYgIWlzT3ZlckV2ZW50KSB7XG4gICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBvciBwb2ludGVyIGluIG9yIG91dCAtIGlnbm9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB3aW47IC8vIFRPRE86IHdoeSBpcyB0aGlzIG51bGxhYmxlIGluIHRoZSB0eXBlcyBidXQgd2UgcmVhZCBmcm9tIGl0P1xuXG4gIGlmIChuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKGRvYykge1xuICAgICAgd2luID0gZG9jLmRlZmF1bHRWaWV3IHx8IGRvYy5wYXJlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbiA9IHdpbmRvdztcbiAgICB9XG4gIH1cblxuICB2YXIgZnJvbTtcbiAgdmFyIHRvO1xuXG4gIGlmIChpc091dEV2ZW50KSB7XG4gICAgdmFyIF9yZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG5cbiAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICB0byA9IF9yZWxhdGVkID8gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoX3JlbGF0ZWQpIDogbnVsbDtcblxuICAgIGlmICh0byAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7XG5cbiAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgIGZyb20gPSBudWxsO1xuICAgIHRvID0gdGFyZ2V0SW5zdDtcbiAgfVxuXG4gIGlmIChmcm9tID09PSB0bykge1xuICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7XG4gIHZhciBlbnRlckV2ZW50VHlwZSA9ICdvbk1vdXNlRW50ZXInO1xuICB2YXIgZXZlbnRUeXBlUHJlZml4ID0gJ21vdXNlJztcblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm91dCcgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInKSB7XG4gICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgIGxlYXZlRXZlbnRUeXBlID0gJ29uUG9pbnRlckxlYXZlJztcbiAgICBlbnRlckV2ZW50VHlwZSA9ICdvblBvaW50ZXJFbnRlcic7XG4gICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInO1xuICB9XG5cbiAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcbiAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgbGVhdmUudGFyZ2V0ID0gZnJvbU5vZGU7XG4gIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG4gIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZ1xuICAvLyB0aGUgZmlyc3QgYW5jZXN0b3IuIE5leHQgdGltZSwgd2Ugd2lsbCBpZ25vcmUgdGhlIGV2ZW50LlxuXG4gIHZhciBuYXRpdmVUYXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChuYXRpdmVUYXJnZXRJbnN0ID09PSB0YXJnZXRJbnN0KSB7XG4gICAgdmFyIGVudGVyRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGVudGVyRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnZW50ZXInLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlckV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcbiAgICBlbnRlciA9IGVudGVyRXZlbnQ7XG4gIH1cblxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xufVxuXG4vKipcbiAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICovXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIDtcbn1cblxudmFyIG9iamVjdElzID0gdHlwZW9mIE9iamVjdC5pcyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5pcyA6IGlzO1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHtcbiAgaWYgKG9iamVjdElzKG9iakEsIG9iakIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtpXTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fCAhb2JqZWN0SXMob2JqQVtjdXJyZW50S2V5XSwgb2JqQltjdXJyZW50S2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cbi8qKlxuICogR2V0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBub2RlcyB3aGljaCBjb250YWluIGNoYXJhY3RlcnMgYXQgb2Zmc2V0LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gcm9vdFxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBub2RlRW5kID0gbm9kZVN0YXJ0ICsgbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG5cbiAgICAgIGlmIChub2RlU3RhcnQgPD0gb2Zmc2V0ICYmIG5vZGVFbmQgPj0gb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldCAtIG5vZGVTdGFydFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBub2RlU3RhcnQgPSBub2RlRW5kO1xuICAgIH1cblxuICAgIG5vZGUgPSBnZXRMZWFmTm9kZShnZXRTaWJsaW5nTm9kZShub2RlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG91dGVyTm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRPZmZzZXRzKG91dGVyTm9kZSkge1xuICB2YXIgb3duZXJEb2N1bWVudCA9IG91dGVyTm9kZS5vd25lckRvY3VtZW50O1xuICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24gJiYgd2luLmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSBcImFub255bW91cyBkaXZzXCIsIGUuZy4gdGhlXG4gIC8vIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG9cbiAgLy8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yXCIgaWYgYW55IG9mIGl0c1xuICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZ1xuICAvLyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3Igbm9uLWFub255bW91cyBkaXZzIGFuZFxuICAvLyBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG5cbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBhbmNob3JOb2RlLm5vZGVUeXBlO1xuICAgIGZvY3VzTm9kZS5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHtzdGFydCwgZW5kfSB3aGVyZSBgc3RhcnRgIGlzIHRoZSBjaGFyYWN0ZXIvY29kZXBvaW50IGluZGV4IG9mXG4gKiAoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KSB3aXRoaW4gdGhlIHRleHRDb250ZW50IG9mIGBvdXRlck5vZGVgLCBhbmRcbiAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuXG4gKlxuICogUmV0dXJucyBudWxsIGlmIHlvdSBwYXNzIGluIGdhcmJhZ2UgaW5wdXQgYnV0IHdlIHNob3VsZCBwcm9iYWJseSBqdXN0IGNyYXNoLlxuICpcbiAqIEV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcuXG4gKi9cblxuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0c0Zyb21Qb2ludHMob3V0ZXJOb2RlLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBzdGFydCA9IC0xO1xuICB2YXIgZW5kID0gLTE7XG4gIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7XG4gIHZhciBpbmRleFdpdGhpbkZvY3VzID0gMDtcbiAgdmFyIG5vZGUgPSBvdXRlck5vZGU7XG4gIHZhciBwYXJlbnROb2RlID0gbnVsbDtcblxuICBvdXRlcjogd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dCA9IG51bGw7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IGFuY2hvck5vZGUgJiYgKGFuY2hvck9mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZm9jdXNOb2RlICYmIChmb2N1c09mZnNldCA9PT0gMCB8fCBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpKSB7XG4gICAgICAgIGVuZCA9IGxlbmd0aCArIGZvY3VzT2Zmc2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICAgIGxlbmd0aCArPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUuZmlyc3RDaGlsZCkgPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIE1vdmluZyBmcm9tIGBub2RlYCB0byBpdHMgZmlyc3QgY2hpbGQgYG5leHRgLlxuXG5cbiAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgbm9kZSA9IG5leHQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHtcbiAgICAgICAgLy8gSWYgYG91dGVyTm9kZWAgaGFzIGNoaWxkcmVuLCB0aGlzIGlzIGFsd2F5cyB0aGUgc2Vjb25kIHRpbWUgdmlzaXRpbmdcbiAgICAgICAgLy8gaXQuIElmIGl0IGhhcyBubyBjaGlsZHJlbiwgdGhpcyBpcyBzdGlsbCB0aGUgZmlyc3QgbG9vcCwgYW5kIHRoZSBvbmx5XG4gICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGVcbiAgICAgICAgLy8gYW5kIGJvdGggb2Zmc2V0cyAwLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgaGF2ZSBoYW5kbGVkIGFib3ZlLlxuICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7XG4gICAgICAgIHN0YXJ0ID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gZm9jdXNPZmZzZXQpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5leHQgPSBub2RlLm5leHRTaWJsaW5nKSAhPT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBuZXh0IHNpYmxpbmcgYG5leHRgLlxuXG5cbiAgICBub2RlID0gbmV4dDtcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgZW5kID09PSAtMSkge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndFxuICAgIC8vIGFjdHVhbGx5IGluc2lkZSB0aGUgcGFzc2VkLWluIG5vZGUuKVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnQsXG4gICAgZW5kOiBlbmRcbiAgfTtcbn1cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5cbmZ1bmN0aW9uIHNldE9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCBcIk9iamVjdCBleHBlY3RlZFwiIGluIHNvbWUgc2NlbmFyaW9zLlxuICAvLyAoRm9yIGluc3RhbmNlOiBUaW55TUNFIGVkaXRvciB1c2VkIGluIGEgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyBwYXN0aW5nIHRvIGFkZCBtb3JlLFxuICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcylcblxuICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTsgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cblxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBjb250YWluc05vZGUobm9kZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbkZyYW1lKGlmcmFtZSkge1xuICB0cnkge1xuICAgIC8vIEFjY2Vzc2luZyB0aGUgY29udGVudERvY3VtZW50IG9mIGEgSFRNTElmcmFtZUVsZW1lbnQgY2FuIGNhdXNlIHRoZSBicm93c2VyXG4gICAgLy8gdG8gdGhyb3csIGUuZy4gaWYgaXQgaGFzIGEgY3Jvc3Mtb3JpZ2luIHNyYyBhdHRyaWJ1dGUuXG4gICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiBcIkJsb2NrZWQgYSBmcmFtZSB3aXRoIG9yaWdpblwiLiBlLmc6XG4gICAgLy8gaWZyYW1lLmNvbnRlbnREb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvblxuICAgIC8vIFdoaWNoIG1pZ2h0IHJlc3VsdCBpbiBcIlNlY3VyaXR5RXJyb3JcIiBET00gRXhjZXB0aW9uIGFuZCBpdCBpcyBjb21wYXRpYmxlIHRvIFNhZmFyaS5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsXG4gICAgcmV0dXJuIHR5cGVvZiBpZnJhbWUuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmID09PSAnc3RyaW5nJztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnREZWVwKCkge1xuICB2YXIgd2luID0gd2luZG93O1xuICB2YXIgZWxlbWVudCA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcblxuICB3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIHdpbi5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgIGlmIChpc1NhbWVPcmlnaW5GcmFtZShlbGVtZW50KSkge1xuICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vKipcbiAqIEBSZWFjdElucHV0U2VsZWN0aW9uOiBSZWFjdCBpbnB1dCBzZWxlY3Rpb24gbW9kdWxlLiBCYXNlZCBvbiBTZWxlY3Rpb24uanMsXG4gKiBidXQgbW9kaWZpZWQgdG8gYmUgc3VpdGFibGUgZm9yIHJlYWN0IGFuZCBoYXMgYSBjb3VwbGUgb2YgYnVnIGZpeGVzIChkb2Vzbid0XG4gKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuXG4gKiBJbnB1dCBzZWxlY3Rpb24gbW9kdWxlIGZvciBSZWFjdC5cbiAqL1xuXG4vKipcbiAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uXG4gKiBmcm9tIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI2RvLW5vdC1hcHBseSwgbG9va2luZyBhdCBgc2VsZWN0aW9uU3RhcnRgXG4gKiBhbmQgYHNlbGVjdGlvbkVuZGAgcm93cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IGVsZW0udHlwZSA9PT0gJ3NlYXJjaCcgfHwgZWxlbS50eXBlID09PSAndGVsJyB8fCBlbGVtLnR5cGUgPT09ICd1cmwnIHx8IGVsZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJykgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG59XG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHtcbiAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgcmV0dXJuIHtcbiAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgc2VsZWN0aW9uUmFuZ2U6IGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBnZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICB9O1xufVxuLyoqXG4gKiBAcmVzdG9yZVNlbGVjdGlvbjogSWYgYW55IHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB3YXMgcG90ZW50aWFsbHkgbG9zdCxcbiAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gKi9cblxuZnVuY3Rpb24gcmVzdG9yZVNlbGVjdGlvbihwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7XG4gIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuXG4gIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIHNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICB9IC8vIEZvY3VzaW5nIGEgbm9kZSBjYW4gY2hhbmdlIHRoZSBzY3JvbGwgcG9zaXRpb24sIHdoaWNoIGlzIHVuZGVzaXJhYmxlXG5cblxuICAgIHZhciBhbmNlc3RvcnMgPSBbXTtcbiAgICB2YXIgYW5jZXN0b3IgPSBwcmlvckZvY3VzZWRFbGVtO1xuXG4gICAgd2hpbGUgKGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgYW5jZXN0b3JzLnB1c2goe1xuICAgICAgICAgIGVsZW1lbnQ6IGFuY2VzdG9yLFxuICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsXG4gICAgICAgICAgdG9wOiBhbmNlc3Rvci5zY3JvbGxUb3BcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcmlvckZvY3VzZWRFbGVtLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbmZvID0gYW5jZXN0b3JzW2ldO1xuICAgICAgaW5mby5lbGVtZW50LnNjcm9sbExlZnQgPSBpbmZvLmxlZnQ7XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICogY29udGVudEVkaXRhYmxlIG5vZGUuXG4gKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gKi9cblxuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHZhciBzZWxlY3Rpb247XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTtcbiAgfVxuXG4gIHJldHVybiBzZWxlY3Rpb24gfHwge1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogMFxuICB9O1xufVxuLyoqXG4gKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAqIHRoZSBpbnB1dC5cbiAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAqL1xuXG5mdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIG9mZnNldHMpIHtcbiAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kO1xuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9XG5cbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHtcbiAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgfVxufVxuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvblNlbGVjdCcsIFsnZm9jdXNvdXQnLCAnY29udGV4dG1lbnUnLCAnZHJhZ2VuZCcsICdmb2N1c2luJywgJ2tleWRvd24nLCAna2V5dXAnLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG52YXIgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aGljaCBpcyBhIHVuaXF1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0XG4gKiB0d28gaWRlbnRpY2FsIHNlbGVjdGlvbnMgb24gdGhlIHNhbWUgbm9kZSB3aWxsIHJldHVybiBpZGVudGljYWwgb2JqZWN0cy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24kMShub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH1cbn1cbi8qKlxuICogR2V0IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgdGFyZ2V0LlxuICovXG5cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXREb2N1bWVudChldmVudFRhcmdldCkge1xuICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG59XG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5cblxuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE9ubHkgZmlyZSB3aGVuIHNlbGVjdGlvbiBoYXMgYWN0dWFsbHkgY2hhbmdlZC5cblxuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uJDEoYWN0aXZlRWxlbWVudCQxKTtcblxuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7XG5cbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudCgnb25TZWxlY3QnLCAnc2VsZWN0JywgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG5cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSB0YXJnZXRJbnN0O1xuICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xuICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IG51bGw7XG4gICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuXG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIENocm9tZSBhbmQgSUUgZmlyZSBub24tc3RhbmRhcmQgZXZlbnQgd2hlbiBzZWxlY3Rpb24gaXMgY2hhbmdlZCAoYW5kXG4gICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgLy9cbiAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgIC8vIGtleXVwLCBidXQgd2UgY2hlY2sgb24ga2V5ZG93biBhcyB3ZWxsIGluIHRoZSBjYXNlIG9mIGhvbGRpbmcgZG93biBhXG4gICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuXG4gICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzpcbiAgICAgIGlmIChza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIG1ha2VQcmVmaXhNYXAoc3R5bGVQcm9wLCBldmVudE5hbWUpIHtcbiAgdmFyIHByZWZpeGVzID0ge307XG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHJldHVybiBwcmVmaXhlcztcbn1cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG5cblxudmFyIHZlbmRvclByZWZpeGVzID0ge1xuICBhbmltYXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25FbmQnKSxcbiAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksXG4gIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uU3RhcnQnKSxcbiAgdHJhbnNpdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnVHJhbnNpdGlvbicsICdUcmFuc2l0aW9uRW5kJylcbn07XG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xuXG52YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307XG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG5cbnZhciBzdHlsZSA9IHt9O1xuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5cbmlmIChjYW5Vc2VET00pIHtcbiAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTsgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uO1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247XG4gIH0gLy8gU2FtZSBhcyBhYm92ZVxuXG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHZlbmRvciBwcmVmaXhlZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXZlbnROYW1lO1xufVxuXG52YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTtcbnZhciBBTklNQVRJT05fSVRFUkFUSU9OID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbml0ZXJhdGlvbicpO1xudmFyIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpO1xudmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTtcblxudmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IVxuLy9cbi8vIEUuZy4gaXQgbmVlZHMgXCJwb2ludGVyRG93blwiLCBub3QgXCJwb2ludGVyZG93blwiLlxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRlcml2ZSBib3RoIFJlYWN0IG5hbWUgKFwib25Qb2ludGVyRG93blwiKVxuLy8gYW5kIERPTSBuYW1lIChcInBvaW50ZXJkb3duXCIpIGZyb20gdGhlIHNhbWUgbGlzdC5cbi8vXG4vLyBFeGNlcHRpb25zIHRoYXQgZG9uJ3QgbWF0Y2ggdGhpcyBjb252ZW50aW9uIGFyZSBsaXN0ZWQgc2VwYXJhdGVseS5cbi8vXG4vLyBwcmV0dGllci1pZ25vcmVcblxudmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddO1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7XG4gIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLnNldChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZXZlbnROYW1lID0gc2ltcGxlRXZlbnRQbHVnaW5FdmVudHNbaV07XG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjYXBpdGFsaXplZEV2ZW50ID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsICdvbicgKyBjYXBpdGFsaXplZEV2ZW50KTtcbiAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLlxuXG5cbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCAnb25BbmltYXRpb25FbmQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsICdvbkFuaW1hdGlvblN0YXJ0Jyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2RibGNsaWNrJywgJ29uRG91YmxlQ2xpY2snKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoJ2ZvY3Vzb3V0JywgJ29uQmx1cicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fRU5ELCAnb25UcmFuc2l0aW9uRW5kJyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcblxuICBpZiAocmVhY3ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7XG4gIHZhciByZWFjdEV2ZW50VHlwZSA9IGRvbUV2ZW50TmFtZTtcblxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdrZXlkb3duJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmVmb3JlYmx1cic6XG4gICAgY2FzZSAnYWZ0ZXJibHVyJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdhdXhjbGljayc6XG4gICAgY2FzZSAnZGJsY2xpY2snOlxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgY2FzZSAnbW91c2Vtb3ZlJzpcbiAgICBjYXNlICdtb3VzZXVwJzogLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnbW91c2VvdXQnOlxuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZHJhZyc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICBjYXNlICdkcmFnZXhpdCc6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndG91Y2hjYW5jZWwnOlxuICAgIGNhc2UgJ3RvdWNoZW5kJzpcbiAgICBjYXNlICd0b3VjaG1vdmUnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjpcbiAgICBjYXNlIEFOSU1BVElPTl9TVEFSVDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzY3JvbGwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnd2hlZWwnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29weSc6XG4gICAgY2FzZSAnY3V0JzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6XG4gICAgY2FzZSAncG9pbnRlcmRvd24nOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAncG9pbnRlcnVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDtcblxuICB7XG4gICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLlxuICAgIC8vIEluIHRoZSBwYXN0LCBSZWFjdCBoYXMgYWx3YXlzIGJ1YmJsZWQgdGhlbSwgYnV0IHRoaXMgY2FuIGJlIHN1cnByaXNpbmcuXG4gICAgLy8gV2UncmUgZ29pbmcgdG8gdHJ5IGFsaWduaW5nIGNsb3NlciB0byB0aGUgYnJvd3NlciBiZWhhdmlvciBieSBub3QgYnViYmxpbmdcbiAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuXG4gICAgdmFyIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID0gIWluQ2FwdHVyZVBoYXNlICYmIC8vIFRPRE86IGlkZWFsbHksIHdlJ2QgZXZlbnR1YWxseSBhZGQgYWxsIGV2ZW50cyBmcm9tXG4gICAgLy8gbm9uRGVsZWdhdGVkRXZlbnRzIGxpc3QgaW4gRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG4gICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LlxuICAgIC8vIFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2UgdGhhdCBjYW4gd2FpdCB1bnRpbCBSZWFjdCAxOC5cbiAgICBkb21FdmVudE5hbWUgPT09ICdzY3JvbGwnO1xuXG4gICAgdmFyIF9saXN0ZW5lcnMgPSBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgcmVhY3ROYW1lLCBuYXRpdmVFdmVudC50eXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpO1xuXG4gICAgaWYgKF9saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LlxuICAgICAgdmFyIF9ldmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IF9ldmVudCxcbiAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRvcC1sZXZlbCBzaWRlIGVmZmVjdC5cbnJlZ2lzdGVyU2ltcGxlRXZlbnRzKCk7XG5yZWdpc3RlckV2ZW50cyQyKCk7XG5yZWdpc3RlckV2ZW50cyQxKCk7XG5yZWdpc3RlckV2ZW50cyQzKCk7XG5yZWdpc3RlckV2ZW50cygpO1xuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICAvLyBUT0RPOiB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBjb25jZXB0IG9mIGEgXCJTaW1wbGVFdmVudFBsdWdpblwiLlxuICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbFxuICAvLyB0aGUgb3RoZXIgcGx1Z2lucyBhcmUgZXNzZW50aWFsbHkgcG9seWZpbGxzLiBTbyB0aGUgcGx1Z2luXG4gIC8vIHNob3VsZCBwcm9iYWJseSBiZSBpbmxpbmVkIHNvbWV3aGVyZSBhbmQgaGF2ZSBpdHMgbG9naWNcbiAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93XG4gIC8vIHVzIHRvIHNoaXAgYnVpbGRzIG9mIFJlYWN0IHdpdGhvdXQgdGhlIHBvbHlmaWxsZWQgcGx1Z2lucyBiZWxvdy5cbiAgZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGVcbiAgLy8gZXZlbnQncyBuYXRpdmUgXCJidWJibGVcIiBwaGFzZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSdyZVxuICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGVcbiAgLy8gdGhlIGNhcHR1cmUgcGhhc2UgaGVyZSBzdGlsbC4gVGhpcyBpcyBhIHRyYWRlLW9mZixcbiAgLy8gYmVjYXVzZSBpbiBhbiBpZGVhbCB3b3JsZCB3ZSB3b3VsZCBub3QgZW11bGF0ZSBhbmQgdXNlXG4gIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnRcbiAgLy8gcGx1Z2luLiBIb3dldmVyLCB0aGUgcGx1Z2lucyBiZWxvdyBlaXRoZXIgZXhwZWN0XG4gIC8vIGVtdWxhdGlvbiAoRW50ZXJMZWF2ZSkgb3IgdXNlIHN0YXRlIGxvY2FsaXplZCB0byB0aGF0XG4gIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluXG4gIC8vIHRoZXNlIG1vZHVsZXMgY29tcGxpY2F0ZXMgdGhpbmdzLCBhcyB5b3UnbGwgZXNzZW50aWFsbHlcbiAgLy8gZ2V0IHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIHBoYXNlIGV2ZW50IG1pZ2h0IGNoYW5nZVxuICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpblxuICAvLyBsYXRlciBhbmQgbm90IHRyaWdnZXIgYW55dGhpbmcgYXMgdGhlIHN0YXRlIG5vd1xuICAvLyBpbnZhbGlkYXRlcyB0aGUgaGV1cmlzdGljcyBvZiB0aGUgZXZlbnQgcGx1Z2luLiBXZVxuICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0XG4gIC8vIHRoYXQgbWlnaHQgY2F1c2Ugb3RoZXIgdW5rbm93biBzaWRlLWVmZmVjdHMgdGhhdCB3ZVxuICAvLyBjYW4ndCBmb3Jlc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdyZXNpemUnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdXNwZW5kJywgJ3RpbWV1cGRhdGUnLCAndm9sdW1lY2hhbmdlJywgJ3dhaXRpbmcnXTsgLy8gV2Ugc2hvdWxkIG5vdCBkZWxlZ2F0ZSB0aGVzZSBldmVudHMgdG8gdGhlIGNvbnRhaW5lciwgYnV0IHJhdGhlclxuLy8gc2V0IHRoZW0gb24gdGhlIGFjdHVhbCB0YXJnZXQgZWxlbWVudCBpdHNlbGYuIFRoaXMgaXMgcHJpbWFyaWx5XG4vLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLlxuXG52YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTtcblxuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBkaXNwYXRjaExpc3RlbmVycywgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHByZXZpb3VzSW5zdGFuY2U7XG5cbiAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgZm9yICh2YXIgaSA9IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgX2Rpc3BhdGNoTGlzdGVuZXJzJGkgPSBkaXNwYXRjaExpc3RlbmVyc1tpXSxcbiAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICAgIGxpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkubGlzdGVuZXI7XG5cbiAgICAgIGlmIChpbnN0YW5jZSAhPT0gcHJldmlvdXNJbnN0YW5jZSAmJiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sXG4gICAgICAgICAgX2luc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmluc3RhbmNlLFxuICAgICAgICAgIF9jdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyO1xuXG4gICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIF9saXN0ZW5lciwgX2N1cnJlbnRUYXJnZXQpO1xuICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZGlzcGF0Y2hRdWV1ZSRpID0gZGlzcGF0Y2hRdWV1ZVtpXSxcbiAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnMgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxpc3RlbmVycztcbiAgICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZUl0ZW1zSW5PcmRlcihldmVudCwgbGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSk7IC8vICBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cblxuXG4gIHJldGhyb3dDYXVnaHRFcnJvcigpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTtcbiAgcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyID0gZmFsc2U7XG4gIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG5cbiAgaWYgKCFsaXN0ZW5lclNldC5oYXMobGlzdGVuZXJTZXRLZXkpKSB7XG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgZG9tRXZlbnROYW1lLCBJU19OT05fREVMRUdBVEVELCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbiAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7XG4gIHtcbiAgICBpZiAobm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiIGluIHRoZSBidWJibGUgcGhhc2UuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZG9tRXZlbnROYW1lKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7XG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gIH1cblxuICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7XG59IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlXG52YXIgbGlzdGVuaW5nTWFya2VyID0gJ19yZWFjdExpc3RlbmluZycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcbmZ1bmN0aW9uIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgIHJvb3RDb250YWluZXJFbGVtZW50W2xpc3RlbmluZ01hcmtlcl0gPSB0cnVlO1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0XG4gICAgICAvLyBkb2Vzbid0IGJ1YmJsZSBhbmQgbmVlZHMgdG8gYmUgb24gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKGRvbUV2ZW50TmFtZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcbiAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCB0cnVlLCByb290Q29udGFpbmVyRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChvd25lckRvY3VtZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvblxuICAgICAgLy8gYnV0IGl0IGlzIGF0dGFjaGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgIGlmICghb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoJ3NlbGVjdGlvbmNoYW5nZScsIGZhbHNlLCBvd25lckRvY3VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBhbmNlc3Rvckluc3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIHtcbiAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgIGN1cnJlbnRUYXJnZXQ6IGN1cnJlbnRUYXJnZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgIT09IG51bGwgPyByZWFjdE5hbWUgKyAnQ2FwdHVyZScgOiBudWxsO1xuICB2YXIgcmVhY3RFdmVudE5hbWUgPSBpbkNhcHR1cmVQaGFzZSA/IGNhcHR1cmVOYW1lIDogcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyO1xuICB2YXIgbGFzdEhvc3RDb21wb25lbnQgPSBudWxsOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMi5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTIudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnNcblxuXG4gICAgICBpZiAocmVhY3RFdmVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTtcblxuICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBsYXN0SG9zdENvbXBvbmVudCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBJZiB3ZSBhcmUgb25seSBhY2N1bXVsYXRpbmcgZXZlbnRzIGZvciB0aGUgdGFyZ2V0LCB0aGVuIHdlIGRvbid0XG4gICAgLy8gY29udGludWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggdGhlIFJlYWN0IGZpYmVyIHRyZWUgdG8gZmluZCBvdGhlclxuICAgIC8vIGxpc3RlbmVycy5cblxuXG4gICAgaWYgKGFjY3VtdWxhdGVUYXJnZXRPbmx5KSB7XG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIHdlIGFyZSBwcm9jZXNzaW5nIHRoZSBvbkJlZm9yZUJsdXIgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byB0YWtlXG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuLy8gLSBDaGFuZ2VFdmVudFBsdWdpblxuLy8gLSBTZWxlY3RFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGVzZSBwbHVnaW5zXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLlxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkge1xuICB2YXIgY2FwdHVyZU5hbWUgPSByZWFjdE5hbWUgKyAnQ2FwdHVyZSc7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMyA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UzLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG4gICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVOYW1lKTtcblxuICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3ROYW1lKTtcblxuICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7XG4gIGlmIChpbnN0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkbyB7XG4gICAgaW5zdCA9IGluc3QucmV0dXJuOyAvLyBUT0RPOiBJZiB0aGlzIGlzIGEgSG9zdFJvb3Qgd2UgbWlnaHQgd2FudCB0byBiYWlsIG91dC5cbiAgICAvLyBUaGF0IGlzIGRlcGVuZGluZyBvbiBpZiB3ZSB3YW50IG5lc3RlZCBzdWJ0cmVlcyAobGF5ZXJzKSB0byBidWJibGVcbiAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGVcbiAgICAvLyBob3N0IG5vZGUgYnV0IHRoYXQgd291bGRuJ3Qgd29yayBmb3IgUmVhY3QgTmF0aXZlIGFuZCBkb2Vzbid0IGxldCB1c1xuICAgIC8vIGRvIHRoZSBwb3J0YWwgZmVhdHVyZS5cbiAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7XG5cbiAgaWYgKGluc3QpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gIHZhciBub2RlQSA9IGluc3RBO1xuICB2YXIgbm9kZUIgPSBpbnN0QjtcbiAgdmFyIGRlcHRoQSA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkge1xuICAgIGRlcHRoQSsrO1xuICB9XG5cbiAgdmFyIGRlcHRoQiA9IDA7XG5cbiAgZm9yICh2YXIgdGVtcEIgPSBub2RlQjsgdGVtcEI7IHRlbXBCID0gZ2V0UGFyZW50KHRlbXBCKSkge1xuICAgIGRlcHRoQisrO1xuICB9IC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIGRlcHRoQS0tO1xuICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cblxuXG4gIHdoaWxlIChkZXB0aEIgLSBkZXB0aEEgPiAwKSB7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICAgIGRlcHRoQi0tO1xuICB9IC8vIFdhbGsgaW4gbG9ja3N0ZXAgdW50aWwgd2UgZmluZCBhIG1hdGNoLlxuXG5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuXG4gIHdoaWxlIChkZXB0aC0tKSB7XG4gICAgaWYgKG5vZGVBID09PSBub2RlQiB8fCBub2RlQiAhPT0gbnVsbCAmJiBub2RlQSA9PT0gbm9kZUIuYWx0ZXJuYXRlKSB7XG4gICAgICByZXR1cm4gbm9kZUE7XG4gICAgfVxuXG4gICAgbm9kZUEgPSBnZXRQYXJlbnQobm9kZUEpO1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGV2ZW50LCB0YXJnZXQsIGNvbW1vbiwgaW5DYXB0dXJlUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldDtcblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICBpZiAoaW5zdGFuY2UgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0YW5jZTQgPSBpbnN0YW5jZSxcbiAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2U0LnRhZztcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcblxuICAgICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWluQ2FwdHVyZVBoYXNlKSB7XG4gICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnJldHVybjtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gIH1cbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhpcyBwbHVnaW5cbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy5cblxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGVudGVyRXZlbnQsIGZyb20sIHRvKSB7XG4gIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDtcblxuICBpZiAoZnJvbSAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZnJvbSwgY29tbW9uLCBmYWxzZSk7XG4gIH1cblxuICBpZiAodG8gIT09IG51bGwgJiYgZW50ZXJFdmVudCAhPT0gbnVsbCkge1xuICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkge1xuICByZXR1cm4gZG9tRXZlbnROYW1lICsgXCJfX1wiICsgKGNhcHR1cmUgPyAnY2FwdHVyZScgOiAnYnViYmxlJyk7XG59XG5cbnZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlO1xudmFyIERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbnZhciBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgPSAnc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nJztcbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnO1xudmFyIEFVVE9GT0NVUyA9ICdhdXRvRm9jdXMnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCQxID0gJ19faHRtbCc7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDtcbnZhciB3YXJuRm9yUHJvcERpZmZlcmVuY2U7XG52YXIgd2FybkZvckV4dHJhQXR0cmlidXRlcztcbnZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7XG52YXIgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZztcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKSA6IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhwYXJlbnQubmFtZXNwYWNlVVJJLCBwYXJlbnQudGFnTmFtZSk7XG4gICAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MO1xuICB9O1xufSAvLyBIVE1MIHBhcnNpbmcgbm9ybWFsaXplcyBDUiBhbmQgQ1JMRiB0byBMRi5cbi8vIEl0IGFsc28gY2FuIHR1cm4gXFx1MDAwMCBpbnRvIFxcdUZGRkQgaW5zaWRlIGF0dHJpYnV0ZXMuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbi8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuXG4vLyBXZSB3aWxsIHN0aWxsIHBhdGNoIHVwIGluIHRoaXMgY2FzZSBidXQgbm90IGZpcmUgdGhlIHdhcm5pbmcuXG5cblxudmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cXHJcXG4/L2c7XG52YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG5mdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7XG4gIHtcbiAgICBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbihtYXJrdXApO1xuICB9XG5cbiAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7XG4gIHJldHVybiBtYXJrdXBTdHJpbmcucmVwbGFjZShOT1JNQUxJWkVfTkVXTElORVNfUkVHRVgsICdcXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpO1xufVxuXG5mdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldikge1xuICB2YXIgbm9ybWFsaXplZENsaWVudFRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VGV4dCk7XG4gIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTtcblxuICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGV4dCBjb250ZW50IGRpZCBub3QgbWF0Y2guIFNlcnZlcjogXCIlc1wiIENsaWVudDogXCIlc1wiJywgbm9ybWFsaXplZFNlcnZlclRleHQsIG5vcm1hbGl6ZWRDbGllbnRUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaXNDb25jdXJyZW50TW9kZSAmJiBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoKSB7XG4gICAgLy8gSW4gY29uY3VycmVudCByb290cywgd2UgdGhyb3cgd2hlbiB0aGVyZSdzIGEgdGV4dCBtaXNtYXRjaCBhbmQgcmV2ZXJ0IHRvXG4gICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXh0IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggc2VydmVyLXJlbmRlcmVkIEhUTUwuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJFbGVtZW50IDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KG5vZGUpIHtcbiAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb25cbiAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS5cbiAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gIC8vIEp1c3Qgc2V0IGl0IHVzaW5nIHRoZSBvbmNsaWNrIHByb3BlcnR5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBtYW5hZ2UgYW55XG4gIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpc1xuICAvLyByZW1vdmVkLlxuICAvLyBUT0RPOiBPbmx5IGRvIHRoaXMgZm9yIHRoZSByZWxldmFudCBTYWZhcmlzIG1heWJlP1xuICBub2RlLm9uY2xpY2sgPSBub29wO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBuZXh0UHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGZvciAodmFyIHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXh0UHJvcCA9IG5leHRQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAvLyBGcmVlemUgdGhlIG5leHQgc3R5bGUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBiZVxuICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuXG4gICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG5cblxuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgPHRleHRhcmVhPiB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIDx0ZXh0YXJlYT4gdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgdmFyIGNhblNldFRleHRDb250ZW50ID0gdGFnICE9PSAndGV4dGFyZWEnIHx8IG5leHRQcm9wICE9PSAnJztcblxuICAgICAgICBpZiAoY2FuU2V0VGV4dENvbnRlbnQpIHtcbiAgICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyArIG5leHRQcm9wKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BLZXkgPT09ICdvblNjcm9sbCcpIHtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVET01Qcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHdhc0N1c3RvbUNvbXBvbmVudFRhZywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgLy8gVE9ETzogSGFuZGxlIHdhc0N1c3RvbUNvbXBvbmVudFRhZ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgcHJvcEtleSA9IHVwZGF0ZVBheWxvYWRbaV07XG4gICAgdmFyIHByb3BWYWx1ZSA9IHVwZGF0ZVBheWxvYWRbaSArIDFdO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnOyAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cblxuICB2YXIgb3duZXJEb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHZhciBkb21FbGVtZW50O1xuICB2YXIgbmFtZXNwYWNlVVJJID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gIGlmIChuYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICB7XG4gICAgICBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKTsgLy8gU2hvdWxkIHRoaXMgY2hlY2sgYmUgZ2F0ZWQgYnkgcGFyZW50IG5hbWVzcGFjZT8gTm90IHN1cmUgd2Ugd2FudCB0b1xuICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LlxuXG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBlcnJvcignPCVzIC8+IGlzIHVzaW5nIGluY29ycmVjdCBjYXNpbmcuICcgKyAnVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsICcgKyAnb3IgbG93ZXJjYXNlIGZvciBIVE1MIGVsZW1lbnRzLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnc2NyaXB0Jykge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBzY3JpcHQgdmlhIC5pbm5lckhUTUwgc28gaXRzIFwicGFyc2VyLWluc2VydGVkXCIgZmxhZyBpc1xuICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBkaXYuaW5uZXJIVE1MID0gJzxzY3JpcHQ+PCcgKyAnL3NjcmlwdD4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8geWllbGQgYSBzY3JpcHQgZWxlbWVudC5cblxuICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBkaXYuZmlyc3RDaGlsZDtcbiAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAkRmxvd0lzc3VlIGBjcmVhdGVFbGVtZW50YCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgV2ViIENvbXBvbmVudHNcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwge1xuICAgICAgICBpczogcHJvcHMuaXNcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXBhcmF0ZSBlbHNlIGJyYW5jaCBpbnN0ZWFkIG9mIHVzaW5nIGBwcm9wcy5pcyB8fCB1bmRlZmluZWRgIGFib3ZlIGJlY2F1c2Ugb2YgYSBGaXJlZm94IGJ1Zy5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSk7IC8vIE5vcm1hbGx5IGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGluIGBzZXRJbml0aWFsRE9NUHJvcGVydGllc2AsIGhvd2V2ZXIgdGhlIGBtdWx0aXBsZWAgYW5kIGBzaXplYFxuICAgICAgLy8gYXR0cmlidXRlcyBvbiBgc2VsZWN0YHMgbmVlZHMgdG8gYmUgYWRkZWQgYmVmb3JlIGBvcHRpb25gcyBhcmUgaW5zZXJ0ZWQuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzOlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgZG9lcyBub3Qgc2Nyb2xsIHRvIHRoZSBjb3JyZWN0IG9wdGlvbiBiZWNhdXNlIHNpbmd1bGFyXG4gICAgICAvLyAgYHNlbGVjdGAgZWxlbWVudHMgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBpdGVtICMxMzIyMlxuICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzIyMlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQyMzlcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDtcblxuICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgICAgICBub2RlLm11bHRpcGxlID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5zaXplKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmVcbiAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5vIG9wdGlvbiBpcyBzZWxlY3RlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiBcInNpbmdsZSBzZWxlY3Rpb24gbW9kZVwiLlxuICAgICAgICAgIG5vZGUuc2l6ZSA9IHByb3BzLnNpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgdHlwZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRvbUVsZW1lbnQpID09PSAnW29iamVjdCBIVE1MVW5rbm93bkVsZW1lbnRdJyAmJiAhaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpO1xuICBzZXRJbml0aWFsRE9NUHJvcGVydGllcyh0YWcsIGRvbUVsZW1lbnQsIHJvb3RDb250YWluZXJFbGVtZW50LCBwcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cbn0gLy8gQ2FsY3VsYXRlIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuXG5mdW5jdGlvbiBkaWZmUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7XG4gIHZhciBsYXN0UHJvcHM7XG4gIHZhciBuZXh0UHJvcHM7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgcHJvcGVydHkgd2UgYWx3YXlzIGFkZCBpdCB0byB0aGUgcXVldWUgYW5kIHRoZW4gd2VcbiAgICAgIC8vIGZpbHRlciBpdCBvdXQgdXNpbmcgdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBkdXJpbmcgdGhlIGNvbW1pdC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgIHtcbiAgICAgIHZhbGlkYXRlU2hvcnRoYW5kUHJvcGVydHlDb2xsaXNpb25JbkRldihzdHlsZVVwZGF0ZXMsIG5leHRQcm9wc1tTVFlMRV0pO1xuICAgIH1cblxuICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChTVFlMRSwgc3R5bGVVcGRhdGVzKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufSAvLyBBcHBseSB0aGUgZGlmZi5cblxuZnVuY3Rpb24gdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0YWcsIGxhc3RSYXdQcm9wcywgbmV4dFJhd1Byb3BzKSB7XG4gIC8vIFVwZGF0ZSBjaGVja2VkICpiZWZvcmUqIG5hbWUuXG4gIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuXG4gIC8vIFdoZW4gYSBjaGVja2VkIHJhZGlvIHRyaWVzIHRvIGNoYW5nZSBuYW1lLCBicm93c2VyIG1ha2VzIGFub3RoZXIgcmFkaW8ncyBjaGVja2VkIGZhbHNlLlxuICBpZiAodGFnID09PSAnaW5wdXQnICYmIG5leHRSYXdQcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5leHRSYXdQcm9wcy5uYW1lICE9IG51bGwpIHtcbiAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gIH1cblxuICB2YXIgd2FzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCBsYXN0UmF3UHJvcHMpO1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIG5leHRSYXdQcm9wcyk7IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG4gIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7IC8vIFRPRE86IEVuc3VyZSB0aGF0IGFuIHVwZGF0ZSBnZXRzIHNjaGVkdWxlZCBpZiBhbnkgb2YgdGhlIHNwZWNpYWwgcHJvcHNcbiAgLy8gY2hhbmdlZC5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgIHVwZGF0ZVdyYXBwZXIoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgdXBkYXRlV3JhcHBlciQxKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW5cbiAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICBwb3N0VXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcE5hbWUpIHtcbiAge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZztcbiAgdmFyIGV4dHJhQXR0cmlidXRlTmFtZXM7XG5cbiAge1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgdmFsaWRhdGVQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2NoZWNrZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZXNbX2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcblxuICBmb3IgKHZhciBwcm9wS2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCFyYXdQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gcmF3UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgY2hpbGRyZW4gd2UgY29tcGFyZSBhZ2FpbnN0IHRleHRDb250ZW50LiBUaGlzXG4gICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nXG4gICAgICAvLyB0ZXh0Q29udGVudC4gRS5nLiBcImZvb1wiIHdpbGwgbWF0Y2ggXCJmPHNwYW4+b288L3NwYW4+XCIgYnV0IHRoYXQgc3RpbGxcbiAgICAgIC8vIHNhdGlzZmllcyBvdXIgcmVxdWlyZW1lbnQuIE91ciByZXF1aXJlbWVudCBpcyBub3QgdG8gcHJvZHVjZSBwZXJmZWN0XG4gICAgICAvLyBIVE1MIGFuZCBhdHRyaWJ1dGVzLiBJZGVhbGx5IHdlIHNob3VsZCBwcmVzZXJ2ZSBzdHJ1Y3R1cmUgYnV0IGl0J3NcbiAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0XG4gICAgICAvLyBldmVuIGxpc3RlbmVycyB0aGVzZSBub2RlcyBtaWdodCBiZSB3aXJlZCB1cCB0by5cbiAgICAgIC8vIFRPRE86IFdhcm4gaWYgdGhlcmUgaXMgbW9yZSB0aGFuIGEgc2luZ2xlIHRleHROb2RlIGFzIGEgY2hpbGQuXG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT9cbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09ICcnICsgbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRXYXJuRGV2ICYmIHRydWUgJiYgLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0ID8gbnVsbCA6IGdldFByb3BlcnR5SW5mbyhwcm9wS2V5KTtcblxuICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSA9PT0gdHJ1ZSkgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgfHwgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cbiAgICAgIHByb3BLZXkgPT09ICd2YWx1ZScgfHwgcHJvcEtleSA9PT0gJ2NoZWNrZWQnIHx8IHByb3BLZXkgPT09ICdzZWxlY3RlZCcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHtcbiAgICAgICAgdmFyIHNlcnZlckhUTUwgPSBkb21FbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkSFRNTCA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkSFRNTCAhPT0gc2VydmVySFRNTCkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlckhUTUwsIGV4cGVjdGVkSFRNTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG5cbiAgICAgICAgaWYgKGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRTdHlsZSA9IGNyZWF0ZURhbmdlcm91c1N0cmluZ0ZvclN0eWxlcyhuZXh0UHJvcCk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBleHBlY3RlZFN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgJiYgIWVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wKTtcblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZElnbm9yZUF0dHJpYnV0ZShwcm9wS2V5LCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSAmJiAhc2hvdWxkUmVtb3ZlQXR0cmlidXRlKHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkge1xuICAgICAgICB2YXIgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBwcm9wZXJ0eUluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wS2V5KTtcblxuICAgICAgICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbnVsbCAmJiBzdGFuZGFyZE5hbWUgIT09IHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYW4gU1ZHIHByb3AgaXMgc3VwcGxpZWQgd2l0aCBiYWQgY2FzaW5nLCBpdCB3aWxsXG4gICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgLy8gKGFuZCB3b3VsZCBiZSBpbmNvcnJlY3RseSByZW5kZXJlZCBvbiB0aGUgY2xpZW50KS5cbiAgICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgYWxyZWFkeSB3YXJuIGFib3V0IGJhZCBjYXNpbmcgZWxzZXdoZXJlLlxuICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSB0cnVlOyAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cbiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUoc3RhbmRhcmROYW1lKTtcbiAgICAgICAgICAgIH0gLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuXG5cbiAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDtcblxuICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRXYXJuRGV2KSB7XG4gICAgICBpZiAoIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIDwlcz4gaW4gPCVzPi4nLCBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGNoaWxkKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRGlkIG5vdCBleHBlY3Qgc2VydmVyIEhUTUwgdG8gY29udGFpbiB0aGUgdGV4dCBub2RlIFwiJXNcIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFeHBlY3RlZCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgbWF0Y2hpbmcgPCVzPiBpbiA8JXM+LicsIHRhZywgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAge1xuICAgIGlmICh0ZXh0ID09PSAnJykge1xuICAgICAgLy8gV2UgZXhwZWN0IHRvIGluc2VydCBlbXB0eSB0ZXh0IG5vZGVzIHNpbmNlIHRoZXkncmUgbm90IHJlcHJlc2VudGVkIGluXG4gICAgICAvLyB0aGUgSFRNTC5cbiAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHlcbiAgICAgIC8vIHRleHQgbm9kZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyB0ZXh0IG5vZGUgZm9yIFwiJXNcIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMShkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG4gIH1cbn1cblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uICgpIHt9O1xuXG57XG4gIC8vIFRoaXMgdmFsaWRhdGlvbiBjb2RlIHdhcyB3cml0dGVuIGJhc2VkIG9uIHRoZSBIVE1MNSBwYXJzaW5nIHNwZWM6XG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgY2F0Y2ggYWxsIGludmFsaWQgbmVzdGluZywgbm9yIGRvZXMgaXQgdHJ5IHRvIChhcyBpdCdzXG4gIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5XG4gIC8vIGZvciBjYXNlcyB3aGVyZSB0aGUgcGFyc2VyIHdpbGwgZ2l2ZSBhIHBhcnNlIHRyZWUgZGlmZmVyaW5nIGZyb20gd2hhdCBSZWFjdFxuICAvLyBpbnRlbmRlZC4gRm9yIGV4YW1wbGUsIDxiPjxkaXY+PC9kaXY+PC9iPiBpcyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCB3YXJuXG4gIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWRcbiAgLy8gPHA+IHRhZ3Mgd2hlcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIGVsZW1lbnQgaW1wbGljaXRseSBjbG9zZXMgdGhlXG4gIC8vIGZpcnN0LCBjYXVzaW5nIGEgY29uZnVzaW5nIG1lc3MuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1idXR0b24tc2NvcGVcblxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pOyAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNnZW5lcmF0ZS1pbXBsaWVkLWVuZC10YWdzXG5cbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuICB2YXIgZW1wdHlBbmNlc3RvckluZm8gPSB7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnKSB7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJztcbnZhciBTVVNQRU5TRV9FTkRfREFUQSA9ICcvJCc7XG52YXIgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gJyQ/JztcbnZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJztcbnZhciBTVFlMRSQxID0gJ3N0eWxlJztcbnZhciBldmVudHNFbmFibGVkID0gbnVsbDtcbnZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRleHQocm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHZhciB0eXBlO1xuICB2YXIgbmFtZXNwYWNlO1xuICB2YXIgbm9kZVR5cGUgPSByb290Q29udGFpbmVySW5zdGFuY2Uubm9kZVR5cGU7XG5cbiAgc3dpdGNoIChub2RlVHlwZSkge1xuICAgIGNhc2UgRE9DVU1FTlRfTk9ERTpcbiAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6XG4gICAgICB7XG4gICAgICAgIHR5cGUgPSBub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/ICcjZG9jdW1lbnQnIDogJyNmcmFnbWVudCc7XG4gICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgbmFtZXNwYWNlID0gcm9vdCA/IHJvb3QubmFtZXNwYWNlVVJJIDogZ2V0Q2hpbGROYW1lc3BhY2UobnVsbCwgJycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckluc3RhbmNlLnBhcmVudE5vZGUgOiByb290Q29udGFpbmVySW5zdGFuY2U7XG4gICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7XG4gICAgICAgIHR5cGUgPSBjb250YWluZXIudGFnTmFtZTtcbiAgICAgICAgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2Uob3duTmFtZXNwYWNlLCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCB2YWxpZGF0ZWRUYWcpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGRIb3N0Q29udGV4dChwYXJlbnRIb3N0Q29udGV4dCwgdHlwZSwgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gIHtcbiAgICB2YXIgcGFyZW50SG9zdENvbnRleHREZXYgPSBwYXJlbnRIb3N0Q29udGV4dDtcbiAgICB2YXIgbmFtZXNwYWNlID0gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50SG9zdENvbnRleHREZXYubmFtZXNwYWNlLCB0eXBlKTtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gcHJlcGFyZUZvckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIGV2ZW50c0VuYWJsZWQgPSBpc0VuYWJsZWQoKTtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpO1xuICB2YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xuXG4gIHNldEVuYWJsZWQoZmFsc2UpO1xuICByZXR1cm4gYWN0aXZlSW5zdGFuY2U7XG59XG5mdW5jdGlvbiByZXNldEFmdGVyQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgcmVzdG9yZVNlbGVjdGlvbihzZWxlY3Rpb25JbmZvcm1hdGlvbik7XG4gIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7XG4gIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLlxuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBudWxsLCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG5cbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICB2YXIgZG9tRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgcGFyZW50TmFtZXNwYWNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgZG9tRWxlbWVudCk7XG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcbiAgc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpIHtcbiAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICBpZiAoY3VycmVudEV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICByZXR1cm4gZ2V0RXZlbnRQcmlvcml0eShjdXJyZW50RXZlbnQudHlwZSk7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xO1xudmFyIGxvY2FsUHJvbWlzZSA9IHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nID8gUHJvbWlzZSA6IHVuZGVmaW5lZDsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHNjaGVkdWxlTWljcm90YXNrID0gdHlwZW9mIHF1ZXVlTWljcm90YXNrID09PSAnZnVuY3Rpb24nID8gcXVldWVNaWNyb3Rhc2sgOiB0eXBlb2YgbG9jYWxQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTtcbn0gOiBzY2hlZHVsZVRpbWVvdXQ7IC8vIFRPRE86IERldGVybWluZSB0aGUgYmVzdCBmYWxsYmFjayBoZXJlLlxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvckluTmV4dFRpY2soZXJyb3IpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykge1xuICAgICAgICBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICB7XG4gICAgICAgIGlmIChuZXdQcm9wcy5zcmMpIHtcbiAgICAgICAgICBkb21FbGVtZW50LnNyYyA9IG5ld1Byb3BzLnNyYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBBcHBseSB0aGUgZGlmZiB0byB0aGUgRE9NIG5vZGUuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoXG4gIC8vIHdpdGggY3VycmVudCBldmVudCBoYW5kbGVycy5cblxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShwYXJlbnRJbnN0YW5jZSwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7IC8vIERlbGV0ZSBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgZG8ge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7XG5cbiAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cbiAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnlGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLnBhcmVudE5vZGUsIHN1c3BlbnNlSW5zdGFuY2UpO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gaGlkZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZVxuICAvLyBwYXNzIGhvc3QgY29udGV4dCB0byB0aGlzIG1ldGhvZD9cbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7XG5cbiAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnLCAnaW1wb3J0YW50Jyk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxufVxuZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9ICcnO1xufVxuZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZVByb3AgPSBwcm9wc1tTVFlMRSQxXTtcbiAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7XG4gIGluc3RhbmNlLnN0eWxlLmRpc3BsYXkgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKCdkaXNwbGF5JywgZGlzcGxheSk7XG59XG5mdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSB0ZXh0O1xufVxuZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci50ZXh0Q29udGVudCA9ICcnO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIGlmIChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBFTEVNRU5UX05PREUgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKGluc3RhbmNlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJyB8fCBpbnN0YW5jZS5ub2RlVHlwZSAhPT0gVEVYVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSB0ZXh0IG5vZGUuXG5cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgc3VzcGVuc2Ugbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKGluc3RhbmNlKSB7XG4gIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDtcbiAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgaWYgKGRhdGFzZXQpIHtcbiAgICBkaWdlc3QgPSBkYXRhc2V0LmRnc3Q7XG5cbiAgICB7XG4gICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gICAgICBzdGFjayA9IGRhdGFzZXQuc3RjaztcbiAgICB9XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBkaWdlc3Q6IGRpZ2VzdCxcbiAgICAgIHN0YWNrOiBzdGFja1xuICAgIH07XG4gIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTtcbiAgLy8gY29uc3QgbmV4dFNpYmxpbmcgPSBpbnN0YW5jZS5uZXh0U2libGluZztcbiAgLy8gaWYgKG5leHRTaWJsaW5nKSB7XG4gIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7XG4gIC8vICAgdmFsdWUubWVzc2FnZSA9IGRhdGFzZXQubXNnO1xuICAvLyAgIHZhbHVlLmhhc2ggPSBkYXRhc2V0Lmhhc2g7XG4gIC8vICAgaWYgKHRydWUpIHtcbiAgLy8gICAgIHZhbHVlLnN0YWNrID0gZGF0YXNldC5zdGFjaztcbiAgLy8gICB9XG4gIC8vIH1cbiAgLy8gcmV0dXJuIHZhbHVlO1xuXG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lP1xuLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgaXQgeWV0IHRvIGRlcmlzayB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZVxuLy8gdGhlIHdheSB3ZSBwdXNoL3BvcCB0aGVzZSB2YWx1ZXMgaXMgYSBiaXQgdW51c3VhbC4gSWYgdGhlcmUncyBhIG1pc3Rha2UsIEknZFxuLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci5cbnZhciBmb3JrU3RhY2sgPSBbXTtcbnZhciBmb3JrU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUZvcmtDb3VudCA9IDA7XG52YXIgaWRTdGFjayA9IFtdO1xudmFyIGlkU3RhY2tJbmRleCA9IDA7XG52YXIgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGw7XG52YXIgdHJlZUNvbnRleHRJZCA9IDE7XG52YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnO1xuZnVuY3Rpb24gaXNGb3JrZWRDaGlsZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7XG59XG5mdW5jdGlvbiBnZXRGb3Jrc0F0TGV2ZWwod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiB0cmVlRm9ya0NvdW50O1xufVxuZnVuY3Rpb24gZ2V0VHJlZUlkKCkge1xuICB2YXIgb3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICB2YXIgaWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTtcbiAgcmV0dXJuIGlkLnRvU3RyaW5nKDMyKSArIG92ZXJmbG93O1xufVxuZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIHJlY29uY2lsZSBhbiBhcnJheSAob3IgaXRlcmF0b3IpIG9mIGNoaWxkXG4gIC8vIGZpYmVycywgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2Uga25vdyBob3cgbWFueSBjaGlsZHJlbiBpblxuICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWxcbiAgLy8gaW5mb3JtYXRpb24gb24gdGhlIGZpYmVyLlxuICAvL1xuICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIFx1MjAxNCBpdCdzIGNhbGxlZCBkdXJpbmdcbiAgLy8gdGhlIHJlbmRlciBwaGFzZSBvZiB0aGUgZm9yayBwYXJlbnQsIG5vdCB0aGUgY2hpbGQsIHdoaWNoIGlzIHdoZXJlIHdlIHB1c2hcbiAgLy8gdGhlIG90aGVyIGNvbnRleHQgdmFsdWVzLlxuICAvL1xuICAvLyBJbiB0aGUgRml6eiBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIG11Y2ggc2ltcGxlciBiZWNhdXNlIHRoZSBjaGlsZCBpc1xuICAvLyByZW5kZXJlZCBpbiB0aGUgc2FtZSBjYWxsc3RhY2sgYXMgdGhlIHBhcmVudC5cbiAgLy9cbiAgLy8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgYWRkIGEgYGZvcmtzYCBmaWVsZCB0byB0aGUgRmliZXIgdHlwZS4gSXQgd291bGRcbiAgLy8gbWFrZSB0aGlzIG1vZHVsZSBzaW1wbGVyLlxuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtQcm92aWRlcjtcbiAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7XG4gIHZhciBiYXNlT3ZlcmZsb3cgPSB0cmVlQ29udGV4dE92ZXJmbG93OyAvLyBUaGUgbGVmdG1vc3QgMSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSwgbm9uLWluY2x1c2l2ZS4gSXQncyBub3QgcGFydFxuICAvLyBvZiB0aGUgaWQ7IHdlIHVzZSBpdCB0byBhY2NvdW50IGZvciBsZWFkaW5nIDBzLlxuXG4gIHZhciBiYXNlTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKGJhc2VJZFdpdGhMZWFkaW5nQml0KSAtIDE7XG4gIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTtcbiAgdmFyIHNsb3QgPSBpbmRleCArIDE7XG4gIHZhciBsZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoOyAvLyAzMCBpcyB0aGUgbWF4IGxlbmd0aCB3ZSBjYW4gc3RvcmUgd2l0aG91dCBvdmVyZmxvd2luZywgdGFraW5nIGludG9cbiAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLlxuXG4gIGlmIChsZW5ndGggPiAzMCkge1xuICAgIC8vIFdlIG92ZXJmbG93ZWQgdGhlIGJpdHdpc2Utc2FmZSByYW5nZS4gRmFsbCBiYWNrIHRvIHNsb3dlciBhbGdvcml0aG0uXG4gICAgLy8gVGhpcyBicmFuY2ggYXNzdW1lcyB0aGUgbGVuZ3RoIG9mIHRoZSBiYXNlIGlkIGlzIGdyZWF0ZXIgdGhhbiA1OyBpdCB3b24ndFxuICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLlxuICAgIC8vXG4gICAgLy8gV2UgZW5jb2RlIHRoZSBpZCBpbiBtdWx0aXBsZSBzdGVwczogZmlyc3QgdGhlIGJhc2UgaWQsIHRoZW4gdGhlXG4gICAgLy8gcmVtYWluaW5nIGRpZ2l0cy5cbiAgICAvL1xuICAgIC8vIEVhY2ggNSBiaXQgc2VxdWVuY2UgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgYmFzZSAzMiBjaGFyYWN0ZXIuIFNvIGZvclxuICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2VcbiAgICAvLyBiaXRzIGludG8gYSBzdHJpbmcgb2YgNCBjaGFyYWN0ZXJzLCB3aXRoIDMgYml0cyBsZWZ0IG92ZXIuXG4gICAgLy9cbiAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZVxuICAgIC8vIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAgdmFyIG51bWJlck9mT3ZlcmZsb3dCaXRzID0gYmFzZUxlbmd0aCAtIGJhc2VMZW5ndGggJSA1OyAvLyBUaGVuIGNyZWF0ZSBhIGJpdG1hc2sgdGhhdCBzZWxlY3RzIG9ubHkgdGhvc2UgYml0cy5cblxuICAgIHZhciBuZXdPdmVyZmxvd0JpdHMgPSAoMSA8PCBudW1iZXJPZk92ZXJmbG93Qml0cykgLSAxOyAvLyBTZWxlY3QgdGhlIGJpdHMsIGFuZCBjb252ZXJ0IHRoZW0gdG8gYSBiYXNlIDMyIHN0cmluZy5cblxuICAgIHZhciBuZXdPdmVyZmxvdyA9IChiYXNlSWQgJiBuZXdPdmVyZmxvd0JpdHMpLnRvU3RyaW5nKDMyKTsgLy8gTm93IHdlIGNhbiByZW1vdmUgdGhvc2UgYml0cyBmcm9tIHRoZSBiYXNlIGlkLlxuXG4gICAgdmFyIHJlc3RPZkJhc2VJZCA9IGJhc2VJZCA+PiBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlXG4gICAgLy8gd2UgbWFkZSBtb3JlIHJvb20sIHRoaXMgdGltZSBpdCB3b24ndCBvdmVyZmxvdy5cblxuICAgIHZhciByZXN0T2ZMZW5ndGggPSBnZXRCaXRMZW5ndGgodG90YWxDaGlsZHJlbikgKyByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciByZXN0T2ZOZXdCaXRzID0gc2xvdCA8PCByZXN0T2ZCYXNlTGVuZ3RoO1xuICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7XG4gICAgdmFyIG92ZXJmbG93ID0gbmV3T3ZlcmZsb3cgKyBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgcmVzdE9mTGVuZ3RoIHwgaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vcm1hbCBwYXRoXG4gICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7XG5cbiAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDtcblxuICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7XG4gICAgdHJlZUNvbnRleHRJZCA9IDEgPDwgbGVuZ3RoIHwgX2lkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBfb3ZlcmZsb3c7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyXG4gIC8vIGluIGl0cyBjaGlsZHJlbi5cblxuICB2YXIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgdmFyIG51bWJlck9mRm9ya3MgPSAxO1xuICAgIHZhciBzbG90SW5kZXggPSAwO1xuICAgIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCaXRMZW5ndGgobnVtYmVyKSB7XG4gIHJldHVybiAzMiAtIGNsejMyKG51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHtcbiAgcmV0dXJuIDEgPDwgZ2V0Qml0TGVuZ3RoKGlkKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy5cbiAgLy8gVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gb3RoZXIgY29udGV4dC1saWtlIG1vZHVsZXMgaW4gRmliZXJcbiAgLy8gYmVjYXVzZSB0aGUgc2FtZSBGaWJlciBtYXkgYXBwZWFyIG9uIHRoZSBzdGFjayBtdWx0aXBsZSB0aW1lcyBhbmQgZm9yXG4gIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpc1xuICAvLyBubyBsb25nZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2suXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcikge1xuICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcikge1xuICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTtcbiAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG5cbiAgaWYgKHRyZWVDb250ZXh0UHJvdmlkZXIgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRyZWVDb250ZXh0SWQsXG4gICAgICBvdmVyZmxvdzogdHJlZUNvbnRleHRPdmVyZmxvd1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRJZCA9IHN1c3BlbmRlZENvbnRleHQuaWQ7XG4gIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZk5vdEh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgJyArICdhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtYXkgaGF2ZSBiZWVuIGFuIGluc2VydGlvbiBvciBhIGh5ZHJhdGlvbi5cblxudmFyIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbnZhciBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlc1xuLy8gZHVlIHRvIGVhcmxpZXIgbWlzbWF0Y2hlcyBvciBhIHN1c3BlbmRlZCBmaWJlci5cblxudmFyIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7IC8vIEh5ZHJhdGlvbiBlcnJvcnMgdGhhdCB3ZXJlIHRocm93biBpbnNpZGUgdGhpcyBib3VuZGFyeVxuXG52YXIgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcblxuZnVuY3Rpb24gd2FybklmSHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICBlcnJvcignV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFN1c3BlbmRPckVycm9yREVWO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVudGVySHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICB2YXIgcGFyZW50SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudEluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyLCBzdXNwZW5zZUluc3RhbmNlLCB0cmVlQ29udGV4dCkge1xuXG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcblxuICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHtcbiAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQoZmliZXIsIHRyZWVDb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlKHJldHVybkZpYmVyLnR5cGUsIHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHMsIHJldHVybkZpYmVyLnN0YXRlTm9kZSwgaW5zdGFuY2UsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCwgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpO1xuICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCk7XG4gIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gIGNoaWxkVG9EZWxldGUucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gIHZhciBkZWxldGlvbnMgPSByZXR1cm5GaWJlci5kZWxldGlvbnM7XG5cbiAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICB7XG4gICAgaWYgKGRpZFN1c3BlbmRPckVycm9yREVWKSB7XG4gICAgICAvLyBJbnNpZGUgYSBib3VuZGFyeSB0aGF0IGFscmVhZHkgc3VzcGVuZGVkLiBXZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZVxuICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmdcbiAgICAgIC8vIGRhdGEsIHNvIGl0J3MgcHJvYmFibHkgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0ZXh0KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90eXBlLCBfcHJvcHMsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhciBfdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcblxuICAgICAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIF90ZXh0LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgICBpZiAoX3BhcmVudEluc3RhbmNlICE9PSBudWxsKSBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgdmFyIF9wcm9wczIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3R5cGUyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciBfdGV4dDIgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90ZXh0Mik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIGZpYmVyLmZsYWdzID0gZmliZXIuZmxhZ3MgJiB+SHlkcmF0aW5nIHwgUGxhY2VtZW50O1xuICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChpbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UobmV4dEluc3RhbmNlLCB0ZXh0KTtcblxuICAgICAgICBpZiAodGV4dEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gdGV4dEluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gY2FuSHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2UobmV4dEluc3RhbmNlKTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0ge1xuICAgICAgICAgICAgZGVoeWRyYXRlZDogc3VzcGVuc2VJbnN0YW5jZSxcbiAgICAgICAgICAgIHRyZWVDb250ZXh0OiBnZXRTdXNwZW5kZWRUcmVlQ29udGV4dCgpLFxuICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gc3VzcGVuc2VTdGF0ZTsgLy8gU3RvcmUgdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQgYXMgYSBjaGlsZCBmaWJlci5cbiAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcyxcbiAgICAgICAgICAvLyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgdG8gY29uc2lkZXIgYWxsIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSdyZSBkZWh5ZHJhdGVkIG9uZXMgb3Igbm90LlxuXG4gICAgICAgICAgdmFyIGRlaHlkcmF0ZWRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChzdXNwZW5zZUluc3RhbmNlKTtcbiAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7XG4gICAgICAgICAgZmliZXIuY2hpbGQgPSBkZWh5ZHJhdGVkRnJhZ21lbnQ7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gV2hpbGUgYSBTdXNwZW5zZSBJbnN0YW5jZSBkb2VzIGhhdmUgY2hpbGRyZW4sIHdlIHdvbid0IHN0ZXAgaW50b1xuICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7XG4gIHJldHVybiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmIChmaWJlci5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzO1xufVxuXG5mdW5jdGlvbiB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpO1xufVxuXG5mdW5jdGlvbiB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZShmaWJlcikge1xuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgaWYgKCFuZXh0SW5zdGFuY2UpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG5cblxuICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UgPSBuZXh0SW5zdGFuY2U7XG5cbiAgaWYgKCF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAvLyBXZSB1c2UgdGhpcyBhcyBhIGhldXJpc3RpYy4gSXQncyBiYXNlZCBvbiBpbnR1aXRpb24gYW5kIG5vdCBkYXRhIHNvIGl0XG4gICAgLy8gbWlnaHQgYmUgZmxhd2VkIG9yIHVubmVjZXNzYXJ5LlxuXG5cbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gICAgdmFyIHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIsIGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHtcblxuICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRXYXJuSWZNaXNtYXRjaERldiA9ICFkaWRTdXNwZW5kT3JFcnJvckRFVjtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyLCBzaG91bGRXYXJuSWZNaXNtYXRjaERldik7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gIGZpYmVyLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLlxuXG4gIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHRleHRDb250ZW50ID0gZmliZXIubWVtb2l6ZWRQcm9wcztcbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgZmliZXIpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZVxuICAgIC8vIGh5ZHJhdGlvbiBwYXJlbnQgaXMgdGhlIHBhcmVudCBob3N0IGNvbXBvbmVudCBvZiB0aGlzIGhvc3QgdGV4dC5cbiAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0U3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikge1xuICB2YXIgcGFyZW50ID0gZmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgcGFyZW50LnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Um9vdCAmJiBwYXJlbnQudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDtcbn1cblxuZnVuY3Rpb24gcG9wSHlkcmF0aW9uU3RhdGUoZmliZXIpIHtcblxuICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSB7XG4gICAgLy8gV2UncmUgZGVlcGVyIHRoYW4gdGhlIGN1cnJlbnQgaHlkcmF0aW9uIGNvbnRleHQsIGluc2lkZSBhbiBpbnNlcnRlZFxuICAgIC8vIHRyZWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuXG4gICAgLy8gd2Ugd2VyZSBhbiBpbnNlcnRpb24gYW5kIG5vdyBuZWVkIHRvIHBvcCB1cCByZWVudGVyIGh5ZHJhdGlvbiBvZiBvdXJcbiAgICAvLyBzaWJsaW5ncy5cbiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcbiAgICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy5cbiAgLy8gV2Ugb25seSBkbyB0aGlzIGRlZXBlciB0aGFuIGhlYWQgYW5kIGJvZHkgc2luY2UgdGhleSB0ZW5kIHRvIGhhdmUgcmFuZG9tXG4gIC8vIG90aGVyIG5vZGVzIGluIHRoZW0uIFdlIGFsc28gaWdub3JlIGNvbXBvbmVudHMgd2l0aCBwdXJlIHRleHQgY29udGVudCBpblxuICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuXG5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Um9vdCAmJiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKGZpYmVyLnR5cGUpICYmICFzaG91bGRTZXRUZXh0Q29udGVudChmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzKSkpIHtcbiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICAgIGlmIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKTtcbiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgICAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID8gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpYmVyLnN0YXRlTm9kZSkgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZyAmJiBuZXh0SHlkcmF0YWJsZUluc3RhbmNlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7XG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpO1xuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0SHlkcmF0aW9uU3RhdGUoKSB7XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIGEgZm9yY2VkIGNsaWVudCByZW5kZXIuIFRoZSBlcnJvcnMgdGhhdCBvY2N1cnJlZFxuICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW5cbiAgICAvLyBjb21taXQgcGhhc2UsIG9uY2UgdGhlIGVudGlyZSB0cmVlIGhhcyBmaW5pc2hlZC5cbiAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGh5ZHJhdGlvbkVycm9ycyk7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUh5ZHJhdGlvbkVycm9yKGVycm9yKSB7XG4gIGlmIChoeWRyYXRpb25FcnJvcnMgPT09IG51bGwpIHtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IG51bGw7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb247XG59XG5cbnZhciBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncyA9IHtcbiAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKCkge30sXG4gIHJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gIGRpc2NhcmRQZW5kaW5nV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG57XG4gIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciBtYXliZVN0cmljdFJvb3QgPSBudWxsO1xuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgbWF5YmVTdHJpY3RSb290ID0gbm9kZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7XG4gIH07XG5cbiAgdmFyIHNldFRvU29ydGVkU3RyaW5nID0gZnVuY3Rpb24gKHNldCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpO1xuICB9O1xuXG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIC8vIERlZHVwZSBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcodW5pcXVlTmFtZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXFxuXFxuVGhlIG9sZCBBUEkgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gYWxsIDE2LnggcmVsZWFzZXMsIGJ1dCBhcHBsaWNhdGlvbnMgJyArICd1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uJyArICdcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnICsgJ1xcblxcbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpO1xuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLl9zdG9yZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlICcgKyAnXCJrZXlcIiBwcm9wLiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgJyArICdtb3JlIGluZm9ybWF0aW9uLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc1JlYWN0Q2xhc3ModHlwZSkge1xuICByZXR1cm4gdHlwZS5wcm90b3R5cGUgJiYgdHlwZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudDtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSBzdHJpbmcgcmVmc1wiXG4gICAgICAhKGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpICYmIC8vIFdpbGwgYWxyZWFkeSB3YXJuIHdpdGggXCJGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzXCJcbiAgICAgICEodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNSZWFjdENsYXNzKGVsZW1lbnQudHlwZSkpICYmIC8vIFdpbGwgYWxyZWFkeSB0aHJvdyB3aXRoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoc29tZVN0cmluZ1JlZikgYnV0IG5vIG93bmVyIHdhcyBzZXRcIlxuICAgICAgZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHJldHVybkZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuIFN1cHBvcnQgZm9yIHN0cmluZyByZWZzICcgKyAnd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFdlIHJlY29tbWVuZCB1c2luZyAnICsgJ3VzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZzW3N0cmluZ1JlZl0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVmLl9zdHJpbmdSZWYgPSBzdHJpbmdSZWY7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1peGVkUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKFwiICsgbWl4ZWRSZWYgKyBcIikgYnV0IG5vIG93bmVyIHdhcyBzZXQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2ZcIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4nICsgXCIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuXCIgKyAnMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4ZWRSZWY7XG59XG5cbmZ1bmN0aW9uIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgdmFyIGNoaWxkU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ld0NoaWxkKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZFN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRTdHJpbmcpICsgXCIpLiBcIiArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZC4nKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7XG4gIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRnVuY3Rpb25zIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC4gVGhpcyBtYXkgaGFwcGVuIGlmICcgKyAneW91IHJldHVybiBhIENvbXBvbmVudCBpbnN0ZWFkIG9mIDxDb21wb25lbnQgLz4gZnJvbSByZW5kZXIuICcgKyAnT3IgbWF5YmUgeW91IG1lYW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiByZXR1cm4gaXQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgdmFyIHBheWxvYWQgPSBsYXp5VHlwZS5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5VHlwZS5faW5pdDtcbiAgcmV0dXJuIGluaXQocGF5bG9hZCk7XG59IC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgYmVjYXVzZSBJIGV4cGVjdCB0byBjbG9uZSB0aGUgY29kZSBpbiBlYWNoIHBhdGhcbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieVxuICAgIC8vIGFzc3VtaW5nIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IGNoaWxkIHdlJ3ZlIGFscmVhZHkgYWRkZWQgZXZlcnl0aGluZy5cblxuXG4gICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7XG4gICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICBjaGlsZFRvRGVsZXRlID0gY2hpbGRUb0RlbGV0ZS5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgLy8gQWRkIHRoZSByZW1haW5pbmcgY2hpbGRyZW4gdG8gYSB0ZW1wb3JhcnkgbWFwIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlbSBieVxuICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXhcbiAgICAvLyBpbnN0ZWFkLlxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7XG5cbiAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGV4aXN0aW5nQ2hpbGQua2V5ICE9PSBudWxsKSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQua2V5LCBleGlzdGluZ0NoaWxkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGV4aXN0aW5nQ2hpbGQuaW5kZXgsIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBleGlzdGluZ0NoaWxkID0gZXhpc3RpbmdDaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlRmliZXIoZmliZXIsIHBlbmRpbmdQcm9wcykge1xuICAgIC8vIFdlIGN1cnJlbnRseSBzZXQgc2libGluZyB0byBudWxsIGFuZCBpbmRleCB0byAwIGhlcmUgYmVjYXVzZSBpdCBpcyBlYXN5XG4gICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS5cbiAgICB2YXIgY2xvbmUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhmaWJlciwgcGVuZGluZ1Byb3BzKTtcbiAgICBjbG9uZS5pbmRleCA9IDA7XG4gICAgY2xvbmUuc2libGluZyA9IG51bGw7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJbmRleCkge1xuICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7XG5cbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIER1cmluZyBoeWRyYXRpb24sIHRoZSB1c2VJZCBhbGdvcml0aG0gbmVlZHMgdG8ga25vdyB3aGljaCBmaWJlcnMgYXJlXG4gICAgICAvLyBwYXJ0IG9mIGEgbGlzdCBvZiBjaGlsZHJlbiAoYXJyYXlzLCBpdGVyYXRvcnMpLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkO1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudCA9IG5ld0ZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4O1xuXG4gICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG1vdmUuXG4gICAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGxhY2VTaW5nbGVDaGlsZChuZXdGaWJlcikge1xuICAgIC8vIFRoaXMgaXMgc2ltcGxlciBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLiBXZSBvbmx5IG5lZWQgdG8gZG8gYVxuICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0ZpYmVyLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmliZXI7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50LmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgLy8gYmVjYXVzZSBob3QgcmVsb2FkaW5nIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gcHJvZCBiZWNhdXNlXG4gICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjdXJyZW50LnR5cGUpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBudWxsLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICBfY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDI7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0O1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7XG5cbiAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICByZXR1cm4gX2NyZWF0ZWQzO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLlxuICAgIHZhciBrZXkgPSBvbGRGaWJlciAhPT0gbnVsbCA/IG9sZEZpYmVyLmtleSA6IG51bGw7XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQgXHUyMDE0IHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBjaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0O1xuICAgICAgICAgIHdhcm5PbkludmFsaWRLZXkoaW5pdChwYXlsb2FkKSwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMiA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLicpO1xuICAgIH1cblxuICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7XG4gICAgdmFyIG9sZEZpYmVyID0gY3VycmVudEZpcnN0Q2hpbGQ7XG4gICAgdmFyIGxhc3RQbGFjZWRJbmRleCA9IDA7XG4gICAgdmFyIG5ld0lkeCA9IDA7XG4gICAgdmFyIG5leHRPbGRGaWJlciA9IG51bGw7XG4gICAgdmFyIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCk7XG5cbiAgICBmb3IgKDsgb2xkRmliZXIgIT09IG51bGwgJiYgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbnVtYmVyT2ZGb3Jrcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgIHZhciBfbmV3RmliZXIzID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyMyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXIzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgX251bWJlck9mRm9ya3MzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzMyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczQgPSBuZXdJZHg7XG4gICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBGcmFnbWVudCkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUgfHwgKCAvLyBLZWVwIHRoaXMgY2hlY2sgaW5saW5lIHNvIGl0IG9ubHkgcnVucyBvbiB0aGUgZmFsc2UgcGF0aDpcbiAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLlxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSxcbiAgICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuXG4gICAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY2hpbGQudHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuXG4gICAgICAgICAgICB2YXIgX2V4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIGVsZW1lbnQucHJvcHMpO1xuXG4gICAgICAgICAgICBfZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICAgICAgX2V4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIERpZG4ndCBtYXRjaC5cblxuXG4gICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jcmVhdGVkNCA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICBfY3JlYXRlZDQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCk7XG4gICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gX2NyZWF0ZWQ0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICB2YXIga2V5ID0gcG9ydGFsLmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBwb3J0YWwuY2hpbGRyZW4gfHwgW10pO1xuICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uXG4gIC8vIGl0c2VsZi4gVGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzaWRlLWVmZmVjdCBsaXN0IGFzIHdlIHBhc3MgdGhyb3VnaCB0aGVcbiAgLy8gY2hpbGRyZW4gYW5kIHRoZSBwYXJlbnQuXG5cblxuICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY3Vyc2l2ZS5cbiAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLFxuICAgIC8vIG5vdCBhcyBhIGZyYWdtZW50LiBOZXN0ZWQgYXJyYXlzIG9uIHRoZSBvdGhlciBoYW5kIHdpbGwgYmUgdHJlYXRlZCBhc1xuICAgIC8vIGZyYWdtZW50IG5vZGVzLiBSZWN1cnNpb24gaGFwcGVucyBhdCB0aGUgbm9ybWFsIGZsb3cuXG4gICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLlxuICAgIC8vIFRoaXMgbGVhZHMgdG8gYW4gYW1iaWd1aXR5IGJldHdlZW4gPD57Wy4uLl19PC8+IGFuZCA8Pi4uLjwvPi5cbiAgICAvLyBXZSB0cmVhdCB0aGUgYW1iaWd1b3VzIGNhc2VzIGFib3ZlIHRoZSBzYW1lLlxuICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDtcblxuICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7XG4gICAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuO1xuICAgIH0gLy8gSGFuZGxlIG9iamVjdCB0eXBlc1xuXG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7IC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgbm9uLXJlY3Vyc2l2ZS5cblxuICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycyhyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgJycgKyBuZXdDaGlsZCwgbGFuZXMpKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfSAvLyBSZW1haW5pbmcgY2FzZXMgYXJlIGFsbCB0cmVhdGVkIGFzIGVtcHR5LlxuXG5cbiAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbmNpbGVDaGlsZEZpYmVycztcbn1cblxudmFyIHJlY29uY2lsZUNoaWxkRmliZXJzID0gQ2hpbGRSZWNvbmNpbGVyKHRydWUpO1xudmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpO1xuZnVuY3Rpb24gY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xudmFyIHJlbmRlcmVyU2lnaWw7XG5cbntcbiAgLy8gVXNlIHRoaXMgdG8gZGV0ZWN0IG11bHRpcGxlIHJlbmRlcmVycyB1c2luZyB0aGUgc2FtZSBjb250ZXh0XG4gIHJlbmRlcmVyU2lnaWwgPSB7fTtcbn1cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xudmFyIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG52YXIgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBiZWZvcmUgUmVhY3QgeWllbGRzIGV4ZWN1dGlvbiwgdG8gZW5zdXJlIGByZWFkQ29udGV4dGBcbiAgLy8gY2Fubm90IGJlIGNhbGxlZCBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuXG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcblxuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcHVzaFByb3ZpZGVyKHByb3ZpZGVyRmliZXIsIGNvbnRleHQsIG5leHRWYWx1ZSkge1xuICB7XG4gICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlLCBwcm92aWRlckZpYmVyKTtcbiAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG5cbiAgICB7XG4gICAgICBpZiAoY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSB1bmRlZmluZWQgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSBudWxsICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCkge1xuICAgICAgICBlcnJvcignRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlICcgKyAnc2FtZSBjb250ZXh0IHByb3ZpZGVyLiBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4nKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcCh2YWx1ZUN1cnNvciwgcHJvdmlkZXJGaWJlcik7XG5cbiAge1xuICAgIHtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgocGFyZW50LCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAobm9kZSAhPT0gcHJvcGFnYXRpb25Sb290KSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJvcGFnYXRpb24gcm9vdCB3aGVuIHNjaGVkdWxpbmcgY29udGV4dCB3b3JrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VfZWFnZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG5cbiAgdmFyIGZpYmVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgaWYgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgZmliZXIucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dEZpYmVyID0gdm9pZCAwOyAvLyBWaXNpdCB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxpc3QgPSBmaWJlci5kZXBlbmRlbmNpZXM7XG5cbiAgICBpZiAobGlzdCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7XG4gICAgICB2YXIgZGVwZW5kZW5jeSA9IGxpc3QuZmlyc3RDb250ZXh0O1xuXG4gICAgICB3aGlsZSAoZGVwZW5kZW5jeSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLlxuICAgICAgICBpZiAoZGVwZW5kZW5jeS5jb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocmVuZGVyTGFuZXMpO1xuICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cbiAgICAgICAgICAgIC8vIElubGluZWQgYGVucXVldWVVcGRhdGVgIHRvIHJlbW92ZSBpbnRlcmxlYXZlZCB1cGRhdGUgY2hlY2tcblxuICAgICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkgOyBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuICAgICAgICAgICAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgICAgICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICAgICAgICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2hhcmVkUXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTsgLy8gTWFyayB0aGUgdXBkYXRlZCBsYW5lcyBvbiB0aGUgbGlzdCwgdG9vLlxuXG4gICAgICAgICAgbGlzdC5sYW5lcyA9IG1lcmdlTGFuZXMobGlzdC5sYW5lcywgcmVuZGVyTGFuZXMpOyAvLyBTaW5jZSB3ZSBhbHJlYWR5IGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIHRyYXZlcnNpbmcgdGhlXG4gICAgICAgICAgLy8gZGVwZW5kZW5jeSBsaXN0LlxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeS5uZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDb250ZXh0UHJvdmlkZXIpIHtcbiAgICAgIC8vIERvbid0IHNjYW4gZGVlcGVyIGlmIHRoaXMgaXMgYSBtYXRjaGluZyBwcm92aWRlclxuICAgICAgbmV4dEZpYmVyID0gZmliZXIudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MudHlwZSA/IG51bGwgOiBmaWJlci5jaGlsZDtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gRGVoeWRyYXRlZEZyYWdtZW50KSB7XG4gICAgICAvLyBJZiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgaXMgaW4gdGhpcyBzdWJ0cmVlLCB3ZSBkb24ndCBrbm93XG4gICAgICAvLyBpZiBpdCB3aWxsIGhhdmUgYW55IGNvbnRleHQgY29uc3VtZXJzIGluIGl0LiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXNcbiAgICAgIC8vIG1hcmsgaXQgYXMgaGF2aW5nIHVwZGF0ZXMuXG4gICAgICB2YXIgcGFyZW50U3VzcGVuc2UgPSBmaWJlci5yZXR1cm47XG5cbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudFN1c3BlbnNlLmxhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnRTdXNwZW5zZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9hbHRlcm5hdGUgPSBwYXJlbnRTdXNwZW5zZS5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChfYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIF9hbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKF9hbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHBhc3NpbmcgdGhpcyBmaWJlciBhcyB0aGUgcGFyZW50XG4gICAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gc2NoZWR1bGUgdGhpcyBmaWJlciBhcyBoYXZpbmcgd29ya1xuICAgICAgLy8gb24gaXRzIGNoaWxkcmVuLiBXZSdsbCB1c2UgdGhlIGNoaWxkTGFuZXMgb25cbiAgICAgIC8vIHRoaXMgZmliZXIgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cblxuICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnRTdXNwZW5zZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnNpYmxpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgICBpZiAoZmlyc3RDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGRlcGVuZGVuY2llcy5sYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgICAgICB9IC8vIFJlc2V0IHRoZSB3b3JrLWluLXByb2dyZXNzIGxpc3RcblxuXG4gICAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICB7XG4gICAgLy8gVGhpcyB3YXJuaW5nIHdvdWxkIGZpcmUgaWYgeW91IHJlYWQgY29udGV4dCBpbnNpZGUgYSBIb29rIGxpa2UgdXNlTWVtby5cbiAgICAvLyBVbmxpa2UgdGhlIGNsYXNzIGNoZWNrIGJlbG93LCBpdCdzIG5vdCBlbmZvcmNlZCBpbiBwcm9kdWN0aW9uIGZvciBwZXJmLlxuICAgIGlmIChpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKSB7XG4gICAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHZhbHVlID0gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG5cbiAgaWYgKGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9PT0gY29udGV4dCkgOyBlbHNlIHtcbiAgICB2YXIgY29udGV4dEl0ZW0gPSB7XG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJlbmRlci4gV2hlbiB0aGlzIHJlbmRlciBleGl0cywgZWl0aGVyIGJlY2F1c2UgaXQgZmluaXNoZXMgb3IgYmVjYXVzZSBpdCBpc1xuLy8gaW50ZXJydXB0ZWQsIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgb250byB0aGUgbWFpbiBwYXJ0XG4vLyBvZiB0aGUgcXVldWUuXG5cbnZhciBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbmZ1bmN0aW9uIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpIHtcbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBjb25jdXJyZW50UXVldWVzID0gW3F1ZXVlXTtcbiAgfSBlbHNlIHtcbiAgICBjb25jdXJyZW50UXVldWVzLnB1c2gocXVldWUpO1xuICB9XG59XG5mdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkge1xuICAvLyBUcmFuc2ZlciB0aGUgaW50ZXJsZWF2ZWQgdXBkYXRlcyBvbnRvIHRoZSBtYWluIHF1ZXVlLiBFYWNoIHF1ZXVlIGhhcyBhXG4gIC8vIGBwZW5kaW5nYCBmaWVsZCBhbmQgYW4gYGludGVybGVhdmVkYCBmaWVsZC4gV2hlbiB0aGV5IGFyZSBub3QgbnVsbCwgdGhleVxuICAvLyBwb2ludCB0byB0aGUgbGFzdCBub2RlIGluIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZVxuICAvLyBpbnRlcmxlYXZlZCBsaXN0IHRvIHRoZSBlbmQgb2YgdGhlIHBlbmRpbmcgbGlzdCBieSBqb2luaW5nIHRoZW0gaW50byBhXG4gIC8vIHNpbmdsZSwgY2lyY3VsYXIgbGlzdC5cbiAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmN1cnJlbnRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGNvbmN1cnJlbnRRdWV1ZXNbaV07XG4gICAgICB2YXIgbGFzdEludGVybGVhdmVkVXBkYXRlID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGlmIChsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcXVldWUuaW50ZXJsZWF2ZWQgPSBudWxsO1xuICAgICAgICB2YXIgZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0O1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChsYXN0UGVuZGluZ1VwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBmaXJzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgICAgIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUucGVuZGluZyA9IGxhc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jdXJyZW50UXVldWVzID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuXG5cbiAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59IC8vIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdXRzaWRlIHRoaXMgbW9kdWxlIHNob3VsZCBvbmx5IGJlIGRvbmUgZm9yIGJhY2t3YXJkc1xuLy8gY29tcGF0aWJpbGl0eSBhbmQgc2hvdWxkIGFsd2F5cyBiZSBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcuXG5cbnZhciB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdDtcblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKCkpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVuc2FmZSByZW5kZXIgcGhhc2UgdXBkYXRlLiBBZGQgZGlyZWN0bHkgdG8gdGhlIHVwZGF0ZVxuICAgIC8vIHF1ZXVlIHNvIHdlIGNhbiBwcm9jZXNzIGl0IGltbWVkaWF0ZWx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIuXG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlOyAvLyBVcGRhdGUgdGhlIGNoaWxkTGFuZXMgZXZlbiB0aG91Z2ggd2UncmUgbW9zdCBsaWtlbHkgYWxyZWFkeSByZW5kZXJpbmdcbiAgICAvLyB0aGlzIGZpYmVyLiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB5b3VcbiAgICAvLyB1cGRhdGUgYSBkaWZmZXJlbnQgY29tcG9uZW50IGR1cmluZyByZW5kZXIgcGhhc2UgdGhhbiB0aGUgb25lIHRoYXQgaXNcbiAgICAvLyBjdXJyZW50bHkgcmVuZGVyaW5ncyAoYSBwYXR0ZXJuIHRoYXQgaXMgYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nKS5cblxuICAgIHJldHVybiB1bnNhZmVfbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBzaGFyZWRRdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSkge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gc2hhcmVkUXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXkgbXVzdFxuICAgIC8vIGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoIHJlcHJlc2VudHNcbiAgICAvLyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlIG1heSBlbnRhbmdsZVxuICAgIC8vIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWYgd2UgKmRvbid0KlxuICAgIC8vIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBzaGFyZWRRdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAvLyBDYXB0dXJlZCB1cGRhdGVzIGFyZSB1cGRhdGVzIHRoYXQgYXJlIHRocm93biBieSBhIGNoaWxkIGR1cmluZyB0aGUgcmVuZGVyXG4gIC8vIHBoYXNlLiBUaGV5IHNob3VsZCBiZSBkaXNjYXJkZWQgaWYgdGhlIHJlbmRlciBpcyBhYm9ydGVkLiBUaGVyZWZvcmUsXG4gIC8vIHdlIHNob3VsZCBvbmx5IHB1dCB0aGVtIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlLCBub3QgdGhlIGN1cnJlbnQgb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsgLy8gQ2hlY2sgaWYgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgYSBjbG9uZS5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICAgIC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuXG4gICAgICAvLyB3ZSBiYWlsIG91dCBvbiBhIHBhcmVudCBmaWJlciB0aGF0IHRoZW4gY2FwdHVyZXMgYW4gZXJyb3IgdGhyb3duIGJ5XG4gICAgICAvLyBhIGNoaWxkLiBTaW5jZSB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgdXBkYXRlIG9ubHkgdG8gdGhlIHdvcmstaW5cbiAgICAgIC8vIC1wcm9ncmVzcyBxdWV1ZSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdXBkYXRlcy4gV2UgdXN1YWxseSBjbG9uZSBkdXJpbmdcbiAgICAgIC8vIHByb2Nlc3NVcGRhdGVRdWV1ZSwgYnV0IHRoYXQgZGlkbid0IGhhcHBlbiBpbiB0aGlzIGNhc2UgYmVjYXVzZSB3ZVxuICAgICAgLy8gc2tpcHBlZCBvdmVyIHRoZSBwYXJlbnQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuICAgICAgdmFyIG5ld0ZpcnN0ID0gbnVsbDtcbiAgICAgIHZhciBuZXdMYXN0ID0gbnVsbDtcbiAgICAgIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB1cGRhdGVzIGFuZCBjbG9uZSB0aGVtLlxuICAgICAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZS5ldmVudFRpbWUsXG4gICAgICAgICAgICBsYW5lOiB1cGRhdGUubGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgICAgIG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcbiAgICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsKTsgLy8gQXBwZW5kIHRoZSBjYXB0dXJlZCB1cGRhdGUgdGhlIGVuZCBvZiB0aGUgY2xvbmVkIGxpc3QuXG5cblxuICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICAgIG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGJhc2UgdXBkYXRlcy5cbiAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0ge1xuICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBuZXdMYXN0LFxuICAgICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsXG4gICAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBxdWV1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gLy8gQXBwZW5kIHRoZSB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cblxuXG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMsIGluc3RhbmNlKSB7XG4gIHN3aXRjaCAodXBkYXRlLnRhZykge1xuICAgIGNhc2UgUmVwbGFjZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQYXJ0aWFsIHN0YXRlIG9iamVjdFxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIE51bGwgYW5kIHVuZGVmaW5lZCBhcmUgdHJlYXRlZCBhcyBuby1vcHMuXG4gICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3JjZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHByZXZTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBwcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZDtcbiAgfVxuXG4gIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7XG4gIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOyAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzLiBJZiBzbywgdHJhbnNmZXIgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsgLy8gVGhlIHBlbmRpbmcgcXVldWUgaXMgY2lyY3VsYXIuIERpc2Nvbm5lY3QgdGhlIHBvaW50ZXIgYmV0d2VlbiBmaXJzdFxuICAgIC8vIGFuZCBsYXN0IHNvIHRoYXQgaXQncyBub24tY2lyY3VsYXIuXG5cbiAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7IC8vIEFwcGVuZCBwZW5kaW5nIHVwZGF0ZXMgdG8gYmFzZSBxdWV1ZVxuXG4gICAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBmaXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgfVxuXG4gICAgbGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTsgLy8gSWYgdGhlcmUncyBhIGN1cnJlbnQgcXVldWUsIGFuZCBpdCdzIGRpZmZlcmVudCBmcm9tIHRoZSBiYXNlIHF1ZXVlLCB0aGVuXG4gICAgLy8gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdXBkYXRlcyB0byB0aGF0IHF1ZXVlLCB0b28uIEJlY2F1c2UgdGhlIGJhc2VcbiAgICAvLyBxdWV1ZSBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCB3aXRoIG5vIGN5Y2xlcywgd2UgY2FuIGFwcGVuZCB0byBib3RoXG4gICAgLy8gbGlzdHMgYW5kIHRha2UgYWR2YW50YWdlIG9mIHN0cnVjdHVyYWwgc2hhcmluZy5cbiAgICAvLyBUT0RPOiBQYXNzIGBjdXJyZW50YCBhcyBhcmd1bWVudFxuXG4gICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICAgICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG4gICAgICB2YXIgY3VycmVudExhc3RCYXNlVXBkYXRlID0gY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlICE9PSBsYXN0QmFzZVVwZGF0ZSkge1xuICAgICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudFF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50TGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBUaGVzZSB2YWx1ZXMgbWF5IGNoYW5nZSBhcyB3ZSBwcm9jZXNzIHRoZSBxdWV1ZS5cblxuXG4gIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdXBkYXRlcyB0byBjb21wdXRlIHRoZSByZXN1bHQuXG4gICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZSByZW5kZXJMYW5lc1xuICAgIC8vIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG4gICAgdmFyIG5ld0xhbmVzID0gTm9MYW5lcztcbiAgICB2YXIgbmV3QmFzZVN0YXRlID0gbnVsbDtcbiAgICB2YXIgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgbmV3TGFzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lO1xuICAgICAgdmFyIHVwZGF0ZUV2ZW50VGltZSA9IHVwZGF0ZS5ldmVudFRpbWU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZSA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cblxuXG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICAgIG5ld0xhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgbmV3U3RhdGUgPSBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIG5ld1N0YXRlLCBwcm9wcywgaW5zdGFuY2UpO1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB1cGRhdGUuY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIC8vIElmIHRoZSB1cGRhdGUgd2FzIGFscmVhZHkgY29tbWl0dGVkLCB3ZSBzaG91bGQgbm90IHF1ZXVlIGl0c1xuICAgICAgICAvLyBjYWxsYmFjayBhZ2Fpbi5cbiAgICAgICAgdXBkYXRlLmxhbmUgIT09IE5vTGFuZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENhbGxiYWNrO1xuICAgICAgICAgIHZhciBlZmZlY3RzID0gcXVldWUuZWZmZWN0cztcblxuICAgICAgICAgIGlmIChlZmZlY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lZmZlY3RzID0gW3VwZGF0ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1cGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDtcblxuICAgICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICAgICAgICBpZiAocGVuZGluZ1F1ZXVlID09PSBudWxsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYSByZWR1Y2VyLiBBZGQgdGhlIG5ld1xuICAgICAgICAgIC8vIHBlbmRpbmcgdXBkYXRlcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCBrZWVwIHByb2Nlc3NpbmcuXG4gICAgICAgICAgdmFyIF9sYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsgLy8gSW50ZW50aW9uYWxseSB1bnNvdW5kLiBQZW5kaW5nIHVwZGF0ZXMgZm9ybSBhIGNpcmN1bGFyIGxpc3QsIGJ1dCB3ZVxuICAgICAgICAgIC8vIHVucmF2ZWwgdGhlbSB3aGVuIHRyYW5zZmVycmluZyB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gICAgICAgICAgdmFyIF9maXJzdFBlbmRpbmdVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBfbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgdXBkYXRlID0gX2ZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgcXVldWUuYmFzZVN0YXRlID0gbmV3QmFzZVN0YXRlO1xuICAgIHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZSA9IG5ld0ZpcnN0QmFzZVVwZGF0ZTtcbiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlOyAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gICAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXNcbiAgICAvLyBhcmUgcmVtYWluaW5nLlxuXG4gICAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLnNoYXJlZC5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgICAgZG8ge1xuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIGludGVybGVhdmVkLmxhbmUpO1xuICAgICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgICB9IGVsc2UgaWYgKGZpcnN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgICBxdWV1ZS5zaGFyZWQubGFuZXMgPSBOb0xhbmVzO1xuICAgIH0gLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuXG4gICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhuZXdMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBuZXdMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgYXMgY2FsbGJhY2suIEV4cGVjdGVkIGEgZnVuY3Rpb24uIEluc3RlYWQgJyArIChcInJlY2VpdmVkOiBcIiArIGNhbGxiYWNrKSk7XG4gIH1cblxuICBjYWxsYmFjay5jYWxsKGNvbnRleHQpO1xufVxuXG5mdW5jdGlvbiByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpIHtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7XG4gIHJldHVybiBoYXNGb3JjZVVwZGF0ZTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgZmluaXNoZWRRdWV1ZSwgaW5zdGFuY2UpIHtcbiAgLy8gQ29tbWl0IHRoZSBlZmZlY3RzXG4gIHZhciBlZmZlY3RzID0gZmluaXNoZWRRdWV1ZS5lZmZlY3RzO1xuICBmaW5pc2hlZFF1ZXVlLmVmZmVjdHMgPSBudWxsO1xuXG4gIGlmIChlZmZlY3RzICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWZmZWN0ID0gZWZmZWN0c1tpXTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGVmZmVjdC5jYWxsYmFjaztcblxuICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgIGVmZmVjdC5jYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIFJlZ3VsYXIgYm91bmRhcmllcyBhbHdheXMgY2FwdHVyZS5cblxuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZVxufVxuZnVuY3Rpb24gZmluZEZpcnN0U3VzcGVuZGVkKHJvdykge1xuICB2YXIgbm9kZSA9IHJvdztcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQgJiYgLy8gcmV2ZWFsT3JkZXIgdW5kZWZpbmVkIGNhbid0IGJlIHRydXN0ZWQgYmVjYXVzZSBpdCBkb24ndFxuICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpdCBzdXNwZW5kZWQgb3Igbm90LlxuICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGlkU3VzcGVuZCA9IChub2RlLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgIGlmIChkaWRTdXNwZW5kKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHJvdykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBOb0ZsYWdzJDEgPVxuLyogICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBJbnNlcnRpb24gPVxuLyogICovXG4yO1xudmFyIExheW91dCA9XG4vKiAgICAqL1xuNDtcbnZhciBQYXNzaXZlJDEgPVxuLyogICAqL1xuODtcblxuLy8gYW5kIHNob3VsZCBiZSByZXNldCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgcmVuZGVyLlxuLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTtcbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTtcblxuICAgIHtcbiAgICAgIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwO1xufVxuLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZlcnNpb24gdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZyBtYXRjaGVzIHRoZSBvbmVcbi8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uXG4vLyBJZiB0aGV5IGRvbid0IG1hdGNoIHRoZXJlJ3MgYSBwb3RlbnRpYWwgdGVhciBhbmQgYSBmdWxsIGRlb3B0IHJlbmRlciBpcyByZXF1aXJlZC5cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpIHtcbiAgdmFyIGdldFZlcnNpb24gPSBtdXRhYmxlU291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC5cbiAgLy8gUmV0YWluaW5nIGl0IGZvcmV2ZXIgbWF5IGludGVyZmVyZSB3aXRoIEdDLlxuXG4gIGlmIChyb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPT0gbnVsbCkge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IFttdXRhYmxlU291cmNlLCB2ZXJzaW9uXTtcbiAgfSBlbHNlIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChtdXRhYmxlU291cmNlLCB2ZXJzaW9uKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90O1xuXG57XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdXNlSWQgaG9va3MgaW4gdGhpcyBjb21wb25lbnQuXG5cbnZhciBsb2NhbElkQ291bnRlciA9IDA7IC8vIFVzZWQgZm9yIGlkcyB0aGF0IGFyZSBnZW5lcmF0ZWQgY29tcGxldGVseSBjbGllbnQtc2lkZSAoaS5lLiBub3QgZHVyaW5nXG4vLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zc1xuLy8gcmVuZGVyIGF0dGVtcHRzLlxuXG52YXIgZ2xvYmFsQ2xpZW50SWRDb3VudGVyID0gMDtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxKTtcblxuICAgIGlmICghZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgdGFibGUgPSAnJztcbiAgICAgICAgdmFyIHNlY29uZENvbHVtblN0YXJ0ID0gMzA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXY7IGkrKykge1xuICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXTtcbiAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lO1xuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArIFwiLiBcIiArIG9sZEhvb2tOYW1lOyAvLyBFeHRyYSBzcGFjZSBzbyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwXG4gICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdFxuXG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcbiAgICAgICAgICB0YWJsZSArPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbicgKyAnICAgUHJldmlvdXMgcmVuZGVyICAgICAgICAgICAgTmV4dCByZW5kZXJcXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicgKyAnJXMnICsgJyAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxcbicsIGNvbXBvbmVudE5hbWUsIHRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJbnZhbGlkSG9va0Vycm9yKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICB7XG4gICAgaWYgKGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyAnICsgJ3RoZSBwcmV2aW91cyByZW5kZXIuIEV2ZW4gdGhvdWdoIHRoZSBmaW5hbCBhcmd1bWVudCBpcyBvcHRpb25hbCwgJyArICdpdHMgdHlwZSBjYW5ub3QgY2hhbmdlIGJldHdlZW4gcmVuZGVycy4nLCBjdXJyZW50SG9va05hbWVJbkRldik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IGJvdGhlciBjb21wYXJpbmcgbGVuZ3RocyBpbiBwcm9kIGJlY2F1c2UgdGhlc2UgYXJyYXlzIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCBpbmxpbmUuXG4gICAgaWYgKG5leHREZXBzLmxlbmd0aCAhPT0gcHJldkRlcHMubGVuZ3RoKSB7XG4gICAgICBlcnJvcignVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgJyArICdvcmRlciBhbmQgc2l6ZSBvZiB0aGlzIGFycmF5IG11c3QgcmVtYWluIGNvbnN0YW50LlxcblxcbicgKyAnUHJldmlvdXM6ICVzXFxuJyArICdJbmNvbWluZzogJXMnLCBjdXJyZW50SG9va05hbWVJbkRldiwgXCJbXCIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgXCJdXCIsIFwiW1wiICsgbmV4dERlcHMuam9pbignLCAnKSArIFwiXVwiKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnLCBuZXh0UmVuZGVyTGFuZXMpIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBVc2VkIGZvciBob3QgcmVsb2FkaW5nOlxuXG4gICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAvLyBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCAnICsgJ2FuIGluZmluaXRlIGxvb3AuJyk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBDb25maXJtIHRoYXQgYSBzdGF0aWMgZmxhZyB3YXMgbm90IGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3RcbiAgICAvLyByZW5kZXIuIElmIHRoaXMgZmlyZXMsIGl0IHN1Z2dlc3RzIHRoYXQgd2UgaW5jb3JyZWN0bHkgcmVzZXQgdGhlIHN0YXRpY1xuICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgaW4gdGhlIFN1c3BlbnNlTGlzdCBpbXBsZW1lbnRhdGlvbi5cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaykgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFN0YXRpY01hc2spICYmIC8vIERpc2FibGUgdGhpcyB3YXJuaW5nIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGxlZ2FjeSBTdXNwZW5zZSBpcyB3ZWlyZFxuICAgIC8vIGFuZCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcy4gVG8gbWFrZSB0aGlzIHdvcmsgaW4gbGVnYWN5IG1vZGUsIHdlJ2RcbiAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvclxuICAgIC8vIG5vdyBJJ2xsIGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBtb3N0IG9mIHRoZSBidWdzIHRoYXQgd291bGQgdHJpZ2dlclxuICAgIC8vIGl0IGFyZSBlaXRoZXIgZXhjbHVzaXZlIHRvIGNvbmN1cnJlbnQgbW9kZSBvciBleGlzdCBpbiBib3RoLlxuICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBFeHBlY3RlZCBzdGF0aWMgZmxhZyB3YXMgbWlzc2luZy4gUGxlYXNlICcgKyAnbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLicpO1xuICAgIH1cbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9va1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgaWYgKGRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCAnICsgJ2Vhcmx5IHJldHVybiBzdGF0ZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLlxuICAvLyBDb25jZXB0dWFsbHksIGl0J3MgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlbmRlcldpdGhIb29rczsgaXQncyBvbmx5IGFcbiAgLy8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgdXNpbmcgYW4gYXJyYXkgdHVwbGUuXG4gIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xuICByZXR1cm4gZGlkUmVuZGVySWRIb29rO1xufVxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gcmVzZXQgdGhlIGZsYWdzIGhlcmUsIGJlY2F1c2UgdGhleSdyZSByZXNldCBpbiB0aGVcbiAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLlxuXG4gIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oTW91bnRQYXNzaXZlRGV2IHwgTW91bnRMYXlvdXREZXYgfCBQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9XG5cbiAgY3VycmVudC5sYW5lcyA9IHJlbW92ZUxhbmVzKGN1cnJlbnQubGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkge1xuICAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIHJlbmRlciBwaGFzZSB1cGRhdGVzLiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgdGhpcyByZW5kZXJcbiAgICAvLyBwaGFzZSwgd2hpY2ggd2UgYXJlIG5vdyBhYm9ydGluZy4gUmVtb3ZlIHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlcyBzb1xuICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rc1xuICAgIC8vIHRoYXQgd2VyZW4ndCBwcm9jZXNzZWQuXG4gICAgLy9cbiAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzXG4gICAgLy8gbm90IGhhdmUgYSBjbG9uZSwgdGhhdCBtZWFucyBpdCB3YXNuJ3QgcHJvY2Vzc2VkLCBhbmQgdGhlIHVwZGF0ZXMgd2VyZVxuICAgIC8vIHNjaGVkdWxlZCBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaG9vayA9IGhvb2submV4dDtcbiAgICB9XG5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIHZhciBuZXdIb29rID0ge1xuICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsXG4gICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3QuXG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGwsXG4gICAgc3RvcmVzOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJhc2ljU3RhdGVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpbml0aWFsU3RhdGU7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiByZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoUmVkdWNlckFjdGlvbi5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZVxuICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZS5oYXNFYWdlclN0YXRlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksXG4gICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZVxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAvLyBhcmUgcmVtYWluaW5nLlxuXG5cbiAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGludGVybGVhdmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGludGVybGVhdmVkTGFuZSk7XG4gICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gIH0gZWxzZSBpZiAoYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIHF1ZXVlLmxhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzXG4gIC8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgdmFyIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG4gIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHF1ZXVlIGRvZXNuJ3QgcGVyc2lzdCBwYXN0IHRoaXMgcmVuZGVyIHBhc3MuXG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhpcyByZW5kZXIgcGhhc2UgdXBkYXRlLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZVxuICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudFxuICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSk7IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW11bGF0ZWQgZnJvbSB0aGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG9cbiAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlXG4gICAgLy8gZG8gZm9yIGdEU0ZQLiBJIGNhbid0IHJlbWVtYmVyIHdoeS5cblxuICAgIGlmIChob29rLmJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dFNuYXBzaG90O1xuICB2YXIgaXNIeWRyYXRpbmcgPSBnZXRJc0h5ZHJhdGluZygpO1xuXG4gIGlmIChpc0h5ZHJhdGluZykge1xuICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2V0U2VydmVyU25hcHNob3QsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAnICsgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgIH1cblxuICAgIG5leHRTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIGlmIChuZXh0U25hcHNob3QgIT09IGdldFNlcnZlclNuYXBzaG90KCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG4gICAgLy9cbiAgICAvLyBXZSB3b24ndCBkbyB0aGlzIGlmIHdlJ3JlIGh5ZHJhdGluZyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCwgYmVjYXVzZSBpZlxuICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2hcbiAgICAvLyBpdCB1cCBpbiBhIHBhc3NpdmUgZWZmZWN0LlxuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICB2YXIgaW5zdCA9IHtcbiAgICB2YWx1ZTogbmV4dFNuYXBzaG90LFxuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICB9O1xuICBob29rLnF1ZXVlID0gaW5zdDsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmUuXG5cbiAgbW91bnRFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byB1cGRhdGUgdGhlIG11dGFibGUgaW5zdGFuY2UgZmllbGRzLiBXZSB3aWxsIHVwZGF0ZVxuICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBub1xuICAvLyBjbGVhbi11cCBmdW5jdGlvbiwgYW5kIHdlIHRyYWNrIHRoZSBkZXBzIGNvcnJlY3RseSwgd2UgY2FuIGNhbGwgcHVzaEVmZmVjdFxuICAvLyBkaXJlY3RseSwgd2l0aG91dCBzdG9yaW5nIGFueSBhZGRpdGlvbmFsIHN0YXRlLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZVxuICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuXG4gIC8vIFRPRE86IFdlIGNhbiBtb3ZlIHRoaXMgdG8gdGhlIHBhc3NpdmUgcGhhc2Ugb25jZSB3ZSBhZGQgYSBwcmUtY29tbWl0XG4gIC8vIGNvbnNpc3RlbmN5IGNoZWNrLiBTZWUgdGhlIG5leHQgY29tbWVudC5cblxuICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsgLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG4gIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICB2YXIgc25hcHNob3RDaGFuZ2VkID0gIW9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcblxuICBpZiAoc25hcHNob3RDaGFuZ2VkKSB7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gIH1cblxuICB2YXIgaW5zdCA9IGhvb2sucXVldWU7XG4gIHVwZGF0ZUVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICBpZiAoaW5zdC5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHwgc25hcHNob3RDaGFuZ2VkIHx8IC8vIENoZWNrIGlmIHRoZSBzdXNiY3JpYmUgZnVuY3Rpb24gY2hhbmdlZC4gV2UgY2FuIHNhdmUgc29tZSBtZW1vcnkgYnlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLlxuICB3b3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3NIb29rLm1lbW9pemVkU3RhdGUudGFnICYgSGFzRWZmZWN0KSB7XG4gICAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgcmVuZGVyZWRTbmFwc2hvdCkge1xuICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5O1xuICB2YXIgY2hlY2sgPSB7XG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90LFxuICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90XG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0b3JlcyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgIGlmIChzdG9yZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3Jlcy5wdXNoKGNoZWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmVJbnN0YW5jZShmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCkge1xuICAvLyBUaGVzZSBhcmUgdXBkYXRlZCBpbiB0aGUgcGFzc2l2ZSBwaGFzZVxuICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90O1xuICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFNvbWV0aGluZyBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQgaW4gYmV0d2VlbiByZW5kZXIgYW5kIGNvbW1pdC4gVGhpcyBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYW4gZXZlbnQgdGhhdCBmaXJlZCBiZWZvcmUgdGhlIHBhc3NpdmUgZWZmZWN0cywgb3IgaXQgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZFxuICAvLyBzbmFwc2hvIGFuZCBnZXRTbmFwc2hvdCB2YWx1ZXMgdG8gYmFpbCBvdXQuIFdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgdGltZS5cblxuICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgICB9XG4gIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikge1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHtcbiAgdmFyIGVmZmVjdCA9IHtcbiAgICB0YWc6IHRhZyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRlcHM6IGRlcHMsXG4gICAgLy8gQ2lyY3VsYXJcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgICBlZmZlY3QubmV4dCA9IGZpcnN0RWZmZWN0O1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0O1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIHtcbiAgICB2YXIgX3JlZjIgPSB7XG4gICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWVcbiAgICB9O1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9yZWYyO1xuICAgIHJldHVybiBfcmVmMjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldkVmZmVjdCA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgZGVzdHJveSA9IHByZXZFZmZlY3QuZGVzdHJveTtcblxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChQYXNzaXZlLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEFzc3VtZSB0aGVzZSBhcmUgZGVmaW5lZC4gSWYgdGhleSdyZSBub3QsIGFyZUhvb2tJbnB1dHNFcXVhbCB3aWxsIHdhcm4uXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcmVzb2x2ZWRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rO1xuICB2YXIgcHJldlZhbHVlID0gcmVzb2x2ZWRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhbiB1cGRhdGUuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpO1xuXG4gIGlmIChzaG91bGREZWZlclZhbHVlKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cmdlbnQgdXBkYXRlLiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgdXNpbmcgdGhlXG4gICAgLy8gcHJldmlvdXMgdmFsdWUgYW5kIHNwYXduIGEgZGVmZXJyZWQgcmVuZGVyIHRvIHVwZGF0ZSBpdCBsYXRlci5cbiAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIHJlbmRlclxuICAgICAgdmFyIGRlZmVycmVkTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhkZWZlcnJlZExhbmUpOyAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGluY29uc2lzdGVudFxuICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHZhbHVlLiBUaGUgbmFtZSBcImJhc2VTdGF0ZVwiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZVxuICAgICAgLy8gdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBuZXcgb25lLlxuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHRydWU7XG4gICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWVcblxuXG4gICAgcmV0dXJuIHByZXZWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIG5vdCBhbiB1cmdlbnQgdXBkYXRlLCBzbyB3ZSBjYW4gdXNlIHRoZSBsYXRlc3QgdmFsdWUgcmVnYXJkbGVzc1xuICAgIC8vIG9mIHdoYXQgaXQgaXMuIE5vIG5lZWQgdG8gZGVmZXIgaXQuXG4gICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFya1xuICAgIC8vIHRoaXMgYXMgYW4gdXBkYXRlIHRvIHByZXZlbnQgdGhlIGZpYmVyIGZyb20gYmFpbGluZyBvdXQuXG4gICAgLy9cbiAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkXG4gICAgLy8gdmFsdWUuIFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZSB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nXG4gICAgLy8gYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmIChob29rLmJhc2VTdGF0ZSkge1xuICAgICAgLy8gRmxpcCB0aGlzIGJhY2sgdG8gZmFsc2UuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IGZhbHNlO1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNldFBlbmRpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7XG4gIHNldFBlbmRpbmcodHJ1ZSk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzZXRQZW5kaW5nKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFRyYW5zaXRpb24oKSB7XG4gIHZhciBfbW91bnRTdGF0ZSA9IG1vdW50U3RhdGUoZmFsc2UpLFxuICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGVbMV07IC8vIFRoZSBgc3RhcnRgIG1ldGhvZCBuZXZlciBjaGFuZ2VzLlxuXG5cbiAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gc3RhcnQ7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb24oKSB7XG4gIHZhciBfdXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICB2YXIgX3JlcmVuZGVyU3RhdGUgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudElkKCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZVxuICAvLyBzaG91bGQgZG8gdGhpcyBpbiBGaWJlciwgdG9vPyBEZWZlcnJpbmcgdGhpcyBkZWNpc2lvbiBmb3Igbm93IGJlY2F1c2VcbiAgLy8gdGhlcmUncyBubyBvdGhlciBwbGFjZSB0byBzdG9yZSB0aGUgcHJlZml4IGV4Y2VwdCBmb3IgYW4gaW50ZXJuYWwgZmllbGQgb25cbiAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmVcbiAgLy8gYSByZWZlcmVuY2UgdG8uXG5cbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSByb290LmlkZW50aWZpZXJQcmVmaXg7XG4gIHZhciBpZDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuXG5cbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZFxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhpcyB1c2VJZCBob29rIGFtb25nIGFsbCB0aGUgdXNlSWRcbiAgICAvLyBob29rcyBmb3IgdGhpcyBmaWJlci5cblxuICAgIHZhciBsb2NhbElkID0gbG9jYWxJZENvdW50ZXIrKztcblxuICAgIGlmIChsb2NhbElkID4gMCkge1xuICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7XG4gICAgfVxuXG4gICAgaWQgKz0gJzonO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuXG4gICAgdmFyIGdsb2JhbENsaWVudElkID0gZ2xvYmFsQ2xpZW50SWRDb3VudGVyKys7XG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ3InICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgJzonO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpZCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoU2V0U3RhdGUoZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoZmliZXIubGFuZXMgPT09IE5vTGFuZXMgJiYgKGFsdGVybmF0ZSA9PT0gbnVsbCB8fCBhbHRlcm5hdGUubGFuZXMgPT09IE5vTGFuZXMpKSB7XG4gICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZVxuICAgICAgLy8gbmV4dCBzdGF0ZSBiZWZvcmUgZW50ZXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gSWYgdGhlIG5ldyBzdGF0ZSBpcyB0aGVcbiAgICAgIC8vIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3RhdGUsIHdlIG1heSBiZSBhYmxlIHRvIGJhaWwgb3V0IGVudGlyZWx5LlxuICAgICAgdmFyIGxhc3RSZW5kZXJlZFJlZHVjZXIgPSBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyO1xuXG4gICAgICBpZiAobGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGN1cnJlbnRTdGF0ZSA9IHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlO1xuICAgICAgICAgIHZhciBlYWdlclN0YXRlID0gbGFzdFJlbmRlcmVkUmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7IC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlXG4gICAgICAgICAgLy8gaXQsIG9uIHRoZSB1cGRhdGUgb2JqZWN0LiBJZiB0aGUgcmVkdWNlciBoYXNuJ3QgY2hhbmdlZCBieSB0aGVcbiAgICAgICAgICAvLyB0aW1lIHdlIGVudGVyIHRoZSByZW5kZXIgcGhhc2UsIHRoZW4gdGhlIGVhZ2VyIHN0YXRlIGNhbiBiZSB1c2VkXG4gICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLlxuXG4gICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSB0cnVlO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBzdGlsbCBuZWVkIHRvIGVudGFuZ2xlIHRyYW5zaXRpb25zIGluIHRoaXMgY2FzZT9cbiAgICAgICAgICAgIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7Ly8gU3VwcHJlc3MgdGhlIGVycm9yLiBJdCB3aWxsIHRocm93IGFnYWluIGluIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUpO1xufVxuXG5mdW5jdGlvbiBpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gIHJldHVybiBmaWJlciA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSkge1xuICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgLy8gcXVldWUgLT4gbGlua2VkIGxpc3Qgb2YgdXBkYXRlcy4gQWZ0ZXIgdGhpcyByZW5kZXIgcGFzcywgd2UnbGwgcmVzdGFydFxuICAvLyBhbmQgYXBwbHkgdGhlIHN0YXNoZWQgdXBkYXRlcyBvbiB0b3Agb2YgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xufSAvLyBUT0RPOiBNb3ZlIHRvIFJlYWN0RmliZXJDb25jdXJyZW50VXBkYXRlcz9cblxuXG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpIHtcbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5XG4gICAgLy8gbXVzdCBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaFxuICAgIC8vIHJlcHJlc2VudHMgYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZVxuICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmXG4gICAgLy8gd2UgKmRvbid0KiBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgcXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikge1xuXG4gIHtcbiAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJZDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbn07XG5cbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xufVxuXG52YXIgbm93JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGNvbW1pdFRpbWUgPSAwO1xudmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xO1xudmFyIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG52YXIgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xO1xuLyoqXG4gKiBUcmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkL2Nhc2NhZGluZyB1cGRhdGUgKHNjaGVkdWxlZCBmcm9tIGEgbGF5b3V0IGVmZmVjdCkuXG4gKlxuICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6XG4gKiAgIDEuIHJlbmRlclxuICogICAyLiBjb21taXQgKGFuZCBjYWxsIGBvblJlbmRlcmAsIGBvbkNvbW1pdGApXG4gKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlc1xuICogICA0LiBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgKGFuZCBjYWxsIGBvblBvc3RDb21taXRgKVxuICpcbiAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSxcbiAqIGJ1dCBzdGVwIDQgc3RpbGwgYXBwbGllcyB0byB0aGUgd29yayB0aGF0IHdhcyBqdXN0IGNvbW1pdHRlZC5cbiAqIFdlIHVzZSB0d28gZmxhZ3MgdG8gdHJhY2sgbmVzdGVkIHVwZGF0ZXMgdGhlbjpcbiAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSxcbiAqIGFuZCB0aGUgb3RoZXIgdHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZCB1cGRhdGUuXG4gKiBUaGUgZmlyc3QgdmFsdWUgZ2V0cyBzeW5jZWQgdG8gdGhlIHNlY29uZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlciBwaGFzZS5cbiAqL1xuXG52YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG52YXIgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVJc05lc3RlZDtcbn1cblxuZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHtcbiAge1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQ7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG5cbiAgY29tbWl0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UHJvZmlsZXJUaW1lcihmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93JDEoKTtcblxuICBpZiAoZmliZXIuYWN0dWFsU3RhcnRUaW1lIDwgMCkge1xuICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG5cbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cblxuICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gbGF5b3V0RWZmZWN0U3RhcnRUaW1lO1xuICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZTtcbiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2hlZCBmaWJlcnMgaGF2ZSB0aGVpciBzdGF0ZSBub2RlIGNsZWFyZWQgb3V0LlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHBvaW50ZXIgaXMgYWxzbyBjbGVhcmVkIG91dCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLlxuICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkge1xuXG4gIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCkge1xuXG4gIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgYmFzZVByb3BzKSB7XG4gIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wcy4gVGFrZW4gZnJvbSBSZWFjdEVsZW1lbnRcbiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGJhc2VQcm9wcyk7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbiAgfVxuXG4gIHJldHVybiBiYXNlUHJvcHM7XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGU7XG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25JbnZhbGlkQ2FsbGJhY2s7XG52YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGU7XG52YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXM7XG52YXIgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlO1xudmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEgPSBuZXcgU2V0KCk7XG4gIHZhciBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBuZXcgU2V0KCk7XG5cbiAgd2Fybk9uSW52YWxpZENhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBjYWxsZXJOYW1lICsgJ18nICsgY2FsbGJhY2s7XG5cbiAgICBpZiAoIWRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5oYXMoa2V5KSkge1xuICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmFkZChrZXkpO1xuXG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH07XG5cbiAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gZnVuY3Rpb24gKHR5cGUsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ19wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgaW4gUmVhY3QgMTYrLiBUaGlzIGxpa2VseSAnICsgJ21lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCAnICsgJ2EgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nICcgKyBcInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSBcIiArICd0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCAnICsgJ3RvIFJlYWN0RE9NLmNyZWF0ZVBvcnRhbCkuJyk7XG4gICAgfVxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShmYWtlSW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5leHRQcm9wcykge1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbWVtb2l6ZWRTdGF0ZTsgLy8gT25jZSB0aGUgdXBkYXRlIHF1ZXVlIGlzIGVtcHR5LCBwZXJzaXN0IHRoZSBkZXJpdmVkIHN0YXRlIG9udG8gdGhlXG4gIC8vIGJhc2Ugc3RhdGUuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gUXVldWUgaXMgYWx3YXlzIG5vbi1udWxsIGZvciBjbGFzc2VzXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gbWVtb2l6ZWRTdGF0ZTtcbiAgfVxufVxuXG52YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICBpc01vdW50ZWQ6IGlzTW91bnRlZCxcbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICAgIHtcbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG4gICAgdmFyIHJlbmRlclByZXNlbnQgPSBpbnN0YW5jZS5yZW5kZXI7XG5cbiAgICBpZiAoIXJlbmRlclByZXNlbnQpIHtcbiAgICAgIGlmIChjdG9yLnByb3RvdHlwZSAmJiB0eXBlb2YgY3Rvci5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiBkaWQgeW91IGFjY2lkZW50YWxseSByZXR1cm4gYW4gb2JqZWN0IGZyb20gdGhlIGNvbnN0cnVjdG9yPycsIG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUgJiYgIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCAmJiAhaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICAgIGVycm9yKCdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldERlZmF1bHRQcm9wcyAmJiAhaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BUeXBlcykge1xuICAgICAgZXJyb3IoJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZSkge1xuICAgICAgZXJyb3IoJ2NvbnRleHRUeXBlIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGUgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3Rvci5jaGlsZENvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmhhcyhjdG9yKSAmJiAvLyBTdHJpY3QgTW9kZSBoYXMgaXRzIG93biB3YXJuaW5nIGZvciBsZWdhY3kgY29udGV4dCwgc28gd2UgY2FuIHNraXBcbiAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIHVzZXMgdGhlIGxlZ2FjeSBjaGlsZENvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIGluc3RlYWRcXG5cXG4uJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuaGFzKGN0b3IpICYmIC8vIFN0cmljdCBNb2RlIGhhcyBpdHMgb3duIHdhcm5pbmcgZm9yIGxlZ2FjeSBjb250ZXh0LCBzbyB3ZSBjYW4gc2tpcFxuICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gVXNlICcgKyAnUmVhY3QuY3JlYXRlQ29udGV4dCgpIHdpdGggc3RhdGljIGNvbnRleHRUeXBlIGluc3RlYWQuXFxuXFxuJyArICdMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0ge307XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYXNzaWduIHByb3BzIGRpcmVjdGx5IHRvIHN0YXRlICcgKyBcImJlY2F1c2UgdXBkYXRlcyB0byBwcm9wcyB3b24ndCBiZSByZWZsZWN0ZWQgaW4gc3RhdGUuIFwiICsgJ0luIG1vc3QgY2FzZXMsIGl0IGlzIGJldHRlciB0byB1c2UgcHJvcHMgZGlyZWN0bHkuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG5cbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9IC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG5cbiAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOyAvLyBJZiB3ZSBoYWQgYWRkaXRpb25hbCBzdGF0ZSB1cGRhdGVzIGR1cmluZyB0aGlzIGxpZmUtY3ljbGUsIGxldCdzXG4gICAgLy8gcHJvY2VzcyB0aGVtIG5vdy5cblxuICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgfVxuXG4gICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFncztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MyID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzMjtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpICYmICEoZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgICkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB8fCAvLyBUT0RPOiBJbiBzb21lIGNhc2VzLCB3ZSdsbCBlbmQgdXAgY2hlY2tpbmcgaWYgY29udGV4dCBoYXMgY2hhbmdlZCB0d2ljZSxcbiAgLy8gYm90aCBiZWZvcmUgYW5kIGFmdGVyIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIGhhcyBiZWVuIGNhbGxlZC4gTm90IGlkZWFsLFxuICAvLyBidXQgSSdtIGxvYXRoIHRvIHJlZmFjdG9yIHRoaXMgZnVuY3Rpb24uIFRoaXMgb25seSBoYXBwZW5zIGZvciBtZW1vaXplZFxuICAvLyBjb21wb25lbnRzIHNvIGl0J3Mgbm90IHRoYXQgY29tbW9uLlxuICBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHByb3BzL3N0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkge1xuICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZXJyb3IsIGNhbGwgdGhpcyBmdW5jdGlvbiBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0aHJvd25cbiAgLy8gc28gdGhlIHN0YWNrIGlzIGFjY3VyYXRlLlxuICByZXR1cm4ge1xuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksXG4gICAgZGlnZXN0OiBudWxsXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBkaWdlc3QsIHN0YWNrKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogbnVsbCxcbiAgICBzdGFjazogc3RhY2sgIT0gbnVsbCA/IHN0YWNrIDogbnVsbCxcbiAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbFxuICB9O1xufVxuXG4vLyBUaGlzIG1vZHVsZSBpcyBmb3JrZWQgaW4gZGlmZmVyZW50IGVudmlyb25tZW50cy5cbi8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS5cbi8vIEZvcmtzIGNhbiByZXR1cm4gYGZhbHNlYCBpZiB0aGlzIGlzbid0IGRlc2lyYWJsZS5cbmZ1bmN0aW9uIHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsb2dDYXB0dXJlZEVycm9yKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgdHJ5IHtcbiAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuXG4gICAgLy8gVGhpcyBlbmFibGVzIHJlbmRlcmVycyBsaWtlIFJlYWN0TmF0aXZlIHRvIGJldHRlciBtYW5hZ2UgcmVkYm94IGJlaGF2aW9yLlxuXG4gICAgaWYgKGxvZ0Vycm9yID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIGlmICh0cnVlKSB7XG4gICAgICB2YXIgc291cmNlID0gZXJyb3JJbmZvLnNvdXJjZTtcbiAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjaztcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmdcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdCgpYCBpbiB3aW5kb3cgYGVycm9yYCBoYW5kbGVyLlxuICAgICAgLy8gV2UgcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24gYXMgYW4gZXhwYW5kbyBvbiB0aGUgZXJyb3IuXG5cbiAgICAgIGlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAvLyBUaGUgZXJyb3IgaXMgcmVjb3ZlcmFibGUgYW5kIHdhcyBzaWxlbmNlZC5cbiAgICAgICAgICAvLyBJZ25vcmUgaXQgYW5kIGRvbid0IHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cbiAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gVGhlIGVycm9yIGlzIGZhdGFsLiBTaW5jZSB0aGUgc2lsZW5jaW5nIG1pZ2h0IGhhdmVcbiAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhlIGJyb3dzZXIgd291bGQgaGF2ZSBzaWxlbmNlZCB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICAgICAgLy8gc28gd2UnbGwgcHJpbnQgaXQgZmlyc3QsIGFuZCB0aGVuIHByaW50IHRoZSBzdGFjayBhZGRlbmR1bS5cblxuXG4gICAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOyAvLyBEb24ndCB0cmFuc2Zvcm0gdG8gb3VyIHdyYXBwZXJcbiAgICAgICAgLy8gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGJsb2NrLCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gc291cmNlID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihzb3VyY2UpIDogbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lTWVzc2FnZSA9IGNvbXBvbmVudE5hbWUgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQ6XCIgOiAnVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHM6JztcbiAgICAgIHZhciBlcnJvckJvdW5kYXJ5TWVzc2FnZTtcblxuICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXFxuJyArICdWaXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBlcnJvckJvdW5kYXJ5TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoYm91bmRhcnkpIHx8ICdBbm9ueW1vdXMnO1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9IFwiUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnQgdHJlZSBmcm9tIHNjcmF0Y2ggXCIgKyAoXCJ1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArIGVycm9yQm91bmRhcnlOYW1lICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyBcIlxcblwiICsgY29tcG9uZW50U3RhY2sgKyBcIlxcblxcblwiICsgKFwiXCIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay5cbiAgICAgIC8vIFdlIGRvbid0IGluY2x1ZGUgdGhlIG9yaWdpbmFsIGVycm9yIG1lc3NhZ2UgYW5kIEpTIHN0YWNrIGJlY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAgIC8vIGhhcyBhbHJlYWR5IHByaW50ZWQgaXQuIEV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIHN3YWxsb3dzIHRoZSBlcnJvciwgaXQgaXMgc3RpbGxcbiAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLlxuXG4gICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBwcm9kdWN0aW9uLCB3ZSBwcmludCB0aGUgZXJyb3IgZGlyZWN0bHkuXG4gICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgbWVzc2FnZSwgdGhlIEpTIHN0YWNrLCBhbmQgYW55dGhpbmcgdGhlIGJyb3dzZXIgd2FudHMgdG8gc2hvdy5cbiAgICAgIC8vIFdlIHBhc3MgdGhlIGVycm9yIG9iamVjdCBpbnN0ZWFkIG9mIGN1c3RvbSBtZXNzYWdlIHNvIHRoYXQgdGhlIGJyb3dzZXIgZGlzcGxheXMgdGhlIGVycm9yIG5hdGl2ZWx5LlxuICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRoaXMgbWV0aG9kIG11c3Qgbm90IHRocm93LCBvciBSZWFjdCBpbnRlcm5hbCBzdGF0ZSB3aWxsIGdldCBtZXNzZWQgdXAuXG4gICAgLy8gSWYgY29uc29sZS5lcnJvciBpcyBvdmVycmlkZGVuLCBvciBsb2dDYXB0dXJlZEVycm9yKCkgc2hvd3MgYSBkaWFsb2cgdGhhdCB0aHJvd3MsXG4gICAgLy8gd2Ugd2FudCB0byByZXBvcnQgdGhpcyBlcnJvciBvdXRzaWRlIG9mIHRoZSBub3JtYWwgc3RhY2sgYXMgYSBsYXN0IHJlc29ydC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMTg4XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBQb3NzaWJseVdlYWtNYXAkMSA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdEVycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7IC8vIFVubW91bnQgdGhlIHJvb3QgYnkgcmVuZGVyaW5nIG51bGwuXG5cbiAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IG51bGxcbiAgfTtcbiAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblVuY2F1Z2h0RXJyb3IoZXJyb3IpO1xuICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpO1xuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9IGZpYmVyLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHtcbiAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpO1xuICAgICAgfVxuXG4gICAgICBsb2dDYXB0dXJlZEVycm9yKGZpYmVyLCBlcnJvckluZm8pO1xuICAgIH07XG4gIH1cblxuICB2YXIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICBpZiAoaW5zdCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG5cbiAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLFxuICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHdoaWNoIG9uZXMgYWxyZWFkeSBmYWlsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgICAgIC8vIFRoaXMgZ2V0cyByZXNldCBiZWZvcmUgd2UgeWllbGQgYmFjayB0byB0aGUgYnJvd3Nlci5cbiAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXNcbiAgICAgICAgLy8gbm90IGRlZmluZWQuXG4gICAgICAgIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIEF0dGFjaCBhIHBpbmcgbGlzdGVuZXJcbiAgLy9cbiAgLy8gVGhlIGRhdGEgbWlnaHQgcmVzb2x2ZSBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBjb21taXQgdGhlIGZhbGxiYWNrLiBPcixcbiAgLy8gaW4gdGhlIGNhc2Ugb2YgYSByZWZyZXNoLCB3ZSdsbCBuZXZlciBjb21taXQgYSBmYWxsYmFjay4gU28gd2UgbmVlZCB0b1xuICAvLyBhdHRhY2ggYSBsaXN0ZW5lciBub3cuIFdoZW4gaXQgcmVzb2x2ZXMgKFwicGluZ3NcIiksIHdlIGNhbiBkZWNpZGUgd2hldGhlciB0b1xuICAvLyB0cnkgcmVuZGVyaW5nIHRoZSB0cmVlIGFnYWluLlxuICAvL1xuICAvLyBPbmx5IGF0dGFjaCBhIGxpc3RlbmVyIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgbGFuZXNcbiAgLy8gd2UncmUgY3VycmVudGx5IHJlbmRlcmluZyAod2hpY2ggYWN0cyBsaWtlIGEgXCJ0aHJlYWQgSURcIiBoZXJlKS5cbiAgLy9cbiAgLy8gV2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuICB2YXIgdGhyZWFkSURzO1xuXG4gIGlmIChwaW5nQ2FjaGUgPT09IG51bGwpIHtcbiAgICBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAkMSgpO1xuICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICB9IGVsc2Uge1xuICAgIHRocmVhZElEcyA9IHBpbmdDYWNoZS5nZXQod2FrZWFibGUpO1xuXG4gICAgaWYgKHRocmVhZElEcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhyZWFkSURzLmhhcyhsYW5lcykpIHtcbiAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSB0aHJlYWQgSUQgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgIHRocmVhZElEcy5hZGQobGFuZXMpO1xuICAgIHZhciBwaW5nID0gcGluZ1N1c3BlbmRlZFJvb3QuYmluZChudWxsLCByb290LCB3YWtlYWJsZSwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIC8vIFJldHJ5IGxpc3RlbmVyXG4gIC8vXG4gIC8vIElmIHRoZSBmYWxsYmFjayBkb2VzIGNvbW1pdCwgd2UgbmVlZCB0byBhdHRhY2ggYSBkaWZmZXJlbnQgdHlwZSBvZlxuICAvLyBsaXN0ZW5lci4gVGhpcyBvbmUgc2NoZWR1bGVzIGFuIHVwZGF0ZSBvbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgdG8gdHVyblxuICAvLyB0aGUgZmFsbGJhY2sgc3RhdGUgb2ZmLlxuICAvL1xuICAvLyBTdGFzaCB0aGUgd2FrZWFibGUgb24gdGhlIGJvdW5kYXJ5IGZpYmVyIHNvIHdlIGNhbiBhY2Nlc3MgaXQgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZS5cbiAgLy9cbiAgLy8gV2hlbiB0aGUgd2FrZWFibGUgcmVzb2x2ZXMsIHdlJ2xsIGF0dGVtcHQgdG8gcmVuZGVyIHRoZSBib3VuZGFyeVxuICAvLyBhZ2FpbiAoXCJyZXRyeVwiKS5cbiAgdmFyIHdha2VhYmxlcyA9IHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgIHN1c3BlbnNlQm91bmRhcnkudXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZTtcbiAgfSBlbHNlIHtcbiAgICB3YWtlYWJsZXMuYWRkKHdha2VhYmxlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIEEgbGVnYWN5IG1vZGUgU3VzcGVuc2UgcXVpcmssIG9ubHkgcmVsZXZhbnQgdG8gaG9vayBjb21wb25lbnRzLlxuXG5cbiAgdmFyIHRhZyA9IHNvdXJjZUZpYmVyLnRhZztcblxuICBpZiAoKHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAodGFnID09PSBGdW5jdGlvbkNvbXBvbmVudCB8fCB0YWcgPT09IEZvcndhcmRSZWYgfHwgdGFnID09PSBTaW1wbGVNZW1vQ29tcG9uZW50KSkge1xuICAgIHZhciBjdXJyZW50U291cmNlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnRTb3VyY2UpIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50U291cmNlLm1lbW9pemVkU3RhdGU7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IGN1cnJlbnRTb3VyY2UubGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcikge1xuICB2YXIgbm9kZSA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSAvLyBUaGlzIGJvdW5kYXJ5IGFscmVhZHkgY2FwdHVyZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBDb250aW51ZSB0byB0aGUgbmV4dFxuICAgIC8vIGJvdW5kYXJ5LlxuXG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH0gd2hpbGUgKG5vZGUgIT09IG51bGwpO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBtYXJrcyBhIFN1c3BlbnNlIGJvdW5kYXJ5IHNvIHRoYXQgd2hlbiB3ZSdyZSB1bndpbmRpbmcgdGhlIHN0YWNrLFxuICAvLyBpdCBjYXB0dXJlcyB0aGUgc3VzcGVuZGVkIFwiZXhjZXB0aW9uXCIgYW5kIGRvZXMgYSBzZWNvbmQgKGZhbGxiYWNrKSBwYXNzLlxuICBpZiAoKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gTGVnYWN5IE1vZGUgU3VzcGVuc2VcbiAgICAvL1xuICAgIC8vIElmIHRoZSBib3VuZGFyeSBpcyBpbiBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkICpub3QqXG4gICAgLy8gc3VzcGVuZCB0aGUgY29tbWl0LiBQcmV0ZW5kIGFzIGlmIHRoZSBzdXNwZW5kZWQgY29tcG9uZW50IHJlbmRlcmVkXG4gICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIFdoZW4gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IGNvbXBsZXRlcyxcbiAgICAvLyB3ZSdsbCBkbyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgPT09IHJldHVybkZpYmVyKSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2Ugc3VzcGVuZGVkIHdoaWxlIHJlY29uY2lsaW5nIHRoZSBjaGlsZHJlbiBvZlxuICAgICAgLy8gYSBTdXNwZW5zZSBib3VuZGFyeSdzIGlubmVyIE9mZnNjcmVlbiB3cmFwcGVyIGZpYmVyLiBUaGlzIGhhcHBlbnNcbiAgICAgIC8vIHdoZW4gYSBSZWFjdC5sYXp5IGNvbXBvbmVudCBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICAgIC8vXG4gICAgICAvLyBTdXNwZW5zZSBib3VuZGFyaWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBtdWx0aXBsZSBmaWJlcnMsIGJ1dCB0aGV5XG4gICAgICAvLyBhcmUgYSBzaW5nbGUgY29uY2VwdHVhbCB1bml0LiBUaGUgbGVnYWN5IG1vZGUgYmVoYXZpb3Igd2hlcmUgd2VcbiAgICAgIC8vIHByZXRlbmQgdGhlIHN1c3BlbmRlZCBmaWJlciBjb21taXR0ZWQgYXMgYG51bGxgIHdvbid0IHdvcmssXG4gICAgICAvLyBiZWNhdXNlIGluIHRoaXMgY2FzZSB0aGUgXCJzdXNwZW5kZWRcIiBmaWJlciBpcyB0aGUgaW5uZXJcbiAgICAgIC8vIE9mZnNjcmVlbiB3cmFwcGVyLlxuICAgICAgLy9cbiAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBib3VuZGFyeSBoYXZlbid0IHN0YXJ0ZWQgcmVuZGVyaW5nXG4gICAgICAvLyB5ZXQgKGkuZS4gbm90aGluZyBpbiB0aGUgdHJlZSBoYXMgcGFydGlhbGx5IHJlbmRlcmVkKSB3ZSBjYW5cbiAgICAgIC8vIHN3aXRjaCB0byB0aGUgcmVndWxhciwgY29uY3VycmVudCBtb2RlIGJlaGF2aW9yOiBtYXJrIHRoZVxuICAgICAgLy8gYm91bmRhcnkgd2l0aCBTaG91bGRDYXB0dXJlIGFuZCBlbnRlciB0aGUgdW53aW5kIHBoYXNlLlxuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICBzb3VyY2VGaWJlci5mbGFncyB8PSBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlOyAvLyBXZSdyZSBnb2luZyB0byBjb21taXQgdGhpcyBmaWJlciBldmVuIHRob3VnaCBpdCBkaWRuJ3QgY29tcGxldGUuXG4gICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAvLyBhbGwgbGlmZWN5Y2xlIGVmZmVjdCB0YWdzLlxuXG4gICAgICBzb3VyY2VGaWJlci5mbGFncyAmPSB+KExpZmVjeWNsZUVmZmVjdE1hc2sgfCBJbmNvbXBsZXRlKTtcblxuICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTb3VyY2VGaWJlciA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoY3VycmVudFNvdXJjZUZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAvLyBjb21wbGV0ZWQgY2xhc3MgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5vdCBjYWxsXG4gICAgICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQgaWYgaXQgaXMgZGVsZXRlZC5cbiAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSB0cnkgcmVuZGVyaW5nIGFnYWluLCB3ZSBzaG91bGQgbm90IHJldXNlIHRoZSBjdXJyZW50IGZpYmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuXG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgU3luY0xhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICBlbnF1ZXVlVXBkYXRlKHNvdXJjZUZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuIE1hcmsgaXQgd2l0aCBTeW5jIHByaW9yaXR5IHRvXG4gICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBTeW5jTGFuZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG4gIH0gLy8gQ29uZmlybWVkIHRoYXQgdGhlIGJvdW5kYXJ5IGlzIGluIGEgY29uY3VycmVudCBtb2RlIHRyZWUuIENvbnRpbnVlXG4gIC8vIHdpdGggdGhlIG5vcm1hbCBzdXNwZW5kIHBhdGguXG4gIC8vXG4gIC8vIEFmdGVyIHRoaXMgd2UnbGwgdXNlIGEgc2V0IG9mIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpc1xuICAvLyByZW5kZXIgcGFzcyB3aWxsIHJ1biB0byBjb21wbGV0aW9uIG9yIHJlc3RhcnQgb3IgXCJzdXNwZW5kXCIgdGhlIGNvbW1pdC5cbiAgLy8gVGhlIGFjdHVhbCBsb2dpYyBmb3IgdGhpcyBpcyBzcHJlYWQgb3V0IGluIGRpZmZlcmVudCBwbGFjZXMuXG4gIC8vXG4gIC8vIFRoaXMgZmlyc3QgcHJpbmNpcGxlIGlzIHRoYXQgaWYgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3aGVuIHdlIGNvbXBsZXRlXG4gIC8vIGEgcm9vdCwgdGhlbiB3ZSBzaG91bGQgYWxzbyByZXN0YXJ0IGlmIHdlIGdldCBhbiB1cGRhdGUgb3IgcGluZyB0aGF0XG4gIC8vIG1pZ2h0IHVuc3VzcGVuZCBpdCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBvbmx5IHJlYXNvbiB0byBzdXNwZW5kIGlzXG4gIC8vIGJlY2F1c2UgeW91IHRoaW5rIHlvdSBtaWdodCB3YW50IHRvIHJlc3RhcnQgYmVmb3JlIGNvbW1pdHRpbmcuIEhvd2V2ZXIsXG4gIC8vIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXN0YXJ0IG9ubHkgd2hpbGUgaW4gdGhlIHBlcmlvZCB3ZSdyZSBzdXNwZW5kZWQuXG4gIC8vXG4gIC8vIFJlc3RhcnRpbmcgdG9vIGFnZ3Jlc3NpdmVseSBpcyBhbHNvIG5vdCBnb29kIGJlY2F1c2UgaXQgc3RhcnZlcyBvdXQgYW55XG4gIC8vIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBTbyB3ZSB1c2UgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hlbi5cbiAgLy8gU3VzcGVuc2UgSGV1cmlzdGljc1xuICAvL1xuICAvLyBJZiBub3RoaW5nIHRocmV3IGEgUHJvbWlzZSBvciBhbGwgdGhlIHNhbWUgZmFsbGJhY2tzIGFyZSBhbHJlYWR5IHNob3dpbmcsXG4gIC8vIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGFuIGluaXRpYWwgcmVuZGVyIG9mIGEgbmV3IHRyZWUgb2YgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgLy8gdGhvc2UgdHJpZ2dlciBhIGZhbGxiYWNrLCB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBjYW4gc2hvdyB0aGUgaW5pdGlhbCBsb2FkaW5nIHN0YXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuXG4gIC8vXG4gIC8vIElmIHdlIGhpdCBhIFwiRGVsYXllZFwiIGNhc2UsIHN1Y2ggYXMgd2hlbiB3ZSdkIHN3aXRjaCBmcm9tIGNvbnRlbnQgYmFjayBpbnRvXG4gIC8vIGEgZmFsbGJhY2ssIHRoZW4gd2Ugc2hvdWxkIGFsd2F5cyBzdXNwZW5kL3Jlc3RhcnQuIFRyYW5zaXRpb25zIGFwcGx5XG4gIC8vIHRvIHRoaXMgY2FzZS4gSWYgbm9uZSBpcyBkZWZpbmVkLCBKTkQgaXMgdXNlZCBpbnN0ZWFkLlxuICAvL1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBhbmQgaXQgZ2V0cyBcInJldHJpZWRcIiwgYWxsb3dpbmcgdXMgdG8gc2hvd1xuICAvLyBhbm90aGVyIGxldmVsLCBidXQgdGhlcmUncyBzdGlsbCBhbiBpbm5lciBib3VuZGFyeSB0aGF0IHdvdWxkIHNob3cgYSBmYWxsYmFjayxcbiAgLy8gdGhlbiB3ZSBzdXNwZW5kL3Jlc3RhcnQgZm9yIDUwMG1zIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugc2hvd2VkIGEgZmFsbGJhY2tcbiAgLy8gYW55d2hlcmUgaW4gdGhlIHRyZWUuIFRoaXMgZWZmZWN0aXZlbHkgdGhyb3R0bGVzIHByb2dyZXNzaXZlIGxvYWRpbmcgaW50byBhXG4gIC8vIGNvbnNpc3RlbnQgdHJhaW4gb2YgY29tbWl0cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3RhcnQgdG9cbiAgLy8gZ2V0IHRvIHRoZSBjb21wbGV0ZWQgc3RhdGUgc2xpZ2h0bHkgZWFybGllci5cbiAgLy9cbiAgLy8gSWYgdGhlcmUncyBhbWJpZ3VpdHkgZHVlIHRvIGJhdGNoaW5nIGl0J3MgcmVzb2x2ZWQgaW4gcHJlZmVyZW5jZSBvZjpcbiAgLy8gMSkgXCJkZWxheWVkXCIsIDIpIFwiaW5pdGlhbCByZW5kZXJcIiwgMykgXCJyZXRyeVwiLlxuICAvL1xuICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgXCJidXN5XCIgc3RhdGUgZG9lc24ndCBnZXQgZm9yY2UgY29tbWl0dGVkLiBXZSB3YW50IHRvXG4gIC8vIGVuc3VyZSB0aGF0IG5ldyBpbml0aWFsIGxvYWRpbmcgc3RhdGVzIGNhbiBjb21taXQgYXMgc29vbiBhcyBwb3NzaWJsZS5cblxuXG4gIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIG5vdyB1c2UgYERpZENhcHR1cmVgIGluXG4gIC8vIHRoZSBiZWdpbiBwaGFzZSB0byBwcmV2ZW50IGFuIGVhcmx5IGJhaWxvdXQuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5sYW5lcyA9IHJvb3RSZW5kZXJMYW5lcztcbiAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUaGlzIGlzIGEgd2FrZWFibGUuIFRoZSBjb21wb25lbnQgc3VzcGVuZGVkLlxuICAgIHZhciB3YWtlYWJsZSA9IHZhbHVlO1xuICAgIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyKTtcblxuICAgIHtcbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgdmFyIHN1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7XG5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBXZSBvbmx5IGF0dGFjaCBwaW5nIGxpc3RlbmVycyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgICAgIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy5cblxuICAgICAgaWYgKHN1c3BlbnNlQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gVW5sZXNzIHRoaXMgaXMgYSBzeW5jIHVwZGF0ZSwgdGhpcyBpcyBPSy5cbiAgICAgIC8vIFdlIGNhbiBzdXNwZW5kIGFuZCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuICAgICAgaWYgKCFpbmNsdWRlc1N5bmNMYW5lKHJvb3RSZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBzeW5jIHVwZGF0ZS4gU3VzcGVuZC4gU2luY2Ugd2UncmUgbm90IGFjdGl2YXRpbmcgYVxuICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgdGhpcyB3aWxsIHVud2luZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdCB3aXRob3V0XG4gICAgICAgIC8vIHBlcmZvcm1pbmcgYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgYSBmYWxsYmFjay4gKFRoaXMgaXMgYXJndWFibHkgaG93XG4gICAgICAgIC8vIHJlZnJlc2ggdHJhbnNpdGlvbnMgc2hvdWxkIHdvcmssIHRvbywgc2luY2Ugd2UncmUgbm90IGdvaW5nIHRvIGNvbW1pdFxuICAgICAgICAvLyB0aGUgZmFsbGJhY2tzIGFueXdheS4pXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgY2FzZSBhbHNvIGFwcGxpZXMgdG8gaW5pdGlhbCBoeWRyYXRpb24uXG4gICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgaXMgYSBzeW5jL2Rpc2NyZXRlIHVwZGF0ZS4gV2UgdHJlYXQgdGhpcyBjYXNlIGxpa2UgYW4gZXJyb3JcbiAgICAgIC8vIGJlY2F1c2UgZGlzY3JldGUgcmVuZGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHRyZWVcbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCBleHRlcm5hbCBzdGF0ZS5cblxuXG4gICAgICB2YXIgdW5jYXVnaHRTdXNwZW5zZUVycm9yID0gbmV3IEVycm9yKCdBIGNvbXBvbmVudCBzdXNwZW5kZWQgd2hpbGUgcmVzcG9uZGluZyB0byBzeW5jaHJvbm91cyBpbnB1dC4gVGhpcyAnICsgJ3dpbGwgY2F1c2UgdGhlIFVJIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkaW5nIGluZGljYXRvci4gVG8gJyArICdmaXgsIHVwZGF0ZXMgdGhhdCBzdXNwZW5kIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnd2l0aCBzdGFydFRyYW5zaXRpb24uJyk7IC8vIElmIHdlJ3JlIG91dHNpZGUgYSB0cmFuc2l0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgZXJyb3IgcGF0aC5cbiAgICAgIC8vIFRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgbmVhcmVzdCBzdXNwZW5zZSBib3VuZGFyeS5cblxuICAgICAgdmFsdWUgPSB1bmNhdWdodFN1c3BlbnNlRXJyb3I7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSByZWd1bGFyIGVycm9yLCBub3QgYSBTdXNwZW5zZSB3YWtlYWJsZS5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG5cbiAgICAgIHZhciBfc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsgLy8gSWYgdGhlIGVycm9yIHdhcyB0aHJvd24gZHVyaW5nIGh5ZHJhdGlvbiwgd2UgbWF5IGJlIGFibGUgdG8gcmVjb3ZlciBieVxuICAgICAgLy8gZGlzY2FyZGluZyB0aGUgZGVoeWRyYXRlZCBjb250ZW50IGFuZCBzd2l0Y2hpbmcgdG8gYSBjbGllbnQgcmVuZGVyLlxuICAgICAgLy8gSW5zdGVhZCBvZiBzdXJmYWNpbmcgdGhlIGVycm9yLCBmaW5kIHRoZSBuZWFyZXN0IFN1c3BlbnNlIGJvdW5kYXJ5XG4gICAgICAvLyBhbmQgcmVuZGVyIGl0IGFnYWluIHdpdGhvdXQgaHlkcmF0aW9uLlxuXG5cbiAgICAgIGlmIChfc3VzcGVuc2VCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTZXQgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIHRyeSByZW5kZXJpbmcgdGhlIG5vcm1hbFxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFnYWluLCBub3QgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKF9zdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIEV2ZW4gdGhvdWdoIHRoZSB1c2VyIG1heSBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyBlcnJvciwgd2Ugc2hvdWxkXG4gICAgICAgIC8vIHN0aWxsIGxvZyBpdCBzbyBpdCBjYW4gYmUgZml4ZWQuXG5cbiAgICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpOyAvLyBXZSBkaWRuJ3QgZmluZCBhIGJvdW5kYXJ5IHRoYXQgY291bGQgaGFuZGxlIHRoaXMgdHlwZSBvZiBleGNlcHRpb24uIFN0YXJ0XG4gIC8vIG92ZXIgYW5kIHRyYXZlcnNlIHBhcmVudCBwYXRoIGFnYWluLCB0aGlzIHRpbWUgdHJlYXRpbmcgdGhlIGV4Y2VwdGlvblxuICAvLyBhcyBhbiBlcnJvci5cblxuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjtcblxuICBkbyB7XG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX2Vycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgbGFuZSk7XG4gICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX2Vycm9ySW5mbywgbGFuZSk7XG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBDYXB0dXJlIGFuZCByZXRyeVxuICAgICAgICB2YXIgZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyAmJiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcblxuICAgICAgICAgIHZhciBfbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIF9sYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgX3VwZGF0ZSA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpO1xufVxuXG5mdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBzdXNwZW5kcy4gSXQgcmV0dXJucyB0aGVcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcbnZhciBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbiAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBmcmVzaCBuZXcgY29tcG9uZW50IHRoYXQgaGFzbid0IGJlZW4gcmVuZGVyZWQgeWV0LCB3ZVxuICAgIC8vIHdvbid0IHVwZGF0ZSBpdHMgY2hpbGQgc2V0IGJ5IGFwcGx5aW5nIG1pbmltYWwgc2lkZS1lZmZlY3RzLiBJbnN0ZWFkLFxuICAgIC8vIHdlIHdpbGwgYWRkIHRoZW0gYWxsIHRvIHRoZSBjaGlsZCBiZWZvcmUgaXQgZ2V0cyByZW5kZXJlZC4gVGhhdCBtZWFuc1xuICAgIC8vIHdlIGNhbiBvcHRpbWl6ZSB0aGlzIHJlY29uY2lsaWF0aW9uIHBhc3MgYnkgbm90IHRyYWNraW5nIHNpZGUtZWZmZWN0cy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBzYW1lIGFzIHRoZSB3b3JrIGluIHByb2dyZXNzLCBpdCBtZWFucyB0aGF0XG4gICAgLy8gd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhbnkgd29yayBvbiB0aGVzZSBjaGlsZHJlbi4gVGhlcmVmb3JlLCB3ZSB1c2VcbiAgICAvLyB0aGUgY2xvbmUgYWxnb3JpdGhtIHRvIGNyZWF0ZSBhIGNvcHkgb2YgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuLlxuICAgIC8vIElmIHdlIGhhZCBhbnkgcHJvZ3Jlc3NlZCB3b3JrIGFscmVhZHksIHRoYXQgaXMgaW52YWxpZCBhdCB0aGlzIHBvaW50IHNvXG4gICAgLy8gbGV0J3MgdGhyb3cgaXQgb3V0LlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3JrIG9mIHJlY29uY2lsZUNoaWxkcmVuLiBJdCdzIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2VcbiAgLy8gd2FudCB0byByZWNvbmNpbGUgd2l0aG91dCBtYXRjaGluZyBhZ2FpbnN0IHRoZSBleGlzdGluZyBzZXQuIFRoaXMgaGFzIHRoZVxuICAvLyBlZmZlY3Qgb2YgYWxsIGN1cnJlbnQgY2hpbGRyZW4gYmVpbmcgdW5tb3VudGVkOyBldmVuIGlmIHRoZSB0eXBlIGFuZCBrZXlcbiAgLy8gYXJlIHRoZSBzYW1lLCB0aGUgb2xkIGNoaWxkIGlzIHVubW91bnRlZCBhbmQgYSBuZXcgY2hpbGQgaXMgY3JlYXRlZC5cbiAgLy9cbiAgLy8gVG8gZG8gdGhpcywgd2UncmUgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVjb25jaWxlIGFsZ29yaXRobSB0d2ljZS4gSW5cbiAgLy8gdGhlIGZpcnN0IHBhc3MsIHdlIHNjaGVkdWxlIGEgZGVsZXRpb24gZm9yIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbiBieVxuICAvLyBwYXNzaW5nIG51bGwuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBtb3VudCB0aGUgbmV3IGNoaWxkcmVuLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlXG4gIC8vIHBhc3MgbnVsbCBpbiBwbGFjZSBvZiB3aGVyZSB3ZSB1c3VhbGx5IHBhc3MgdGhlIGN1cnJlbnQgY2hpbGQgc2V0LiBUaGlzIGhhc1xuICAvLyB0aGUgZWZmZWN0IG9mIHJlbW91bnRpbmcgYWxsIGNoaWxkcmVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVpclxuICAvLyBpZGVudGl0aWVzIG1hdGNoLlxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlciBzdXNwZW5kcy5cbiAgLy8gV2UnbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoaXMgaXMgZmluZSBvciBjYW4gY2F1c2UgaXNzdWVzLlxuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciByZW5kZXIgPSBDb21wb25lbnQucmVuZGVyO1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmOyAvLyBUaGUgcmVzdCBpcyBhIGZvcmsgb2YgdXBkYXRlRnVuY3Rpb25Db21wb25lbnRcblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICB2YXIgaGFzSWQ7XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7XG5cbiAgICBpZiAoaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSAmJiBDb21wb25lbnQuY29tcGFyZSA9PT0gbnVsbCAmJiAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuXG4gICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG4gICAgICB9IC8vIElmIHRoaXMgaXMgYSBwbGFpbiBmdW5jdGlvbiBjb21wb25lbnQgd2l0aG91dCBkZWZhdWx0IHByb3BzLFxuICAgICAgLy8gYW5kIHdpdGggb25seSB0aGUgZGVmYXVsdCBzaGFsbG93IGNvbXBhcmlzb24sIHdlIHVwZ3JhZGUgaXRcbiAgICAgIC8vIHRvIGEgU2ltcGxlTWVtb0NvbXBvbmVudCB0byBhbGxvdyBmYXN0IHBhdGggdXBkYXRlcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBTaW1wbGVNZW1vQ29tcG9uZW50O1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVkVHlwZTtcblxuICAgICAge1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVzb2x2ZWRUeXBlLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBDb21wb25lbnQuZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIGVycm9yKCclczogU3VwcG9ydCBmb3IgZGVmYXVsdFByb3BzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIG1lbW8gY29tcG9uZW50cyAnICsgJ2luIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIFVzZSBKYXZhU2NyaXB0IGRlZmF1bHQgcGFyYW1ldGVycyBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Q2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGlzIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBjaGlsZFxuXG4gIHZhciBoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgPSBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcyk7XG5cbiAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQpIHtcbiAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHByb3BzIHdpdGggcmVzb2x2ZWQgZGVmYXVsdFByb3BzLFxuICAgIC8vIHVubGlrZSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgd2hpY2ggd2lsbCBiZSB0aGUgdW5yZXNvbHZlZCBvbmVzLlxuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Q2hpbGQubWVtb2l6ZWRQcm9wczsgLy8gRGVmYXVsdCB0byBzaGFsbG93IGNvbXBhcmlzb25cblxuICAgIHZhciBjb21wYXJlID0gQ29tcG9uZW50LmNvbXBhcmU7XG4gICAgY29tcGFyZSA9IGNvbXBhcmUgIT09IG51bGwgPyBjb21wYXJlIDogc2hhbGxvd0VxdWFsO1xuXG4gICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzKTtcbiAgbmV3Q2hpbGQucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDtcbiAgcmV0dXJuIG5ld0NoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvdXRlck1lbW9UeXBlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAoc2hhbGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSAmJiBjdXJyZW50LnJlZiA9PT0gd29ya0luUHJvZ3Jlc3MucmVmICYmICggLy8gUHJldmVudCBiYWlsb3V0IGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkLlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGUgcHJvcHMgYXJlIHNoYWxsb3dseSBlcXVhbC4gUmV1c2UgdGhlIHByZXZpb3VzIHByb3BzIG9iamVjdCwgbGlrZSB3ZVxuICAgICAgLy8gd291bGQgZHVyaW5nIGEgbm9ybWFsIGZpYmVyIGJhaWxvdXQuXG4gICAgICAvL1xuICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBzdHJvbmcgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcm9wcyBvYmplY3QgaXMgcmVmZXJlbnRpYWxseVxuICAgICAgLy8gZXF1YWwgZHVyaW5nIHVwZGF0ZXMgd2hlcmUgd2UgY2FuJ3QgYmFpbCBvdXQgYW55d2F5IFx1MjAxNCBsaWtlIGlmIHRoZSBwcm9wc1xuICAgICAgLy8gYXJlIHNoYWxsb3dseSBlcXVhbCwgYnV0IHRoZXJlJ3MgYSBsb2NhbCBzdGF0ZSBvciBjb250ZXh0IHVwZGF0ZSBpbiB0aGVcbiAgICAgIC8vIHNhbWUgYmF0Y2guXG4gICAgICAvL1xuICAgICAgLy8gSG93ZXZlciwgYXMgYSBwcmluY2lwbGUsIHdlIHNob3VsZCBhaW0gdG8gbWFrZSB0aGUgYmVoYXZpb3IgY29uc2lzdGVudFxuICAgICAgLy8gYWNyb3NzIGRpZmZlcmVudCB3YXlzIG9mIG1lbW9pemluZyBhIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIFJlYWN0Lm1lbW9cbiAgICAgIC8vIGhhcyBhIGRpZmZlcmVudCBpbnRlcm5hbCBGaWJlciBsYXlvdXQgaWYgeW91IHBhc3MgYSBub3JtYWwgZnVuY3Rpb25cbiAgICAgIC8vIGNvbXBvbmVudCAoU2ltcGxlTWVtb0NvbXBvbmVudCkgdmVyc3VzIGlmIHlvdSBwYXNzIGEgZGlmZmVyZW50IHR5cGVcbiAgICAgIC8vIGxpa2UgZm9yd2FyZFJlZiAoTWVtb0NvbXBvbmVudCkuIEJ1dCB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC5cbiAgICAgIC8vIFdyYXBwaW5nIGEgY29tcG9uZW50IGluIGZvcndhcmRSZWYgKG9yIFJlYWN0LmxhenksIGV0Yykgc2hvdWxkbid0XG4gICAgICAvLyBhZmZlY3Qgd2hldGhlciB0aGUgcHJvcHMgb2JqZWN0IGlzIHJldXNlZCBkdXJpbmcgYSBiYWlsb3V0LlxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBuZXh0UHJvcHMgPSBwcmV2UHJvcHM7XG5cbiAgICAgIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoZSBwZW5kaW5nIGxhbmVzIHdlcmUgY2xlYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGJlZ2luV29yay4gV2UncmVcbiAgICAgICAgLy8gYWJvdXQgdG8gYmFpbCBvdXQsIGJ1dCB0aGVyZSBtaWdodCBiZSBvdGhlciBsYW5lcyB0aGF0IHdlcmVuJ3RcbiAgICAgICAgLy8gaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyLiBVc3VhbGx5LCB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlXG4gICAgICAgIC8vIHJlbWFpbmluZyB1cGRhdGVzIGlzIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAgICAgLy8gY29tcG9uZW50IChpLmUuIHdoZW4gcHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlKS4gQnV0IHNpbmNlIHNpbmNlXG4gICAgICAgIC8vIHdlJ3JlIGJhaWxpbmcgb3V0IGVhcmx5ICp3aXRob3V0KiBldmFsdWF0aW5nIHRoZSBjb21wb25lbnQsIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gYWNjb3VudCBmb3IgaXQgaGVyZSwgdG9vLiBSZXNldCB0byB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgZmliZXIuXG4gICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBhcHBsaWVzIHRvIFNpbXBsZU1lbW9Db21wb25lbnQsIG5vdCBNZW1vQ29tcG9uZW50LFxuICAgICAgICAvLyBiZWNhdXNlIGEgTWVtb0NvbXBvbmVudCBmaWJlciBkb2VzIG5vdCBoYXZlIGhvb2tzIG9yIGFuIHVwZGF0ZSBxdWV1ZTtcbiAgICAgICAgLy8gcmF0aGVyLCBpdCB3cmFwcyBhcm91bmQgYW4gaW5uZXIgY29tcG9uZW50LCB3aGljaCBtYXkgb3IgbWF5IG5vdFxuICAgICAgICAvLyBjb250YWlucyBob29rcy5cbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGUgcmVzZXQgYXQgaW4gYmVnaW5Xb3JrIG91dCBvZiB0aGUgY29tbW9uIHBhdGggc28gdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJldlN0YXRlID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSA6IG51bGw7XG5cbiAgaWYgKG5leHRQcm9wcy5tb2RlID09PSAnaGlkZGVuJyB8fCBlbmFibGVMZWdhY3lIaWRkZW4gKSB7XG4gICAgLy8gUmVuZGVyaW5nIGEgaGlkZGVuIHRyZWUuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIGxlZ2FjeSBzeW5jIG1vZGUsIGRvbid0IGRlZmVyIHRoZSBzdWJ0cmVlLiBSZW5kZXIgaXQgbm93LlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaG93IE9mZnNjcmVlbiBzaG91bGQgd29yayB3aXRoIHRyYW5zaXRpb25zIGluIHRoZSBmdXR1cmVcbiAgICAgIHZhciBuZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXh0U3RhdGU7XG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICB2YXIgc3Bhd25lZENhY2hlUG9vbCA9IG51bGw7IC8vIFdlJ3JlIGhpZGRlbiwgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcgYXQgT2Zmc2NyZWVuLiBXZSB3aWxsIGJhaWwgb3V0XG4gICAgICAvLyBhbmQgcmVzdW1lIHRoaXMgdHJlZSBsYXRlci5cblxuICAgICAgdmFyIG5leHRCYXNlTGFuZXM7XG5cbiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZCYXNlTGFuZXMgPSBwcmV2U3RhdGUuYmFzZUxhbmVzO1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2QmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0QmFzZUxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgICB9IC8vIFNjaGVkdWxlIHRoaXMgZmliZXIgdG8gcmUtcmVuZGVyIGF0IG9mZnNjcmVlbiBwcmlvcml0eS4gVGhlbiBiYWlsb3V0LlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICAgICAgdmFyIF9uZXh0U3RhdGUgPSB7XG4gICAgICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBzcGF3bmVkQ2FjaGVQb29sLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBuZXh0QmFzZUxhbmVzKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIuIFRoZSBzdXJyb3VuZGluZyB2aXNpYmxlIGNvbnRlbnQgaGFzIGFscmVhZHlcbiAgICAgIC8vIGNvbW1pdHRlZC4gTm93IHdlIHJlc3VtZSByZW5kZXJpbmcgdGhlIGhpZGRlbiB0cmVlLlxuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGNhY2hlUG9vbDogbnVsbCxcbiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZW5kZXJpbmcgYSB2aXNpYmxlIHRyZWUuXG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBnb2luZyBmcm9tIGhpZGRlbiAtPiB2aXNpYmxlLlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMocHJldlN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZW4ndCBwcmV2aW91c2x5IGhpZGRlbiwgYW5kIHdlIHN0aWxsIGFyZW4ndCwgc28gdGhlcmUncyBub3RoaW5nXG4gICAgICAvLyBzcGVjaWFsIHRvIGRvLiBOZWVkIHRvIHB1c2ggdG8gdGhlIHN0YWNrIHJlZ2FyZGxlc3MsIHRob3VnaCwgdG8gYXZvaWRcbiAgICAgIC8vIGEgcHVzaC9wb3AgbWlzYWxpZ25tZW50LlxuICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIH1cblxuICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgX3N1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn0gLy8gTm90ZTogVGhlc2UgaGFwcGVuIHRvIGhhdmUgaWRlbnRpY2FsIGJlZ2luIHBoYXNlcywgZm9yIG5vdy4gV2Ugc2hvdWxkbid0IGhvbGRcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgd29ya0luUHJvZ3Jlc3MpLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG4gICAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICBzaG91bGRVcGRhdGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbiBhIHJlc3VtZSwgd2UnbGwgYWxyZWFkeSBoYXZlIGFuIGluc3RhbmNlIHdlIGNhbiByZXVzZS5cbiAgICBzaG91bGRVcGRhdGUgPSByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVXBkYXRlID0gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBuZXh0VW5pdE9mV29yayA9IGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICB2YXIgaW5zdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmIChzaG91bGRVcGRhdGUgJiYgaW5zdC5wcm9wcyAhPT0gbmV4dFByb3BzKSB7XG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgZXJyb3IoJ0l0IGxvb2tzIGxpa2UgJXMgaXMgcmVhc3NpZ25pbmcgaXRzIG93biBgdGhpcy5wcm9wc2Agd2hpbGUgcmVuZGVyaW5nLiAnICsgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ2EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0VW5pdE9mV29yaztcbn1cblxuZnVuY3Rpb24gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcykge1xuICAvLyBSZWZzIHNob3VsZCB1cGRhdGUgZXZlbiBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZVxuICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKTtcbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICB2YXIgX3JlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoaXMgcm9vdCByZWNlaXZlZCBhbiBlYXJseSB1cGRhdGUsIGJlZm9yZSBhbnl0aGluZyB3YXMgYWJsZSAnICsgJ2h5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgX3JlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgb3V0ZXJtb3N0IHNoZWxsIGhhcyBub3QgaHlkcmF0ZWQgeWV0LiBTdGFydCBoeWRyYXRpbmcuXG4gICAgICBlbnRlckh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgICAgdmFyIG5vZGUgPSBjaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgLy8gTWFyayBlYWNoIGNoaWxkIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpc1xuICAgICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXNcbiAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgICBub2RlLmZsYWdzID0gbm9kZS5mbGFncyAmIH5QbGFjZW1lbnQgfCBIeWRyYXRpbmc7XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJvb3QgaXMgbm90IGRlaHlkcmF0ZWQuIEVpdGhlciB0aGlzIGlzIGEgY2xpZW50LW9ubHkgcm9vdCwgb3IgaXRcbiAgICAvLyBhbHJlYWR5IGh5ZHJhdGVkLlxuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgIGlmIChuZXh0Q2hpbGRyZW4gPT09IHByZXZDaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcykge1xuICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGxhenlDb21wb25lbnQgPSBlbGVtZW50VHlwZTtcbiAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG4gIHZhciBDb21wb25lbnQgPSBpbml0KHBheWxvYWQpOyAvLyBTdG9yZSB0aGUgdW53cmFwcGVkIGNvbXBvbmVudCBpbiB0aGUgdHlwZS5cblxuICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50O1xuICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpO1xuICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBwcm9wcyk7XG4gIHZhciBjaGlsZDtcblxuICBzd2l0Y2ggKHJlc29sdmVkVGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRm9yd2FyZFJlZihudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZU1lbW9Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQudHlwZSwgcmVzb2x2ZWRQcm9wcyksIC8vIFRoZSBpbm5lciB0eXBlIGNhbiBoYXZlIGRlZmF1bHRzIHRvb1xuICAgICAgICByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86IFwiICsgQ29tcG9uZW50ICsgXCIuIFwiICsgKFwiTGF6eSBlbGVtZW50IHR5cGUgbXVzdCByZXNvbHZlIHRvIGEgY2xhc3Mgb3IgZnVuY3Rpb24uXCIgKyBoaW50KSk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciBoYXNJZDtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQucHJvdG90eXBlICYmIHR5cGVvZiBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBcIiArICdUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG5cbiAge1xuICAgIC8vIFN1cHBvcnQgZm9yIG1vZHVsZSBjb21wb25lbnRzIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlbW92ZWQgYmVoaW5kIGEgZmxhZy5cbiAgICAvLyBXaGV0aGVyIG9yIG5vdCBpdCB3b3VsZCBjcmFzaCBsYXRlciwgd2Ugd2FudCB0byBzaG93IGEgZ29vZCBtZXNzYWdlIGluIERFViBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSA9IHRydWU7XG4gICAgICB9XG4gICAgfSAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGNsYXNzIGluc3RhbmNlXG5cblxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaHJvdyBvdXQgYW55IGhvb2tzIHRoYXQgd2VyZSB1c2VkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsOyAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAgIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cbiAgICB2YXIgaGFzQ29udGV4dCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gdmFsdWUuc3RhdGUgIT09IG51bGwgJiYgdmFsdWUuc3RhdGUgIT09IHVuZGVmaW5lZCA/IHZhbHVlLnN0YXRlIDogbnVsbDtcbiAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgdmFsdWUpO1xuICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBmdW5jdGlvbiBjb21wb25lbnRcbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBGdW5jdGlvbkNvbXBvbmVudDtcblxuICAgIHtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignJXM6IFN1cHBvcnQgZm9yIGRlZmF1bHRQcm9wcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBmdW5jdGlvbiBjb21wb25lbnRzICcgKyAnaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gVXNlIEphdmFTY3JpcHQgZGVmYXVsdCBwYXJhbWV0ZXJzIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0RGVmYXVsdFByb3BzT25GdW5jdGlvbkNvbXBvbmVudFtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaHlkcmF0aW5nLCB0cnkgdG8gaHlkcmF0ZSB0aGlzIGJvdW5kYXJ5LlxuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuXG5cbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChkZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgZGVoeWRyYXRlZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuXG4gICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cGRhdGUuXG4gICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb25cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcblxuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50MztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUpO1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW5gIGlzIGBhbnlgIHR5cGVkLCBzbyB3ZSB1c2VcbiAgLy8gdGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNvbnN0cmFpbiBpdC5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpIHtcbiAgLy8gVGhlIHByb3BzIGFyZ3VtZW50IHRvIGBjcmVhdGVXb3JrSW5Qcm9ncmVzc2AgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZSB0aGlzXG4gIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgb2Zmc2NyZWVuUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgdmFyIGRlbGV0aW9ucyA9IHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50XTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBNYWtlIHN1cmUgd2UncmUgb24gdGhlIHNlY29uZCBwYXNzLCBpLmUuIHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50IHdhc1xuICAvLyBhbHJlYWR5IGNsb25lZC4gSW4gbGVnYWN5IG1vZGUsIHRoZSBvbmx5IGNhc2Ugd2hlcmUgdGhpcyBpc24ndCB0cnVlIGlzXG4gIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyXG4gIC8vIHBhc3MgZW50aXJlbHkgYW5kIGdvIHN0cmFpZ2h0IHRvIHJlbmRlcmluZyB0aGUgZmFsbGJhY2suIChJbiBDb25jdXJyZW50XG4gIC8vIE1vZGUsIFN1c3BlbnNlTGlzdCBjYW4gYWxzbyB0cmlnZ2VyIHRoaXMgc2NlbmFyaW8sIGJ1dCB0aGlzIGlzIGEgbGVnYWN5LVxuICAvLyBvbmx5IGNvZGVwYXRoLilcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCkge1xuICAgIHZhciBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50O1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGVcbiAgICAgIC8vIGZpbmFsIGFtb3VudHMuIFRoaXMgc2VlbXMgY291bnRlcmludHVpdGl2ZSwgc2luY2Ugd2UncmUgaW50ZW50aW9uYWxseVxuICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2VcbiAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS5cbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gLy8gVGhlIGZhbGxiYWNrIGZpYmVyIHdhcyBhZGRlZCBhcyBhIGRlbGV0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGFzcy5cbiAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudFxuICAgIC8vIHRvIGRlbGV0ZSBpdC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LCBwcmltYXJ5Q2hpbGRQcm9wcyk7IC8vIFNpbmNlIHdlJ3JlIHJldXNpbmcgYSBjdXJyZW50IHRyZWUsIHdlIG5lZWQgdG8gcmV1c2UgdGhlIGZsYWdzLCB0b28uXG4gICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlXG4gICAgLy8gdGhlIGN1cnJlbnQgdHJlZTsgc2VlIHByZXZpb3VzIGJyYW5jaC4pXG5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7XG4gIC8vIEZhbGxpbmcgYmFjayB0byBjbGllbnQgcmVuZGVyaW5nLiBCZWNhdXNlIHRoaXMgaGFzIHBlcmZvcm1hbmNlXG4gIC8vIGltcGxpY2F0aW9ucywgaXQncyBjb25zaWRlcmVkIGEgcmVjb3ZlcmFibGUgZXJyb3IsIGV2ZW4gdGhvdWdoIHRoZSB1c2VyXG4gIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLlxuICAvL1xuICAvLyBUaGUgZXJyb3IgaXMgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50IHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjYWxsZXIgcHJvdmlkZVxuICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0c1xuICAvLyBvdXQgaXMgbGVnYWN5IG1vZGU7IGV2ZXJ5IGNvbmN1cnJlbnQgcGF0aCBwcm92aWRlcyBhbiBlcnJvcikuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9yICE9PSBudWxsKSB7XG4gICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgfSAvLyBUaGlzIHdpbGwgYWRkIHRoZSBvbGQgZmliZXIgdG8gdGhlIGRlbGV0aW9uIGxpc3RcblxuXG4gIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLlxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBmaWJlck1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5KSBhbHJlYWR5IG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgIC8vIFdlIHdpbGwgaGF2ZSBkcm9wcGVkIHRoZSBlZmZlY3QgbGlzdCB3aGljaCBjb250YWlucyB0aGVcbiAgICAvLyBkZWxldGlvbi4gV2UgbmVlZCB0byByZWNvbmNpbGUgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGNoaWxkLlxuICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudERlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLlxuICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB0aGUgY29udGVudCBpbiBwbGFjZSBhbmQgdHJ5IHRvIGh5ZHJhdGUgaXQgbGF0ZXIuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ0Nhbm5vdCBoeWRyYXRlIFN1c3BlbnNlIGluIGxlZ2FjeSBtb2RlLiBTd2l0Y2ggZnJvbSAnICsgJ1JlYWN0RE9NLmh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyKSB0byAnICsgJ1JlYWN0RE9NQ2xpZW50Lmh5ZHJhdGVSb290KGNvbnRhaW5lciwgPEFwcCAvPiknICsgJy5yZW5kZXIoZWxlbWVudCkgb3IgcmVtb3ZlIHRoZSBTdXNwZW5zZSBjb21wb25lbnRzIGZyb20gJyArICd0aGUgc2VydmVyIHJlbmRlcmVkIGNvbXBvbmVudHMuJyk7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhTeW5jTGFuZSk7XG4gIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAvLyBUaGlzIGlzIGEgY2xpZW50LW9ubHkgYm91bmRhcnkuIFNpbmNlIHdlIHdvbid0IGdldCBhbnkgY29udGVudCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAvLyBmb3IgdGhpcywgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGF0IGF0IGEgaGlnaGVyIHByaW9yaXR5IGJhc2VkIG9uIHdoZW4gaXQgd291bGRcbiAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlXG4gICAgLy8gd3JvbmcgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIGl0IGFuZCB3aWxsIHByZXZlbnQgaHlkcmF0aW9uIG9mIHBhcmVudCBwYXRoLlxuICAgIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHdvcmsgbGVmdCBvbiBpdCB0byByZW5kZXIgaXQgaW4gYSBzZXBhcmF0ZSBjb21taXQuXG4gICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpc1xuICAgIC8vIGEgcGFyZW50IHRvIHRoaXMgYm91bmRhcnkgd2FzIGRpc3BsYXllZC4gSG93ZXZlciwgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmVcbiAgICAvLyBhIHByb3RvY29sIHRvIHRyYW5zZmVyIHRoYXQgdGltZSwgd2UnbGwganVzdCBlc3RpbWF0ZSBpdCBieSB1c2luZyB0aGUgY3VycmVudFxuICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhblxuICAgIC8vIHRoZXkgc2hvdWxkIGJlLlxuICAgIC8vIFNjaGVkdWxlIGEgbm9ybWFsIHByaSB1cGRhdGUgdG8gcmVuZGVyIHRoaXMgY29udGVudC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSdsbCBjb250aW51ZSBoeWRyYXRpbmcgdGhlIHJlc3QgYXQgb2Zmc2NyZWVuIHByaW9yaXR5IHNpbmNlIHdlJ2xsIGFscmVhZHlcbiAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKCFkaWRTdXNwZW5kKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyIHBhc3MuIEF0dGVtcHQgdG8gaHlkcmF0ZS5cbiAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgICAvLyBidXQgYWZ0ZXIgd2UndmUgYWxyZWFkeSBjb21taXR0ZWQgb25jZS5cbiAgICB3YXJuSWZIeWRyYXRpbmcoKTtcblxuICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudFxuICAgICAgLy8gcmVxdWlyZWQgXHUyMDE0IGV2ZXJ5IGNvbmN1cnJlbnQgbW9kZSBwYXRoIHRoYXQgY2F1c2VzIGh5ZHJhdGlvbiB0b1xuICAgICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBpcyBpbiBhIHBlcm1hbmVudCBmYWxsYmFjayBzdGF0ZS4gSW4gdGhpcyBjYXNlLCB3ZSdsbCBuZXZlclxuICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGVcbiAgICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgICAgdmFyIGRpZ2VzdCwgbWVzc2FnZSwgc3RhY2s7XG5cbiAgICAgIHtcbiAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTtcblxuICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0O1xuICAgICAgICBtZXNzYWdlID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLm1lc3NhZ2U7XG4gICAgICAgIHN0YWNrID0gX2dldFN1c3BlbnNlSW5zdGFuY2VGLnN0YWNrO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3I7XG5cbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgY291bGQgbm90IGZpbmlzaCB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LCBsaWtlbHkgJyArICdkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBkaWdlc3QsIHN0YWNrKTtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBhbnkgY29udGV4dCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB0cmVhdCBpcyBhcyBpZiB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG5cbiAgICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgaGFzQ29udGV4dENoYW5nZWQpIHtcbiAgICAgIC8vIFRoaXMgYm91bmRhcnkgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGZpcnN0IHJlbmRlci4gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3cgdW5hYmxlIHRvXG4gICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IE5vTGFuZSAmJiBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXNcbiAgICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyXG5cbiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUpO1xuICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIElmIHdlIGhhdmUgc2NoZWR1bGVkIGhpZ2hlciBwcmkgd29yayBhYm92ZSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYWJvcnQgdGhlIHJlbmRlclxuICAgICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmRcbiAgICAgIC8vIHNraXAgaHlkcmF0aW9uLlxuICAgICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuXG4gICAgICB2YXIgX2NhcHR1cmVkVmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhpcyBTdXNwZW5zZSBib3VuZGFyeSByZWNlaXZlZCBhbiB1cGRhdGUgYmVmb3JlIGl0IGZpbmlzaGVkICcgKyAnaHlkcmF0aW5nLiBUaGlzIGNhdXNlZCB0aGUgYm91bmRhcnkgdG8gc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcuICcgKyAnVGhlIHVzdWFsIHdheSB0byBmaXggdGhpcyBpcyB0byB3cmFwIHRoZSBvcmlnaW5hbCB1cGRhdGUgJyArICdpbiBzdGFydFRyYW5zaXRpb24uJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzXG4gICAgICAvLyBjb250ZW50LiBXZSB0cmVhdCBpdCBhcyBpZiB0aGlzIGNvbXBvbmVudCBzdXNwZW5kZWQgaXRzZWxmLiBJdCBtaWdodCBzZWVtIGFzIGlmXG4gICAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZFxuICAgICAgLy8gb24gbWlzc2luZyBkYXRhIGFueXdheS4gQWRkaXRpb25hbGx5LCB0aGUgc2VydmVyIG1pZ2h0IGJlIGFibGUgdG8gcmVuZGVyIG1vcmVcbiAgICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9yc1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIHVwZGF0ZSB0aGlzIGJvdW5kYXJ5IHRvIHRoZSBwZXJtYW5lbnQgRmFsbGJhY2sgc3RhdGUgaW5zdGVhZC5cbiAgICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LlxuXG4gICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgICByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShzdXNwZW5zZUluc3RhbmNlLCByZXRyeSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICAgIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZS50cmVlQ29udGV4dCk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkXG4gICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy5cbiAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NXG4gICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy5cblxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MuIFdlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGh5ZHJhdGVkLCBidXRcbiAgICAvLyBzb21ldGhpbmcgZWl0aGVyIHN1c3BlbmRlZCBvciBlcnJvcmVkLlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgaHlkcmF0aW9uLiBUcnkgYWdhaW4gd2l0aG91dCBoeWRyYXRpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZTIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKG5ldyBFcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyB0aGlzIFN1c3BlbnNlIGJvdW5kYXJ5LiAnICsgJ1N3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuJykpO1xuXG4gICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBfY2FwdHVyZWRWYWx1ZTIpO1xuICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZCBhbmQgd2Ugc2hvdWxkIHN0aWxsIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIExlYXZlIHRoZSBleGlzdGluZyBjaGlsZCBpbiBwbGFjZS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAvLyBidXQgdGhlIG5vcm1hbCBzdXNwZW5zZSBwYXNzIGRvZXNuJ3QuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3VzcGVuZGVkIGJ1dCB3ZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGluIGRlaHlkcmF0ZWQgbW9kZS5cbiAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7XG4gIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChmaWJlci5yZXR1cm4sIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGZpcnN0Q2hpbGQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uXG4gIC8vIElmIHRoZXkgd2VyZSBwcmV2aW91c2x5IGZvcmNlZCBpbnRvIGZhbGxiYWNrcywgdGhleSBtYXkgbm93IGJlIGFibGVcbiAgLy8gdG8gdW5ibG9jay5cbiAgdmFyIG5vZGUgPSBmaXJzdENoaWxkO1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50KSB7XG4gICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXNcbiAgICAgIC8vIHRvIHNjaGVkdWxlIHdvcmsgb24uIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG9uIHRoZVxuICAgICAgLy8gbGlzdCBpdHNlbGYuXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZVxuICAgICAgLy8gdGhlIGxpc3Qgd2lsbCBwcm9wYWdhdGUgdGhlIGNoYW5nZSB3aGVuIGl0IHJlcmVuZGVycy5cbiAgICAgIHNjaGVkdWxlU3VzcGVuc2VXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMYXN0Q29udGVudFJvdyhmaXJzdENoaWxkKSB7XG4gIC8vIFRoaXMgaXMgZ29pbmcgdG8gZmluZCB0aGUgbGFzdCByb3cgYW1vbmcgdGhlc2UgY2hpbGRyZW4gdGhhdCBpcyBhbHJlYWR5XG4gIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yXG4gIC8vIG5ldy4gSWYgYSByb3cgaGFzIG11bHRpcGxlIFN1c3BlbnNlIGJvdW5kYXJpZXMsIGFueSBvZiB0aGVtIGJlaW5nIGluIHRoZVxuICAvLyBmYWxsYmFjayBzdGF0ZSwgY291bnRzIGFzIHRoZSB3aG9sZSByb3cgYmVpbmcgaW4gYSBmYWxsYmFjayBzdGF0ZS5cbiAgLy8gTm90ZSB0aGF0IHRoZSBcInJvd3NcIiB3aWxsIGJlIHdvcmtJblByb2dyZXNzLCBidXQgYW55IG5lc3RlZCBjaGlsZHJlblxuICAvLyB3aWxsIHN0aWxsIGJlIGN1cnJlbnQgc2luY2Ugd2UgaGF2ZW4ndCByZW5kZXJlZCB0aGVtIHlldC4gVGhlIG1vdW50ZWRcbiAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci5cbiAgdmFyIHJvdyA9IGZpcnN0Q2hpbGQ7XG4gIHZhciBsYXN0Q29udGVudFJvdyA9IG51bGw7XG5cbiAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLlxuXG4gICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICBsYXN0Q29udGVudFJvdyA9IHJvdztcbiAgICB9XG5cbiAgICByb3cgPSByb3cuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0Q29udGVudFJvdztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHtcbiAgICAgIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgcmV2ZWFsT3JkZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdVc2UgbG93ZXJjYXNlIFwiJXNcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOlxuICAgICAgICAgIGNhc2UgJ2JhY2t3YXJkJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdSZWFjdCB1c2VzIHRoZSAtcyBzdWZmaXggaW4gdGhlIHNwZWxsaW5nLiBVc2UgXCIlc3NcIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsIHJldmVhbE9yZGVyKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkge1xuICAgICAgaWYgKHRhaWxNb2RlICE9PSAnY29sbGFwc2VkJyAmJiB0YWlsTW9kZSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiBcImNvbGxhcHNlZFwiIG9yIFwiaGlkZGVuXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignPFN1c3BlbnNlTGlzdCB0YWlsPVwiJXNcIiAvPiBpcyBvbmx5IHZhbGlkIGlmIHJldmVhbE9yZGVyIGlzICcgKyAnXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCIuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHNwZWNpZnkgcmV2ZWFsT3JkZXI9XCJmb3J3YXJkc1wiPycsIHRhaWxNb2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gIHtcbiAgICB2YXIgaXNBbkFycmF5ID0gaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7XG4gICAgICB2YXIgdHlwZSA9IGlzQW5BcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyBvYmplY3QgZnJvbSBwcmV2aW91cyByZW5kZXJzLlxuICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSAwO1xuICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdztcbiAgICByZW5kZXJTdGF0ZS50YWlsID0gdGFpbDtcbiAgICByZW5kZXJTdGF0ZS50YWlsTW9kZSA9IHRhaWxNb2RlO1xuICB9XG59IC8vIFRoaXMgY2FuIGVuZCB1cCByZW5kZXJpbmcgdGhpcyBjb21wb25lbnQgbXVsdGlwbGUgcGFzc2VzLlxuLy8gVGhlIGZpcnN0IHBhc3Mgc3BsaXRzIHRoZSBjaGlsZHJlbiBmaWJlcnMgaW50byB0d28gc2V0cy4gQSBoZWFkIGFuZCB0YWlsLlxuLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlclxuLy8gcGFzcyB0aHJvdWdoIGJlZ2luV29yayB0byByZXJlbmRlciBhbGwgY2hpbGRyZW4gKGluY2x1ZGluZyB0aGUgdGFpbCkgd2l0aFxuLy8gdGhlIGZvcmNlIHN1c3BlbmQgY29udGV4dC4gSWYgdGhlIGZpcnN0IHJlbmRlciBkaWRuJ3QgaGF2ZSBhbnl0aGluZyBpblxuLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuXG4vLyBUaGF0IGhhcHBlbnMgaW4gdGhlIGNvbXBsZXRlV29yayBwaGFzZSB3aXRob3V0IGdvaW5nIGJhY2sgdG8gYmVnaW5Xb3JrLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJldmVhbE9yZGVyID0gbmV4dFByb3BzLnJldmVhbE9yZGVyO1xuICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDtcbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKG5ld0NoaWxkcmVuLCByZXZlYWxPcmRlcik7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvdWxkRm9yY2VGYWxsYmFjayA9IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG5cbiAgaWYgKHNob3VsZEZvcmNlRmFsbGJhY2spIHtcbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHtcbiAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29ya1xuICAgICAgLy8gb24gYW55IG5lc3RlZCBib3VuZGFyaWVzIHRvIGxldCB0aGVtIGtub3cgdG8gdHJ5IHRvIHJlbmRlclxuICAgICAgLy8gYWdhaW4uIFRoaXMgaXMgdGhlIHNhbWUgYXMgY29udGV4dCB1cGRhdGluZy5cbiAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTtcbiAgICB9XG5cbiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICB9XG5cbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTtcblxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3RcbiAgICAvLyB1c2UgbWFrZSBpdCBhIG5vb3AgYnkgdHJlYXRpbmcgaXQgYXMgdGhlIGRlZmF1bHQgcmV2ZWFsT3JkZXIuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChyZXZlYWxPcmRlcikge1xuICAgICAgY2FzZSAnZm9yd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhc3RDb250ZW50Um93ID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICB2YXIgdGFpbDtcblxuICAgICAgICAgIGlmIChsYXN0Q29udGVudFJvdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGZhc3QgcGF0aCBieSBqdXN0IHJlbmRlcmluZyB0aGUgdGFpbCBub3cuXG4gICAgICAgICAgICB0YWlsID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIHRhaWwgcm93cyBhZnRlciB0aGUgY29udGVudCByb3cuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLlxuICAgICAgICAgICAgdGFpbCA9IGxhc3RDb250ZW50Um93LnNpYmxpbmc7XG4gICAgICAgICAgICBsYXN0Q29udGVudFJvdy5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIHRhaWwsIGxhc3RDb250ZW50Um93LCB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYmFja3dhcmRzJzpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGZpbmQgdGhlIGZpcnN0IHJvdyB0aGF0IGhhcyBleGlzdGluZyBjb250ZW50LlxuICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nXG4gICAgICAgICAgLy8gd2UgcGFzcyBpbiB0aGUgbWVhbnRpbWUuIFRoYXQncyBnb2luZyB0byBiZSBvdXIgdGFpbCBpbiByZXZlcnNlXG4gICAgICAgICAgLy8gb3JkZXIuXG4gICAgICAgICAgdmFyIF90YWlsID0gbnVsbDtcbiAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1haW4gY29udGVudC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByb3c7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmV4dFJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgcm93LnNpYmxpbmcgPSBfdGFpbDtcbiAgICAgICAgICAgIF90YWlsID0gcm93O1xuICAgICAgICAgICAgcm93ID0gbmV4dFJvdztcbiAgICAgICAgICB9IC8vIFRPRE86IElmIHdvcmtJblByb2dyZXNzLmNoaWxkIGlzIG51bGwsIHdlIGNhbiBjb250aW51ZSBvbiB0aGUgdGFpbCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCB0cnVlLCAvLyBpc0JhY2t3YXJkc1xuICAgICAgICAgIF90YWlsLCBudWxsLCAvLyBsYXN0XG4gICAgICAgICAgdGFpbE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3RvZ2V0aGVyJzpcbiAgICAgICAge1xuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgbnVsbCwgLy8gdGFpbFxuICAgICAgICAgIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgZGVmYXVsdCByZXZlYWwgb3JkZXIgaXMgdGhlIHNhbWUgYXMgbm90IGhhdmluZ1xuICAgICAgICAgIC8vIGEgYm91bmRhcnkuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFBvcnRhbHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB3ZSBkb24ndCBhcHBlbmQgdGhlIGNoaWxkcmVuIGR1cmluZyBtb3VudFxuICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbFxuICAgIC8vIGZsb3cgZG9lc24ndCBkbyBkdXJpbmcgbW91bnQuIFRoaXMgZG9lc24ndCBoYXBwZW4gYXQgdGhlIHJvb3QgYmVjYXVzZVxuICAgIC8vIHRoZSByb290IGFsd2F5cyBzdGFydHMgd2l0aCBhIFwiY3VycmVudFwiIHdpdGggYSBudWxsIGNoaWxkLlxuICAgIC8vIFRPRE86IENvbnNpZGVyIHVuaWZ5aW5nIHRoaXMgd2l0aCBob3cgdGhlIHJvb3Qgd29ya3MuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgcHJvdmlkZXJUeXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlclR5cGUuX2NvbnRleHQ7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG5cbiAge1xuICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7XG4gICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignVGhlIGB2YWx1ZWAgcHJvcCBpcyByZXF1aXJlZCBmb3IgdGhlIGA8Q29udGV4dC5Qcm92aWRlcj5gLiBEaWQgeW91IG1pc3NwZWxsIGl0IG9yIGZvcmdldCB0byBwYXNzIGl0PycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcm92aWRlclByb3BUeXBlcyA9IHdvcmtJblByb2dyZXNzLnR5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKHByb3ZpZGVyUHJvcFR5cGVzKSB7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm92aWRlclByb3BUeXBlcywgbmV3UHJvcHMsICdwcm9wJywgJ0NvbnRleHQuUHJvdmlkZXInKTtcbiAgICB9XG4gIH1cblxuICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcblxuICB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBudWxsKSB7XG4gICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTtcblxuICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgLy8gTm8gY2hhbmdlLiBCYWlsb3V0IGVhcmx5IGlmIGNoaWxkcmVuIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgaWYgKG9sZFByb3BzLmNoaWxkcmVuID09PSBuZXdQcm9wcy5jaGlsZHJlbiAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSkge1xuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgICAvLyB0aGVtIHRvIHVwZGF0ZS5cbiAgICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgbmV3Q2hpbGRyZW47XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5ld0NoaWxkcmVuID0gcmVuZGVyKG5ld1ZhbHVlKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IHR5cGUgPyBfdW5yZXNvbHZlZFByb3BzMiA6IHJlc29sdmVEZWZhdWx0UHJvcHModHlwZSwgX3VucmVzb2x2ZWRQcm9wczIpO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGb3J3YXJkUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBfcmVzb2x2ZWRQcm9wczIsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIHJldHVybiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBSZXNvbHZlIG91dGVyIHByb3BzIGZpcnN0LCB0aGVuIHJlc29sdmUgaW5uZXIgcHJvcHMuXG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLCBfdW5yZXNvbHZlZFByb3BzMyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlcztcblxuICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCBfcmVzb2x2ZWRQcm9wczMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF9yZXNvbHZlZFByb3BzMyA9IHJlc29sdmVEZWZhdWx0UHJvcHMoX3R5cGUyLnR5cGUsIF9yZXNvbHZlZFByb3BzMyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzNCA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudDIsIF91bnJlc29sdmVkUHJvcHM0KTtcblxuICAgICAgICByZXR1cm4gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQyLCBfcmVzb2x2ZWRQcm9wczQsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBcIiArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gIH1cbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHtcbiAgdmFyIGRpZEJhaWxvdXQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZCA9PT0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgdmFyIG5ld0NoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFncztcblxuICBpZiAoIWRpZEJhaWxvdXQpIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5mbGFnczsgLy8gV2hlbiBhIGZpYmVyIGlzIGNsb25lZCwgaXRzIGFjdHVhbER1cmF0aW9uIGlzIHJlc2V0IHRvIDAuIFRoaXMgdmFsdWUgd2lsbFxuICAgICAgICAvLyBvbmx5IGJlIHVwZGF0ZWQgaWYgd29yayBpcyBkb25lIG9uIHRoZSBmaWJlciAoaS5lLiBpdCBkb2Vzbid0IGJhaWxvdXQpLlxuICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgICAgIC8vIHRoZSBmaWJlciBoYXMgbm90IGJlZW4gY2xvbmVkIHRob3VnaCwgKG1lYW5pbmcgbm8gd29yayB3YXMgZG9uZSksIHRoZW5cbiAgICAgICAgLy8gdGhpcyB2YWx1ZSB3aWxsIHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdvcmtpbmcgb24gYSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgICAgIC8vIGNsb25lZCBieSBjb21wYXJpbmcgdGhlIGNoaWxkIHBvaW50ZXIuXG5cbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSB0cmVlQmFzZUR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZC5sYW5lcywgX2NoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQuZmxhZ3M7IC8vIFVwZGF0ZSB0aGUgcmV0dXJuIHBvaW50ZXIgc28gdGhlIHRyZWUgaXMgY29uc2lzdGVudC4gVGhpcyBpcyBhIGNvZGVcbiAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoXG4gICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLlxuXG4gICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG4gICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIC8vIEluIHByb2ZpbGluZyBtb2RlLCByZXNldENoaWxkRXhwaXJhdGlvblRpbWUgaXMgYWxzbyB1c2VkIHRvIHJlc2V0XG4gICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuXG4gICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB2YXIgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQyICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMi5sYW5lcywgX2NoaWxkMi5jaGlsZExhbmVzKSk7IC8vIFwiU3RhdGljXCIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgYnViYmxlIHRob3NlIHVwIGV2ZW4gZHVyaW5nIGEgYmFpbG91dC4gQWxsIHRoZSBvdGhlclxuICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlbS5cblxuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5mbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQzLmxhbmVzLCBfY2hpbGQzLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkMy5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrO1xuICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfVxuXG4gIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gIHJldHVybiBkaWRCYWlsb3V0O1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpIHtcbiAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChuZXh0U3RhdGUgIT09IG51bGwgJiYgbmV4dFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzXG4gICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIGFuZCBhbHNvIGFmdGVyIHdlJ3ZlIHJlZW50ZXJlZCBpdCBmb3IgZnVydGhlciBoeWRyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uXG4gICAgICAvLyBzdGF0ZSBzaW5jZSB3ZSdyZSBub3cgZXhpdGluZyBvdXQgb2YgaXQuIHBvcEh5ZHJhdGlvblN0YXRlIGRvZXNuJ3QgZG8gdGhhdCBmb3IgdXMuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgfSAvLyBJZiBub3RoaW5nIHN1c3BlbmRlZCwgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gbWFyayB0aGlzIGJvdW5kYXJ5XG4gICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC5cbiAgICAgIC8vIEl0J3MgYWxzbyBhIHNpZ25hbCB0byByZXBsYXkgZXZlbnRzIGFuZCB0aGUgc3VzcGVuc2UgY2FsbGJhY2suXG4gICAgICAvLyBJZiBzb21ldGhpbmcgc3VzcGVuZGVkLCBzY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIHJldHJ5IGxpc3RlbmVycy5cbiAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy5cblxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAge1xuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIHZhciBfaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKF9pc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoX3ByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGlzIHRyZWUuIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsXG4gICAgLy8gdGhlcmUgbWF5IGhhdmUgYmVlbiByZWNvdmVyYWJsZSBlcnJvcnMgZHVyaW5nIGZpcnN0IGh5ZHJhdGlvblxuICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTsgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCBTdXNwZW5zZSBwYXRoXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICBjYXNlIE1vZGU6XG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcblxuICAgICAgICBpZiAoZmliZXJSb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgZmliZXJSb290LmNvbnRleHQgPSBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQ7XG4gICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQuY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgcG9wIHNvIHRoYXQgd2UgY2FuIGRlbGV0ZSBhbnkgcmVtYWluaW5nIGNoaWxkcmVuXG4gICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLlxuICAgICAgICAgIHZhciB3YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmICh3YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHRoZW4gd2UnbGwgbmVlZCB0byBzY2hlZHVsZSBhbiB1cGRhdGUgZm9yXG4gICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC5cbiAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmICggLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsaWVudCByb290XG4gICAgICAgICAgICAgICFwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkIHx8IC8vIENoZWNrIGlmIHdlIHJldmVydGVkIHRvIGNsaWVudCByZW5kZXJpbmcgKGUuZy4gZHVlIHRvIGFuIGVycm9yKVxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gY2xlYXIgdGhpcyBjb250YWluZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29tbWl0LiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYVxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3JcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbCBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyByZW5kZXIgd2FzIG51bGwgKHNvIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeVxuICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS5cbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsgLy8gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlciwgdGhlcmUgbWF5IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uIGF0dGVtcHQuIElmIHNvLCBhZGRcbiAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuXG5cbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbmV3UHJvcHMpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSAnICsgJ2NhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogTW92ZSBjcmVhdGVJbnN0YW5jZSB0byBiZWdpbldvcmsgYW5kIGtlZXAgaXQgb24gYSBjb250ZXh0XG4gICAgICAgICAgLy8gXCJzdGFja1wiIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29ya1xuICAgICAgICAgIC8vIG9yIGNvbXBsZXRlV29yayBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSB3YW50IHRvIGFkZCB0aGVtIHRvcC0+ZG93biBvclxuICAgICAgICAgIC8vIGJvdHRvbS0+dXAuIFRvcC0+ZG93biBpcyBmYXN0ZXIgaW4gSUUxMS5cblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZVxuICAgICAgICAgICAgLy8gdG8gY29uc29saWRhdGUuXG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpKSB7XG4gICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZVxuICAgICAgICAgICAgICAvLyBjb21taXQtcGhhc2Ugd2UgbWFyayB0aGlzIGFzIHN1Y2guXG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSh0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBDZXJ0YWluIHJlbmRlcmVycyByZXF1aXJlIGNvbW1pdC10aW1lIGVmZmVjdHMgZm9yIGluaXRpYWwgbW91bnQuXG4gICAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIHN1cHBvcnRzIGF1dG8tZm9jdXMgZm9yIGNlcnRhaW4gZWxlbWVudHMpLlxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuXG5cbiAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSByZWYgb24gYSBob3N0IG5vZGUgd2UgbmVlZCB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgICAgICBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXNcbiAgICAgICAgLy8gdG8gaXRzIG93biBmaWJlciB0eXBlIHNvIHRoYXQgd2UgY2FuIGFkZCBvdGhlciBraW5kcyBvZiBoeWRyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcyB0aGF0IGFyZW4ndCBhc3NvY2lhdGVkIHdpdGggYSBTdXNwZW5zZSB0cmVlLiBJbiBhbnRpY2lwYXRpb25cbiAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW5cbiAgICAgICAgLy8gdGhpcyBicmFuY2guXG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGggPSBjb21wbGV0ZURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0U3RhdGUpO1xuXG4gICAgICAgICAgaWYgKCFmYWxsdGhyb3VnaFRvTm9ybWFsU3VzcGVuc2VQYXRoKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZS4gVGhlcmUgd2VyZSByZW1haW5pbmcgdW5oeWRyYXRlZCBub2Rlcy4gV2UgdHJlYXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBhcyBhIG1pc21hdGNoLiBSZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy5cbiAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRGlkIG5vdCBmaW5pc2ggaHlkcmF0aW5nLCBlaXRoZXIgYmVjYXVzZSB0aGlzIGlzIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguXG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQuIFJlLXJlbmRlciB3aXRoIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzOyAvLyBEbyBub3QgcmVzZXQgdGhlIGVmZmVjdCBsaXN0LlxuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5leHREaWRUaW1lb3V0ID0gbmV4dFN0YXRlICE9PSBudWxsO1xuICAgICAgICB2YXIgcHJldkRpZFRpbWVvdXQgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9uc1xuXG5cbiAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0ICE9PSBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gZmFsbGJhY2sgLT4gcHJpbWFyeSwgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBzY2hlZHVsZXMgdGhpcyBlZmZlY3RcbiAgICAgICAgICAvLyBhcyBwYXJ0IG9mIGl0cyBub3JtYWwgY29tcGxldGUgcGhhc2UuIEJ1dCB3aGVuIHdlIHN3aXRjaCBmcm9tXG4gICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZS4gU28gd2UgbmVlZCB0byBzY2hlZHVsZSBpdHMgZWZmZWN0IGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWVcbiAgICAgICAgICAvLyBsb2dpYyBhcHBsaWVzOiB3aGVuIHJlLWNvbm5lY3RpbmcsIHRoZSBPZmZzY3JlZW4gZmliZXIncyBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlIHdpbGwgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGVmZmVjdC4gSXQncyBvbmx5IHdoZW4gdGhlIGZhbGxiYWNrXG4gICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLlxuXG5cbiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICBfb2Zmc2NyZWVuRmliZXIyLmZsYWdzIHw9IFZpc2liaWxpdHk7IC8vIFRPRE86IFRoaXMgd2lsbCBzdGlsbCBzdXNwZW5kIGEgc3luY2hyb25vdXMgdHJlZSBpZiBhbnl0aGluZ1xuICAgICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLlxuXG4gICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYmFjayB0byB0aHJvd0V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgdG9vIGxhdGVcbiAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBtYXJrZXIsIGFuZCB0aGlzIGlzIHRvbyBsYXRlLlxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBpbW1lZGlhdGVseSByZXN0YXJ0IGZyb20gd2l0aGluIHRocm93RXhjZXB0aW9uLlxuICAgICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSB8fCAhZW5hYmxlU3VzcGVuc2VBdm9pZFRoaXNGYWxsYmFjayk7XG5cbiAgICAgICAgICAgICAgaWYgKGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCB8fCBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGJvdW5kYXJ5IGlzIG9rLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaGlkZSBjb250ZW50IHNvIHdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgZm9yIGxvbmdlciBpZiBwb3NzaWJsZS5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2FrZWFibGVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggYSByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS5cbiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAvLyBEb24ndCBjb3VudCB0aW1lIHNwZW50IGluIGEgdGltZWQgb3V0IFN1c3BlbnNlIHN1YnRyZWUgYXMgcGFydCBvZiB0aGUgYmFzZSBkdXJhdGlvbi5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIC8vIFBvcCBwcm92aWRlciBmaWJlclxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBTYW1lIGFzIGNsYXNzIGNvbXBvbmVudCBjYXNlLiBJIHB1dCBpdCBkb3duIGhlcmUgc28gdGhhdCB0aGUgdGFncyBhcmVcbiAgICAgICAgLy8gc2VxdWVudGlhbCB0byBlbnN1cmUgdGhpcyBzd2l0Y2ggaXMgY29tcGlsZWQgdG8gYSBqdW1wIHRhYmxlLlxuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIGluIHRoZSBkZWZhdWx0LCBcImluZGVwZW5kZW50XCIgbW9kZS5cbiAgICAgICAgICAvLyBXZSBkb24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIG1vZGUuXG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlkU3VzcGVuZEFscmVhZHkgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcbiAgICAgICAgdmFyIHJlbmRlcmVkVGFpbCA9IHJlbmRlclN0YXRlLnJlbmRlcmluZztcblxuICAgICAgICBpZiAocmVuZGVyZWRUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgYW55dGhpbmcgaXMgc3RpbGxcbiAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LlxuICAgICAgICAgICAgLy8gSWYgbmV3IGNvbnRlbnQgdW5zdXNwZW5kZWQsIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgY29udGVudCB0aGF0XG4gICAgICAgICAgICAvLyBkaWRuJ3QuIFRoZW4gd2UgbmVlZCB0byBkbyBhIHNlY29uZCBwYXNzIHRoYXQgZm9yY2VzIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuXG4gICAgICAgICAgICAvLyBXZSBtaWdodCBiZSBzdXNwZW5kZWQgaWYgc29tZXRoaW5nIGluIHRoaXMgcmVuZGVyIHBhc3Mgc3VzcGVuZGVkLCBvclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGluIHRoZSBwcmV2aW91cyBjb21taXR0ZWQgcGFzcyBzdXNwZW5kZWQuIE90aGVyd2lzZSxcbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0b1xuICAgICAgICAgICAgLy8gZmluZEZpcnN0U3VzcGVuZGVkLlxuICAgICAgICAgICAgdmFyIGNhbm5vdEJlU3VzcGVuZGVkID0gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkgJiYgKGN1cnJlbnQgPT09IG51bGwgfHwgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyk7XG5cbiAgICAgICAgICAgIGlmICghY2Fubm90QmVTdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJvdyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIElmIHRoaXMgaXMgYSBuZXdseSBzdXNwZW5kZWQgdHJlZSwgaXQgbWlnaHQgbm90IGdldCBjb21taXR0ZWQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIHNlY29uZCBwYXNzLiBJbiB0aGF0IGNhc2Ugbm90aGluZyB3aWxsIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBuZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYmVmb3JlIGRvaW5nIHRoZSBzZWNvbmQgcGFzcyBzaW5jZSB0aGF0J3Mgbm93IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpOyAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByb3cgPSByb3cuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCAmJiBub3coKSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGFscmVhZHkgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYnV0IHdlIHN0aWxsIGhhdmUgcm93c1xuICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXJcbiAgICAgICAgICAgICAgLy8gdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBfbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nXG4gICAgICAgICAgICAvLyB0aW1lIHdlIGhhdmUgdG8gcmVuZGVyLiBTbyByZW5kZXJpbmcgb25lIG1vcmUgcm93IHdvdWxkIGxpa2VseVxuICAgICAgICAgICAgLy8gZXhjZWVkIGl0LlxuICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm93IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGFuZCB3ZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlclxuICAgICAgICAgICAgICAvLyBhdHRlbXB0cyB0byByZW5kZXIgdGhlIG1haW4gY29udGVudCBhbmQgb25seSByZW5kZXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIF9uZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2SXNIaWRkZW4gPSBfcHJldlN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyBcdTIwMTQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcG9wQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKChfZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSAhPT0gTm9GbGFncyAmJiAoX2ZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHJlbmRlciB0aGF0IHdhc24ndCBjYXB0dXJlZCBieSBhIHN1c3BlbnNlXG4gICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LlxuXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRPRE86IHBvcEh5ZHJhdGlvblN0YXRlXG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaHJldyBpbiBuZXdseSBtb3VudGVkIGRlaHlkcmF0ZWQgY29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiAnICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDYWNoZUNvbXBvbmVudDpcblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yaywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nXG4gIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLlxuICAvLyBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgYSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIHdvcmsgbG9vcCBvbmx5XG4gIC8vIGZvciBoeWRyYXRpb24uXG4gIHBvcFRyZWVDb250ZXh0KGludGVycnVwdGVkV29yayk7XG5cbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBjb250ZXh0ID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG52YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBudWxsO1xuXG57XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpO1xufSAvLyBVc2VkIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgT2Zmc2NyZWVuIGNvbXBvbmVudCBzdGFjay5cbi8vIEFsbG93cyB1cyB0byBhdm9pZCB0cmF2ZXJzaW5nIHRoZSByZXR1cm4gcGF0aCB0byBmaW5kIHRoZSBuZWFyZXN0IE9mZnNjcmVlbiBhbmNlc3Rvci5cbi8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuXG5cblxudmFyIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGZhbHNlO1xudmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTtcbnZhciBQb3NzaWJseVdlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtTZXQgOiBTZXQ7XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7IC8vIFVzZWQgZm9yIFByb2ZpbGluZyBidWlsZHMgdG8gdHJhY2sgdXBkYXRlcnMuXG5cbnZhciBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xudmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbmZ1bmN0aW9uIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvcikge1xuICAvLyBXcmFwcGluZyBlYWNoIHNtYWxsIHBhcnQgb2YgdGhlIGNvbW1pdCBwaGFzZSBpbnRvIGEgZ3VhcmRlZFxuICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLlxuICAvLyBCdXQgd2UgcmVseSBvbiBpdCB0byBzdXJmYWNlIGVycm9ycyB0byBERVYgdG9vbHMgbGlrZSBvdmVybGF5c1xuICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMTcxMikuXG4gIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC5cbiAge1xuICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgICBjbGVhckNhdWdodEVycm9yKCk7XG4gIH1cbn1cblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgIHRyeSB7XG4gICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgfVxufTsgLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0LCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIoY3VycmVudCwgaW5zdGFuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpIHtcbiAgdHJ5IHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB0cnkge1xuICAgIGNvbW1pdEF0dGFjaFJlZihjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyAmJiBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIHJldFZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsRGVzdHJveShjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KSB7XG4gIHRyeSB7XG4gICAgZGVzdHJveSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG52YXIgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcbnZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyXG5cbiAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7XG4gIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xuICByZXR1cm4gc2hvdWxkRmlyZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuXG5cbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmICgoZmxhZ3MgJiBTbmFwc2hvdCkgIT09IE5vRmxhZ3MpIHtcbiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBkaWRXYXJuU2V0ID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ID09PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5TZXQuaGFzKGZpbmlzaGVkV29yay50eXBlKSkge1xuICAgICAgICAgICAgICAgIGRpZFdhcm5TZXQuYWRkKGZpbmlzaGVkV29yay50eXBlKTtcblxuICAgICAgICAgICAgICAgIGVycm9yKCclcy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpOiBBIHNuYXBzaG90IHZhbHVlIChvciBudWxsKSAnICsgJ211c3QgYmUgcmV0dXJuZWQuIFlvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGZvciB0aGVzZSBjb21wb25lbnQgdHlwZXNcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChmbGFncywgZmluaXNoZWRXb3JrLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgLy8gVW5tb3VudFxuICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuICAgICAgICBlZmZlY3QuZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIE1vdW50XG5cblxuICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGRlc3Ryb3kgPSBlZmZlY3QuZGVzdHJveTtcblxuICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGRlc3Ryb3kgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoZWZmZWN0LnRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUVmZmVjdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDtcblxuICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuICcgKyAndXAsIHJldHVybiB1bmRlZmluZWQgKG9yIG5vdGhpbmcpLic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0cm95LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXFxuXFxuSXQgbG9va3MgbGlrZSB5b3Ugd3JvdGUgJyArIGhvb2tOYW1lICsgJyhhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArIGhvb2tOYW1lICsgJygoKSA9PiB7XFxuJyArICcgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSgpIHtcXG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcXG4nICsgJyAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4nICsgJyAgICAvLyAuLi5cXG4nICsgJyAgfVxcbicgKyAnICBmZXRjaERhdGEoKTtcXG4nICsgXCJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5cIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnIFlvdSByZXR1cm5lZDogJyArIGRlc3Ryb3k7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICB7XG4gICAgLy8gT25seSBQcm9maWxlcnMgd2l0aCB3b3JrIGluIHRoZWlyIHN1YnRyZWUgd2lsbCBoYXZlIGFuIFVwZGF0ZSBlZmZlY3Qgc2NoZWR1bGVkLlxuICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykge1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICAgICAgICAgIG9uUG9zdENvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblBvc3RDb21taXQ7IC8vIFRoaXMgdmFsdWUgd2lsbCBzdGlsbCByZWZsZWN0IHRoZSBwcmV2aW91cyBjb21taXQgcGhhc2UuXG4gICAgICAgICAgICAvLyBJdCBkb2VzIG5vdCBnZXQgcmVzZXQgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Qb3N0Q29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIG9uUG9zdENvbW1pdChpZCwgcGhhc2UsIHBhc3NpdmVFZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLlxuICAgICAgICAgICAgLy8gQWZ0ZXIgd2UgcHJvY2VzcyB0aGF0IFByb2ZpbGVyLCB3ZSdsbCBidWJibGUgZnVydGhlciB1cC5cblxuXG4gICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gcGFzc2l2ZUVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykge1xuICBpZiAoKGZpbmlzaGVkV29yay5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBsYXlvdXQgZWZmZWN0cyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgKGR1cmluZyBtdXRhdGlvbiBwaGFzZSkuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBjdXJyZW50Lm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSwgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG5cblxuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZVxuICAgICAgICAgIC8vIGNvbW1pdCBwaGFzZS4gQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIHR5cGUgY2hlY2suXG4gICAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgIGlmIChfdXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLmNoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgX3VwZGF0ZVF1ZXVlLCBfaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkXG4gICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgICAvLyBUaGVzZSBlZmZlY3RzIHNob3VsZCBvbmx5IGJlIGNvbW1pdHRlZCB3aGVuIGNvbXBvbmVudHMgYXJlIGZpcnN0IG1vdW50ZWQsXG4gICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuXG5cbiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICB2YXIgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggdGV4dC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCBwb3J0YWxzLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7XG4gICAgICAgICAgICB2YXIgZWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHBoYXNlID0gJ25lc3RlZC11cGRhdGUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25SZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25SZW5kZXIoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ29tbWl0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgb25Db21taXQoZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMuaWQsIHBoYXNlLCBlZmZlY3REdXJhdGlvbiwgY29tbWl0VGltZSk7XG4gICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy5cbiAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3Qgc2hvdWxkIGJlIHNjaGVkdWxlZCBldmVuIGlmIHRoZXJlIGlzIG5vIG9uUG9zdENvbW1pdCBjYWxsYmFjayBmb3IgdGhpcyBQcm9maWxlcixcbiAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWZmZWN0IGlzIGFsc28gd2hlcmUgdGltZXMgYnViYmxlIHRvIHBhcmVudCBQcm9maWxlcnMuXG5cblxuICAgICAgICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaW5pc2hlZFdvcmspOyAvLyBQcm9wYWdhdGUgbGF5b3V0IGVmZmVjdCBkdXJhdGlvbnMgdG8gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3Rvci5cbiAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHRoZXNlIHZhbHVlcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgc28gRGV2VG9vbHMgaGFzIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSBmaXJzdC5cblxuICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuO1xuXG4gICAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzICcgKyAnbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgIHtcbiAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIobm9kZSkge1xuICAvLyBUdXJuIG9uIGxheW91dCBlZmZlY3RzIGluIGEgdHJlZSB0aGF0IHByZXZpb3VzbHkgZGlzYXBwZWFyZWQuXG4gIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG4gIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KG5vZGUsIG5vZGUucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbikge1xuICAvLyBPbmx5IGhpZGUgb3IgdW5oaWRlIHRoZSB0b3AtbW9zdCBob3N0IG5vZGVzLlxuICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcblxuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlMyA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzLCBub2RlLm1lbW9pemVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKG5vZGUudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgfHwgbm9kZS50YWcgPT09IExlZ2FjeUhpZGRlbkNvbXBvbmVudCkgJiYgbm9kZS5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmIG5vZGUgIT09IGZpbmlzaGVkV29yaykgOyBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgICBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7XG4gICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEF0dGFjaFJlZihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIHJlZiA9IGZpbmlzaGVkV29yay5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgdmFyIGluc3RhbmNlVG9Vc2U7XG5cbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBpbnN0YW5jZTtcbiAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZ1xuXG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciByZXRWYWw7XG5cbiAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmLmN1cnJlbnQgPSBpbnN0YW5jZVRvVXNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIGRldGVjdCBhbmQgd2FybiBhZ2FpbnN0IHN0YXRlIHVwZGF0ZXMgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC5cbiAgLy8gSXQgYWxzbyBwcmV2ZW50cyBldmVudHMgZnJvbSBidWJibGluZyBmcm9tIHdpdGhpbiBkaXNjb25uZWN0ZWQgY29tcG9uZW50cy5cbiAgLy9cbiAgLy8gSWRlYWxseSwgd2Ugc2hvdWxkIGFsc28gY2xlYXIgdGhlIGNoaWxkIHBvaW50ZXIgb2YgdGhlIHBhcmVudCBhbHRlcm5hdGUgdG8gbGV0IHRoaXNcbiAgLy8gZ2V0IEdDOmVkIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGZvciBzdXJlIHdoaWNoIHBhcmVudCBpcyB0aGUgY3VycmVudFxuICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC5cbiAgLy8gVGhpcyBjaGlsZCBpdHNlbGYgd2lsbCBiZSBHQzplZCB3aGVuIHRoZSBwYXJlbnQgdXBkYXRlcyB0aGUgbmV4dCB0aW1lLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuXG4gIC8vIFRoZXkncmUgbmVlZGVkIGZvciBwYXNzaXZlIGVmZmVjdHMgYW5kIGZvciBmaW5kRE9NTm9kZS5cbiAgLy8gV2UgZGVmZXIgdGhvc2UgZmllbGRzLCBhbmQgYWxsIG90aGVyIGNsZWFudXAsIHRvIHRoZSBwYXNzaXZlIHBoYXNlIChzZWUgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMpLlxuICAvL1xuICAvLyBEb24ndCByZXNldCB0aGUgYWx0ZXJuYXRlIHlldCwgZWl0aGVyLiBXZSBuZWVkIHRoYXQgc28gd2UgY2FuIGRldGFjaCB0aGVcbiAgLy8gYWx0ZXJuYXRlJ3MgZmllbGRzIGluIHRoZSBwYXNzaXZlIHBoYXNlLiBDbGVhcmluZyB0aGUgcmV0dXJuIHBvaW50ZXIgaXNcbiAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLlxuICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUucmV0dXJuID0gbnVsbDtcbiAgfVxuXG4gIGZpYmVyLnJldHVybiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7XG4gICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoYWx0ZXJuYXRlKTtcbiAgfSAvLyBOb3RlOiBEZWZlbnNpdmVseSB1c2luZyBuZWdhdGlvbiBpbnN0ZWFkIG9mIDwgaW4gY2FzZVxuICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC5cblxuXG4gIHtcbiAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseVxuICAgIC8vIGFwcHJveGltYXRlIHRoZSBwbGFubmVkIEZpYmVyIHJlZmFjdG9yLiBJbiB0aGF0IHdvcmxkLCBgc2V0U3RhdGVgIHdpbGwgYmVcbiAgICAvLyBib3VuZCB0byBhIHNwZWNpYWwgXCJpbnN0YW5jZVwiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZVxuICAgIC8vIG9iamVjdCB3aWxsIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBmaWVsZHMuIEl0IHdpbGwgb25seSBiZSBjb25uZWN0ZWQgdG9cbiAgICAvLyB0aGUgZmliZXIgdHJlZSB2aWEgYSBzaW5nbGUgbGluayBhdCB0aGUgcm9vdC4gU28gaWYgdGhpcyBsZXZlbCBhbG9uZSBpc1xuICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLlxuICAgIGZpYmVyLmNoaWxkID0gbnVsbDtcbiAgICBmaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdFxuICAgIC8vIHRyZWUsIHdoaWNoIGhhcyBpdHMgb3duIHBvaW50ZXJzIHRvIGNoaWxkcmVuLCBwYXJlbnRzLCBhbmQgc2libGluZ3MuXG4gICAgLy8gVGhlIG90aGVyIGhvc3Qgbm9kZXMgYWxzbyBwb2ludCBiYWNrIHRvIGZpYmVycywgc28gd2Ugc2hvdWxkIGRldGFjaCB0aGF0XG4gICAgLy8gb25lLCB0b28uXG5cbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICB2YXIgaG9zdEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShob3N0SW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7IC8vIEknbSBpbnRlbnRpb25hbGx5IG5vdCBjbGVhcmluZyB0aGUgYHJldHVybmAgZmllbGQgaW4gdGhpcyBsZXZlbC4gV2VcbiAgICAvLyBhbHJlYWR5IGRpc2Nvbm5lY3QgdGhlIGByZXR1cm5gIHBvaW50ZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIGRlbGV0ZWRcbiAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90XG4gICAgLy8gY3ljbGljYWwgXHUyMDE0IGl0J3Mgb25seSBjeWNsaWNhbCB3aGVuIGNvbWJpbmVkIHdpdGggYGNoaWxkYCwgYHNpYmxpbmdgLCBhbmRcbiAgICAvLyBgYWx0ZXJuYXRlYC4gQnV0IHdlJ2xsIGNsZWFyIGl0IGluIHRoZSBuZXh0IGxldmVsIGFueXdheSwganVzdCBpbiBjYXNlLlxuXG4gICAge1xuICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFRoZW9yZXRpY2FsbHksIG5vdGhpbmcgaW4gaGVyZSBzaG91bGQgYmUgbmVjZXNzYXJ5LCBiZWNhdXNlIHdlIGFscmVhZHlcbiAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpc1xuICAgICAgLy8gcGFydGljdWxhciBmaWJlciwgaXQgd29uJ3QgbGVhayBhbnl0aGluZyBlbHNlXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZVxuICAgICAgLy8gaWYgdGhlcmUncyBhbnkgZGlmZmVyZW5jZSBpbiBtZW1vcnkgaW1wYWN0LiBJZiB0aGVyZSBpcywgdGhhdCBjb3VsZFxuICAgICAgLy8gaW5kaWNhdGUgYSBSZWFjdCBsZWFrIHdlIGRvbid0IGtub3cgYWJvdXQuXG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gVE9ETzogTW92ZSB0byBgY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXJgIGluc3RlYWQuXG5cbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gaXNIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gIC8vIFdlJ3JlIGdvaW5nIHRvIHNlYXJjaCBmb3J3YXJkIGludG8gdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhIHNpYmxpbmcgaG9zdFxuICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG9cbiAgLy8gc2VhcmNoIHBhc3QgdGhlbS4gVGhpcyBsZWFkcyB0byBleHBvbmVudGlhbCBzZWFyY2ggZm9yIHRoZSBuZXh0IHNpYmxpbmcuXG4gIC8vIFRPRE86IEZpbmQgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcy5cbiAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHtcbiAgICAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgbGV0J3MgdHJ5IHRoZSBuZXh0IHNpYmxpbmcuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHtcbiAgICAgICAgLy8gSWYgd2UgcG9wIG91dCBvZiB0aGUgcm9vdCBvciBoaXQgdGhlIHBhcmVudCB0aGUgZmliZXIgd2UgYXJlIHRoZVxuICAgICAgICAvLyBsYXN0IHNpYmxpbmcuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG5cbiAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGl0IGlzIG5vdCBob3N0IG5vZGUgYW5kLCB3ZSBtaWdodCBoYXZlIGEgaG9zdCBub2RlIGluc2lkZSBpdC5cbiAgICAgIC8vIFRyeSB0byBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIG9uZS5cbiAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjaGlsZCwgdHJ5IHRoZSBzaWJsaW5ncyBpbnN0ZWFkLlxuICAgICAgICBjb250aW51ZSBzaWJsaW5ncztcbiAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAvLyBXZSBhbHNvIHNraXAgcG9ydGFscyBiZWNhdXNlIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoaXMgaG9zdCB0cmVlLlxuXG5cbiAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIH1cbiAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuXG5cblxuICAgIGlmICghKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpKSB7XG4gICAgICAvLyBGb3VuZCBpdCFcbiAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGxhY2VtZW50KGZpbmlzaGVkV29yaykge1xuXG5cbiAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLlxuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBiZWZvcmUgZG9pbmcgYW55IGluc2VydGlvbnNcbiAgICAgICAgICByZXNldFRleHRDb250ZW50KHBhcmVudCk7IC8vIENsZWFyIENvbnRlbnRSZXNldCBmcm9tIHRoZSBlZmZlY3QgdGFnXG5cbiAgICAgICAgICBwYXJlbnRGaWJlci5mbGFncyAmPSB+Q29udGVudFJlc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuXG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QpIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIFRoZXNlIGFyZSB0cmFja2VkIG9uIHRoZSBzdGFjayBhcyB3ZSByZWN1cnNpdmVseSB0cmF2ZXJzZSBhXG4vLyBkZWxldGVkIHN1YnRyZWUuXG4vLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nXG4vLyBhIGRlbGV0aW9uLlxuXG5cbnZhciBob3N0UGFyZW50ID0gbnVsbDtcbnZhciBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgYWxsIGhvc3Qgbm9kZXMgZnJvbSB0aGUgcGFyZW50LCBkZXRhY2ggcmVmcywgY2xlYW5cbiAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC5cbiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSB0b3Btb3N0IGhvc3QgY2hpbGQgaW4gZWFjaCBicmFuY2guIEJ1dCB0aGVuIHdlXG4gICAgLy8gc3RpbGwgbmVlZCB0byBrZWVwIHRyYXZlcnNpbmcgdG8gdW5tb3VudCBlZmZlY3RzLCByZWZzLCBhbmQgY1dVLiBUT0RPOiBXZVxuICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmRcbiAgICAvLyBvbmUgZG9lc24ndCBpbmNsdWRlIGFueSByZW1vdmVDaGlsZCBsb2dpYy4gVGhpcyBpcyBtYXliZSB0aGUgc2FtZVxuICAgIC8vIGZ1bmN0aW9uIGFzIFwiZGlzYXBwZWFyTGF5b3V0RWZmZWN0c1wiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXJcbiAgICAvLyB0aGUgbGF5b3V0IHBoYXNlIGlzIHJlZmFjdG9yZWQgdG8gdXNlIHJlY3Vyc2lvbikuXG4gICAgLy8gQmVmb3JlIHN0YXJ0aW5nLCBmaW5kIHRoZSBuZWFyZXN0IGhvc3QgcGFyZW50IG9uIHRoZSBzdGFjayBzbyB3ZSBrbm93XG4gICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS5cbiAgICAvLyBUT0RPOiBJbnN0ZWFkIG9mIHNlYXJjaGluZyB1cCB0aGUgZmliZXIgcmV0dXJuIHBhdGggb24gZXZlcnkgZGVsZXRpb24sIHdlXG4gICAgLy8gY2FuIHRyYWNrIHRoZSBuZWFyZXN0IGhvc3QgY29tcG9uZW50IG9uIHRoZSBKUyBzdGFjayBhcyB3ZSB0cmF2ZXJzZSB0aGVcbiAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby5cbiAgICB2YXIgcGFyZW50ID0gcmV0dXJuRmliZXI7XG5cbiAgICBmaW5kUGFyZW50OiB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGhvc3RQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKTtcbiAgICBob3N0UGFyZW50ID0gbnVsbDtcbiAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgfVxuXG4gIGRldGFjaEZpYmVyTXV0YXRpb24oZGVsZXRlZEZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIHBhcmVudCkge1xuICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHNcbiAgdmFyIGNoaWxkID0gcGFyZW50LmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBjaGlsZCk7XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpIHtcbiAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlXG4gIC8vIGludG8gdGhlaXIgc3VidHJlZS4gVGhlcmUgYXJlIHNpbXBsZXIgY2FzZXMgaW4gdGhlIGlubmVyIHN3aXRjaFxuICAvLyB0aGF0IGRvbid0IG1vZGlmeSB0aGUgc3RhY2suXG5cbiAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfSAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCB0byBuZXh0IGJyYW5jaFxuXG4gICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lLW5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gcmVtb3ZlIHRoZSBuZWFyZXN0IGhvc3QgY2hpbGQuIFNldCB0aGUgaG9zdCBwYXJlbnRcbiAgICAgICAgLy8gdG8gYG51bGxgIG9uIHRoZSBzdGFjayB0byBpbmRpY2F0ZSB0aGF0IG5lc3RlZCBjaGlsZHJlbiBkb24ndFxuICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuXG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdyB0aGF0IGFsbCB0aGUgY2hpbGQgZWZmZWN0cyBoYXZlIHVubW91bnRlZCwgd2UgY2FuIHJlbW92ZSB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWh5ZHJhdGVkRnJhZ21lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50LlxuXG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IF9wcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgX2VmZmVjdCA9IGVmZmVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoKHRhZyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZXN0cm95KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZGVsZXRlZEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBkZWxldGVkRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBvZmZzY3JlZW4gY29tcG9uZW50IGlzIGhpZGRlbiwgd2UgYWxyZWFkeSB1bm1vdW50ZWQgaXQuIEJlZm9yZVxuICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2VcbiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHVubW91bnQgdGhlIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhlIHRyZWUgaXMgaGlkZGVuLCBpbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNraXBcbiAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZFxuICAgICAgICAgIC8vIHRoZSB0b3Btb3N0IGhvc3Qgbm9kZSB0byBkZWxldGUsIHdoaWNoIHdlIGFscmVhZHkgdHJhY2sgb24gdGhlIHN0YWNrLlxuICAgICAgICAgIC8vIEJ1dCB0aGUgb3RoZXIgY2FzZSBpcyBwb3J0YWxzLCB3aGljaCBuZWVkIHRvIGJlIGRldGFjaGVkIG5vIG1hdHRlciBob3dcbiAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYVxuICAgICAgICAgIC8vIHN1YnRyZWUgaW5jbHVkZXMgYSBuZXN0ZWQgcG9ydGFsLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykge1xuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gcGFzc2l2ZSBwaGFzZVxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHJldHJ5Q2FjaGUuYWRkKHdha2VhYmxlKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0xhbmVzICE9PSBudWxsICYmIGluUHJvZ3Jlc3NSb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCBhc3NvY2lhdGUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzIHdpdGggaXQuXG4gICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRXhwZWN0ZWQgZmluaXNoZWQgcm9vdCBhbmQgbGFuZXMgdG8gYmUgc2V0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCk7XG4gIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuICBpblByb2dyZXNzTGFuZXMgPSBudWxsO1xuICBpblByb2dyZXNzUm9vdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7XG4gIC8vIERlbGV0aW9ucyBlZmZlY3RzIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyIHR5cGUuIFRoZXkgbmVlZCB0byBoYXBwZW5cbiAgLy8gYmVmb3JlIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhZSBmaXJlZC5cbiAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZFRvRGVsZXRlID0gZGVsZXRpb25zW2ldO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY2hpbGRUb0RlbGV0ZSwgcGFyZW50RmliZXIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldkRlYnVnRmliZXIgPSBnZXRDdXJyZW50RmliZXIoKTtcblxuICBpZiAocGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgTXV0YXRpb25NYXNrKSB7XG4gICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7XG5cbiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjaGlsZCk7XG4gICAgICBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGNoaWxkLCByb290KTtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG4gIH1cblxuICBzZXRDdXJyZW50RmliZXIocHJldkRlYnVnRmliZXIpO1xufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7IC8vIFRoZSBlZmZlY3QgZmxhZyBzaG91bGQgYmUgY2hlY2tlZCAqYWZ0ZXIqIHdlIHJlZmluZSB0aGUgdHlwZSBvZiBmaWJlcixcbiAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkXG4gIC8vIHRvIHJlY29uY2lsYXRpb24sIGJlY2F1c2UgdGhvc2UgY2FuIGJlIHNldCBvbiBhbGwgZmliZXIgdHlwZXMuXG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KEluc2VydGlvbiB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9IC8vIExheW91dCBlZmZlY3RzIGFyZSBkZXN0cm95ZWQgZHVyaW5nIHRoZSBtdXRhdGlvbiBwaGFzZSBzbyB0aGF0IGFsbFxuICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLlxuICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LlxuXG5cbiAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0XG4gICAgICAgICAgLy8gcGhhc2UuIFRoaXMgaXMgYSByZWZhY3RvciBoYXphcmQgYmVjYXVzZSBpdCBtZWFucyB3ZSBtdXN0IHJlYWRcbiAgICAgICAgICAvLyBmbGFncyB0aGUgZmxhZ3MgYWZ0ZXIgYGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0c2AgaGFzIGFscmVhZHkgcnVuO1xuICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3RcbiAgICAgICAgICAvLyByZWx5IG9uIG11dGF0aW5nIHRoZSBmbGFnIGR1cmluZyBjb21taXQuIExpa2UgYnkgc2V0dGluZyBhIGZsYWdcbiAgICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSBpbnN0ZWFkLlxuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQoaW5zdGFuY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChfaW5zdGFuY2U0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG5ld1Byb3BzO1xuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgc2hvdWxkIGhhdmUgYSB0ZXh0IG5vZGUgaW5pdGlhbGl6ZWQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB2YXIgbmV3VGV4dCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzXG4gICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29tbWl0VGV4dFVwZGF0ZSh0ZXh0SW5zdGFuY2UsIG9sZFRleHQsIG5ld1RleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgcHJldlJvb3RTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgICAgICBpZiAocHJldlJvb3RTdGF0ZS5pc0RlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIHZhciBvZmZzY3JlZW5GaWJlciA9IGZpbmlzaGVkV29yay5jaGlsZDtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuRmliZXIuZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gb2Zmc2NyZWVuRmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gbmV3U3RhdGUgIT09IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIG9mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gaXNIaWRkZW47XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgICAgICBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VDYWxsYmFjayhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhdHRhY2hTdXNwZW5zZVJldHJ5TGlzdGVuZXJzKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF93YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICBpZiAoIC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlYWQgZmxhZ1xuICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICAgIC8vIEJlZm9yZSBjb21taXR0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgb24gdGhlIHN0YWNrIHdoZXRoZXIgdGhpc1xuICAgICAgICAgIC8vIG9mZnNjcmVlbiBzdWJ0cmVlIHdhcyBhbHJlYWR5IGhpZGRlbiwgc28gdGhhdCB3ZSBkb24ndCB1bm1vdW50IHRoZVxuICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX3dhc0hpZGRlbjtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgX29mZnNjcmVlbkluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhblxuICAgICAgICAgIC8vIHJlYWQgaXQgZHVyaW5nIGFuIGV2ZW50XG5cbiAgICAgICAgICBfb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBfaXNIaWRkZW47XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoX2lzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGlmICgob2Zmc2NyZWVuQm91bmRhcnkubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDtcblxuICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5DaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihvZmZzY3JlZW5DaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGVcbiAgICAgICAgICAgIC8vIGluc2lkZSBhIGhpZGRlbiBPZmZzY3JlZW4gdHJlZS5cbiAgICAgICAgICAgIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKG9mZnNjcmVlbkJvdW5kYXJ5LCBfaXNIaWRkZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlclxuICAvLyB0eXBlLiBUaGV5IG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUgY2hpbGRyZW4gZWZmZWN0cyBoYXZlIGZpcmVkLCBidXRcbiAgLy8gYmVmb3JlIHRoZSBlZmZlY3RzIG9uIHRoaXMgZmliZXIgaGF2ZSBmaXJlZC5cbiAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuXG4gIGlmIChmbGFncyAmIFBsYWNlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgfSAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG4gICAgLy8gVE9ETzogZmluZERPTU5vZGUgZG9lc24ndCByZWx5IG9uIHRoaXMgYW55IG1vcmUgYnV0IGlzTW91bnRlZCBkb2VzXG4gICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuXG5cblxuICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+UGxhY2VtZW50O1xuICB9XG5cbiAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7XG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IGNvbW1pdHRlZExhbmVzO1xuICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgLy8gU3VzcGVuc2UgbGF5b3V0IGVmZmVjdHMgc2VtYW50aWNzIGRvbid0IGNoYW5nZSBmb3IgbGVnYWN5IHJvb3RzLlxuICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICggZmliZXIudGFnID09PSBPZmZzY3JlZW5Db21wb25lbnQgJiYgaXNNb2Rlcm5Sb290KSB7XG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLlxuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBpc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG5cbiAgICAgIGlmIChuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4pIHtcbiAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy5cbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBBbHNvIGNoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrXG4gICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gd2FzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuXG5cbiAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcblxuICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJiAhcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290IG9mIGEgcmVhcHBlYXJpbmcgYm91bmRhcnkuIFR1cm4gaXRzIGxheW91dCBlZmZlY3RzXG4gICAgICAgICAgLy8gYmFjayBvbi5cbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgICAgICAgIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oY2hpbGQsIC8vIE5ldyByb290OyBidWJibGUgYmFjayB1cCB0byBoZXJlIGFuZCBzdG9wLlxuICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gUmVzdG9yZSBPZmZzY3JlZW4gc3RhdGUgYW5kIHJlc3VtZSBpbiBvdXItcHJvZ3Jlc3MgdHJhdmVyc2FsLlxuXG5cbiAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzICYmIGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIExheW91dE1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIocm9vdCwgY3VycmVudCwgZmliZXIsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgKFJlZlN0YXRpYyB8IExheW91dFN0YXRpYylcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCBmaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIFJlZlN0YXRpY1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYVxuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyXG4gICAgICAgICAgICAvLyBpdHMgZWZmZWN0cy5cbiAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmIChmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkge1xuICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBzdGlsbCBoaWRkZW4uIERvbid0IHJlLWFwcGVhciBpdHMgZWZmZWN0cy5cbiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBzdWJ0cmVlRmxhZ3MgJiBMYXlvdXRTdGF0aWNcblxuXG4gICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbm9kZSBtYXkgaGF2ZSBiZWVuIHJldXNlZCBmcm9tIGEgcHJldmlvdXMgcmVuZGVyLCBzbyB3ZSBjYW4ndFxuICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LlxuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpY1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKGZpYmVyKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHN1YnRyZWVSb290KSB7XG4gICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICBuZXh0RWZmZWN0ID0gZmluaXNoZWRXb3JrO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTtcbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuXG4gICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKHJvb3QsIGZpYmVyLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpcnN0Q2hpbGQpIHtcbiAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDtcblxuICAgIGlmICgobmV4dEVmZmVjdC5mbGFncyAmIENoaWxkRGVsZXRpb24pICE9PSBOb0ZsYWdzKSB7XG4gICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zO1xuXG4gICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGZpYmVyVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7XG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihmaWJlclRvRGVsZXRlLCBmaWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mXG4gICAgICAgICAgLy8gdGhlIHByZXZpb3VzIChhbHRlcm5hdGUpIHBhcmVudCBmaWJlcidzIGxpc3Qgb2YgY2hpbGRyZW4uIEJlY2F1c2VcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhcmUgYSBsaW5rZWQgbGlzdCwgYW4gZWFybGllciBzaWJsaW5nIHRoYXQncyBzdGlsbCBhbGl2ZVxuICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXJcbiAgICAgICAgICAvLyAgIC0tc2libGluZy0tPiBkZWxldGVkIGZpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWRcbiAgICAgICAgICAvLyB5ZXQsIGJ1dCB3ZSBjYW4gZGlzY29ubmVjdCB0aGUgYHNpYmxpbmdgIGFuZCBgY2hpbGRgIHBvaW50ZXJzLlxuICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBkZXRhY2hlZFNpYmxpbmcgPSBkZXRhY2hlZENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkID0gZGV0YWNoZWRTaWJsaW5nO1xuICAgICAgICAgICAgICB9IHdoaWxlIChkZXRhY2hlZENoaWxkICE9PSBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2NvbXBsZXRlKCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB9XG5cbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICBuZXh0RWZmZWN0ID0gc2libGluZztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZGVsZXRlZFN1YnRyZWVSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gRGVsZXRpb24gZWZmZWN0cyBmaXJlIGluIHBhcmVudCAtPiBjaGlsZCBvcmRlclxuICAgIC8vIFRPRE86IENoZWNrIGlmIGZpYmVyIGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZ1xuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETzogT25seSB0cmF2ZXJzZSBzdWJ0cmVlIGlmIGl0IGhhcyBhIFBhc3NpdmVTdGF0aWMgZmxhZy4gKEJ1dCwgaWYgd2VcbiAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pXG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7XG4gICAgdmFyIHJldHVybkZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy5cbiAgICAgIC8vIFRoaXMgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gaWRlYWwsIGFuZCB0aGUgbG9uZyB0ZXJtIGdvYWwgaXMgdG8gb25seVxuICAgICAgLy8gaGF2ZSB0byBkZXRhY2ggdGhlIGRlbGV0ZWQgdHJlZSBhdCB0aGUgcm9vdC5cbiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTtcblxuICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2libGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSByZXR1cm5GaWJlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59IC8vIFRPRE86IFJldXNlIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyB0cmF2ZXJzYWwgaGVyZT9cblxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIENPTVBPTkVOVF9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5jb21wb25lbnQnKTtcbiAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3Iucm9sZScpO1xuICBURVNUX05BTUVfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGVzdF9pZCcpO1xuICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xuZnVuY3Rpb24gaXNMZWdhY3lBY3RFbnZpcm9ubWVudChmaWJlcikge1xuICB7XG4gICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhblxuICAgIC8vIGFjdCBlbnZpcm9ubWVudCB3aGVuZXZlciBgamVzdGAgaXMgZGVmaW5lZCwgYnV0IHlvdSBjYW4gc3RpbGwgdHVybiBvZmZcbiAgICAvLyBzcHVyaW91cyB3YXJuaW5ncyBieSBzZXR0aW5nIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBleHBsaWNpdGx5XG4gICAgLy8gdG8gZmFsc2UuXG4gICAgdmFyIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCA9IC8vICRGbG93RXhwZWN0ZWRFcnJvciBcdTIwMTMgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGdsb2JhbFxuICAgIHR5cGVvZiBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgIT09ICd1bmRlZmluZWQnID8gSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIDogdW5kZWZpbmVkOyAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBqZXN0XG5cbiAgICB2YXIgamVzdElzRGVmaW5lZCA9IHR5cGVvZiBqZXN0ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7XG4gIHtcbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJbmNsdWRlIGxpbmsgdG8gcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBwYWdlLlxuICAgICAgZXJyb3IoJ1RoZSBjdXJyZW50IHRlc3RpbmcgZW52aXJvbm1lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAnICsgJ2FjdCguLi4pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDtcbiAgfVxufVxuXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlO1xudmFyIE5vQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAqL1xuMDtcbnZhciBCYXRjaGVkQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICovXG4xO1xudmFyIFJlbmRlckNvbnRleHQgPVxuLyogICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBSb290SW5Qcm9ncmVzcyA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1O1xudmFyIFJvb3REaWROb3RDb21wbGV0ZSA9IDY7IC8vIERlc2NyaWJlcyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFJlYWN0IGV4ZWN1dGlvbiBzdGFja1xuXG52YXIgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dDsgLy8gVGhlIHJvb3Qgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsgLy8gVGhlIGZpYmVyIHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzID0gbnVsbDsgLy8gVGhlIGxhbmVzIHdlJ3JlIHJlbmRlcmluZ1xuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBTdGFjayB0aGF0IGFsbG93cyBjb21wb25lbnRzIHRvIGNoYW5nZSB0aGUgcmVuZGVyIGxhbmVzIGZvciBpdHMgc3VidHJlZVxuLy8gVGhpcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHdvcmtpbmcgb24gYXQgdGhlIHJvb3QuIFRoZSBvbmx5XG4vLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlXG4vLyBlbnRlciBhIHN1YnRyZWUgdGhhdCBpcyBoaWRkZW4gYW5kIG5lZWRzIHRvIGJlIHVuaGlkZGVuOiBTdXNwZW5zZSBhbmRcbi8vIE9mZnNjcmVlbiBjb21wb25lbnQuXG4vL1xuLy8gTW9zdCB0aGluZ3MgaW4gdGhlIHdvcmsgbG9vcCBzaG91bGQgZGVhbCB3aXRoIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLlxuLy8gTW9zdCB0aGluZ3MgaW4gYmVnaW4vY29tcGxldGUgcGhhc2VzIHNob3VsZCBkZWFsIHdpdGggc3VidHJlZVJlbmRlckxhbmVzLlxuXG52YXIgc3VidHJlZVJlbmRlckxhbmVzID0gTm9MYW5lcztcbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gXCJJbmNsdWRlZFwiIGxhbmVzIHJlZmVyIHRvIGxhbmVzIHRoYXQgd2VyZSB3b3JrZWQgb24gZHVyaW5nIHRoaXMgcmVuZGVyLiBJdCdzXG4vLyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiBgcmVuZGVyTGFuZXNgIGJlY2F1c2UgYHJlbmRlckxhbmVzYCBjYW4gY2hhbmdlIGFzIHlvdVxuLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXJcbi8vIGxhbmVzIGZvciB0aGUgZW50aXJlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yayBsZWZ0IG92ZXIgYnkgY29tcG9uZW50cyB0aGF0IHdlcmUgdmlzaXRlZCBkdXJpbmcgdGhpcyByZW5kZXIuIE9ubHlcbi8vIGluY2x1ZGVzIHVucHJvY2Vzc2VkIHVwZGF0ZXMsIG5vdCB3b3JrIGluIGJhaWxlZCBvdXQgY2hpbGRyZW4uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCAoaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQpIGR1cmluZyB0aGlzIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UgKCpub3QqIGFuIGludGVybGVhdmVkIGV2ZW50KS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lczsgLy8gRXJyb3JzIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsOyAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgd2UgcmVjb3ZlcmVkIGZyb20gd2l0aG91dCBzdXJmYWNpbmcgdGhlbSB0byB0aGUgVUkuXG4vLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xudmFyIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTtcbnZhciByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDtcbnZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG52YXIgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDsgLy8gVXNlIHRoZXNlIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBvZiBuZXN0ZWQgdXBkYXRlc1xuXG52YXIgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbnZhciByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbnZhciBORVNURURfUEFTU0lWRV9VUERBVEVfTElNSVQgPSA1MDtcbnZhciBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcbnZhciBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldFdvcmtJblByb2dyZXNzUm9vdCgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RFdmVudFRpbWUoKSB7XG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICAvLyBXZSdyZSBpbnNpZGUgUmVhY3QsIHNvIGl0J3MgZmluZSB0byByZWFkIHRoZSBhY3R1YWwgdGltZS5cbiAgICByZXR1cm4gbm93KCk7XG4gIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFRpbWUgIT09IE5vVGltZXN0YW1wKSB7XG4gICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLlxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xuICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSBzaW5jZSBSZWFjdCB5aWVsZGVkLiBDb21wdXRlIGEgbmV3IHN0YXJ0IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gbm93KCk7XG4gIHJldHVybiBjdXJyZW50RXZlbnRUaW1lO1xufVxuZnVuY3Rpb24gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpIHtcbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH0gZWxzZSBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGVcbiAgICAvLyBvbGQgYmVoYXZpb3IgaXMgdG8gZ2l2ZSB0aGlzIHRoZSBzYW1lIFwidGhyZWFkXCIgKGxhbmVzKSBhc1xuICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnRcbiAgICAvLyB0aGF0IGhhcHBlbnMgbGF0ZXIgaW4gdGhlIHNhbWUgcmVuZGVyLCBpdCB3aWxsIGZsdXNoLiBJZGVhbGx5LCB3ZSB3YW50IHRvXG4gICAgLy8gcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2UgYW5kIHRyZWF0IHRoZW0gYXMgaWYgdGhleSBjYW1lIGZyb20gYW5cbiAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC5cbiAgICAvLyBUaGlzIGJlaGF2aW9yIGlzIG9ubHkgYSBmYWxsYmFjay4gVGhlIGZsYWcgb25seSBleGlzdHMgdW50aWwgd2UgY2FuIHJvbGxcbiAgICAvLyBvdXQgdGhlIHNldFN0YXRlIHdhcm5pbmcsIHNpbmNlIGV4aXN0aW5nIGNvZGUgbWlnaHQgYWNjaWRlbnRhbGx5IHJlbHkgb25cbiAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci5cbiAgICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmUod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICAgICAgaWYgKCF0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTtcbiAgICB9IC8vIFRoZSBhbGdvcml0aG0gZm9yIGFzc2lnbmluZyBhbiB1cGRhdGUgdG8gYSBsYW5lIHNob3VsZCBiZSBzdGFibGUgZm9yIGFsbFxuICAgIC8vIHVwZGF0ZXMgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aGluIHRoZSBzYW1lIGV2ZW50LiBUbyBkbyB0aGlzLCB0aGVcbiAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLlxuICAgIC8vXG4gICAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXNcbiAgICAvLyBvdmVyLiBPdXIgaGV1cmlzdGljIGZvciB0aGF0IGlzIHdoZW5ldmVyIHdlIGVudGVyIGEgY29uY3VycmVudCB3b3JrIGxvb3AuXG5cblxuICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAvLyBBbGwgdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBzYW1lIGV2ZW50IGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBsYW5lLlxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBjbGFpbU5leHRUcmFuc2l0aW9uTGFuZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgfSAvLyBVcGRhdGVzIG9yaWdpbmF0aW5nIGluc2lkZSBjZXJ0YWluIFJlYWN0IG1ldGhvZHMsIGxpa2UgZmx1c2hTeW5jLCBoYXZlXG4gIC8vIHRoZWlyIHByaW9yaXR5IHNldCBieSB0cmFja2luZyBpdCB3aXRoIGEgY29udGV4dCB2YXJpYWJsZS5cbiAgLy9cbiAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuXG4gIC8vIHVzZSB0aGF0IGRpcmVjdGx5LlxuICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuXG5cblxuICB2YXIgdXBkYXRlTGFuZSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIGlmICh1cGRhdGVMYW5lICE9PSBOb0xhbmUpIHtcbiAgICByZXR1cm4gdXBkYXRlTGFuZTtcbiAgfSAvLyBUaGlzIHVwZGF0ZSBvcmlnaW5hdGVkIG91dHNpZGUgUmVhY3QuIEFzayB0aGUgaG9zdCBlbnZpcm9ubWVudCBmb3IgYW5cbiAgLy8gYXBwcm9wcmlhdGUgcHJpb3JpdHksIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGV2ZW50LlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciBldmVudExhbmUgPSBnZXRDdXJyZW50RXZlbnRQcmlvcml0eSgpO1xuICByZXR1cm4gZXZlbnRMYW5lO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UmV0cnlMYW5lKGZpYmVyKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGByZXF1ZXN0VXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiBcdTIwMTQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgLy8gU3BlY2lhbCBjYXNlc1xuICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7XG5cbiAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7XG4gICAgICBlcnJvcigndXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgICAvLyB0aGF0IHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCB1cGRhdGUgd29yayBvbiB0aGlzIHJvb3QuIFVubGVzcyB0aGVcbiAgICAgIC8vIGBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2hgIGZsYWcgaXMgb2ZmIGFuZCB0aGlzIGlzIGEgcmVuZGVyXG4gICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAgIC8vIHRoZXkgd2VyZSBpbnRlcmxlYXZlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXQgcmVhc29ucy5cbiAgICAgIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAgIC8vIFRoZSByb290IGFscmVhZHkgc3VzcGVuZGVkIHdpdGggYSBkZWxheSwgd2hpY2ggbWVhbnMgdGhpcyByZW5kZXJcbiAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzXG4gICAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgICAvLyBlZmZlY3Qgb2YgaW50ZXJydXB0aW5nIHRoZSBjdXJyZW50IHJlbmRlciBhbmQgc3dpdGNoaW5nIHRvIHRoZSB1cGRhdGUuXG4gICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmVcbiAgICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAobGFuZSA9PT0gU3luY0xhbmUgJiYgZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlXG4gICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAvLyBzY2hlZHVsZUNhbGxiYWNrRm9yRmliZXIgdG8gcHJlc2VydmUgdGhlIGFiaWxpdHkgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZFxuICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpIHtcbiAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgZm9yayBvZiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgdGhhdCBpcyBvbmx5IHVzZWQgdG9cbiAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdFxuICAvLyBvZiB0aGUgc3R1ZmYgaW4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGNhbiBiZSBza2lwcGVkLlxuICAvL1xuICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGVcbiAgLy8gaW5pdGlhbCBjaGlsZHJlbiBmcm9tIHN1YnNlcXVlbnQgdXBkYXRlcy4gSW4gZnVsbHkgY2xpZW50LXJlbmRlcmVkIHJvb3RzXG4gIC8vIChjcmVhdGVSb290IGluc3RlYWQgb2YgaHlkcmF0ZVJvb3QpLCBhbGwgdG9wLWxldmVsIHJlbmRlcnMgYXJlIG1vZGVsZWQgYXNcbiAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0XG4gIC8vIG1hdGNoIHdoYXQgd2FzIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICBjdXJyZW50LmxhbmVzID0gbGFuZTtcbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuZnVuY3Rpb24gaXNVbnNhZmVDbGFzc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSB7XG4gIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBPbmx5IGNhbGxlZCBieSBjbGFzcyBjb21wb25lbnRzLFxuICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLlxuICByZXR1cm4gKC8vIFRPRE86IFJlbW92ZSBvdXRkYXRlZCBkZWZlclJlbmRlclBoYXNlVXBkYXRlVG9OZXh0QmF0Y2ggZXhwZXJpbWVudC4gV2VcbiAgICAvLyBkZWNpZGVkIG5vdCB0byBlbmFibGUgaXQuXG4gICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dFxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCBzdGlsbCBwcmVtYXR1cmVseSBmbHVzaCB0aGUgY2FsbGJhY2tzXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS5cbiAgICAgICAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbDtcblxuICAgIHN3aXRjaCAobGFuZXNUb0V2ZW50UHJpb3JpdHkobmV4dExhbmVzKSkge1xuICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSWRsZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2skMShzY2hlZHVsZXJQcmlvcml0eUxldmVsLCBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gIH1cblxuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBuZXdDYWxsYmFja1ByaW9yaXR5O1xuICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIGV2ZXJ5IGNvbmN1cnJlbnQgdGFzaywgaS5lLiBhbnl0aGluZyB0aGF0XG4vLyBnb2VzIHRocm91Z2ggU2NoZWR1bGVyLlxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdChyb290LCBkaWRUaW1lb3V0KSB7XG4gIHtcbiAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfSAvLyBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIGEgUmVhY3QgZXZlbnQsIHdlIGNhbiBjbGVhciB0aGUgY3VycmVudFxuICAvLyBldmVudCB0aW1lLiBUaGUgbmV4dCB1cGRhdGUgd2lsbCBjb21wdXRlIGEgbmV3IGV2ZW50IHRpbWUuXG5cblxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfSAvLyBGbHVzaCBhbnkgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoIGxhbmVzIHRvIHdvcmsgb24sXG4gIC8vIGluIGNhc2UgdGhleSBzY2hlZHVsZSBhZGRpdGlvbmFsIHdvcmsuXG5cblxuICB2YXIgb3JpZ2luYWxDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTtcbiAgdmFyIGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMgPSBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG5cbiAgaWYgKGRpZEZsdXNoUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhc2sgbm9kZSBmb3IgdGhpcyByb290IHdhcyBjaGFuZ2VkLlxuICAgIGlmIChyb290LmNhbGxiYWNrTm9kZSAhPT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGxcbiAgICAgIC8vIGBlbnN1cmVSb290SXNTY2hlZHVsZWRgIGJlY2F1c2UgdGhlIGNoZWNrIGFib3ZlIGltcGxpZXMgZWl0aGVyIHRoYXRcbiAgICAgIC8vIHRoZXJlJ3MgYSBuZXcgdGFzaywgb3IgdGhhdCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSAvLyBEZXRlcm1pbmUgdGhlIG5leHQgbGFuZXMgdG8gd29yayBvbiwgdXNpbmcgdGhlIGZpZWxkcyBzdG9yZWRcbiAgLy8gb24gdGhlIHJvb3QuXG5cblxuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgcm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ID8gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgOiBOb0xhbmVzKTtcblxuICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBXZSBkaXNhYmxlIHRpbWUtc2xpY2luZyBpbiBzb21lIGNhc2VzOiBpZiB0aGUgd29yayBoYXMgYmVlbiBDUFUtYm91bmRcbiAgLy8gZm9yIHRvbyBsb25nIChcImV4cGlyZWRcIiB3b3JrLCB0byBwcmV2ZW50IHN0YXJ2YXRpb24pLCBvciB3ZSdyZSBpblxuICAvLyBzeW5jLXVwZGF0ZXMtYnktZGVmYXVsdCBtb2RlLlxuICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXJcbiAgLy8gYnVnIHdlJ3JlIHN0aWxsIGludmVzdGlnYXRpbmcuIE9uY2UgdGhlIGJ1ZyBpbiBTY2hlZHVsZXIgaXMgZml4ZWQsXG4gIC8vIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2UgdHJhY2sgZXhwaXJhdGlvbiBvdXJzZWx2ZXMuXG5cblxuICB2YXIgc2hvdWxkVGltZVNsaWNlID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKSAmJiAhaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgJiYgKCAhZGlkVGltZW91dCk7XG4gIHZhciBleGl0U3RhdHVzID0gc2hvdWxkVGltZVNsaWNlID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290SW5Qcm9ncmVzcykge1xuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsXG4gICAgICAvLyByZW5kZXIgc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGxcbiAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlclxuICAgICAgLy8gdGhlIHNlY29uZCBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICB0aHJvdyBmYXRhbEVycm9yO1xuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgdW53b3VuZCB3aXRob3V0IGNvbXBsZXRpbmcgdGhlIHRyZWUuIFRoaXMgaGFwcGVucyBpbiBzcGVjaWFsXG4gICAgICAvLyBjYXNlcyB3aGVyZSBuZWVkIHRvIGV4aXQgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgcHJvZHVjaW5nIGFcbiAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLlxuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGR1cmluZyBhIGNvbmN1cnJlbnQgcmVuZGVyLCBub3QgYSBkaXNjcmV0ZSBvclxuICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZVxuICAgICAgLy8gdW53b3VuZCB0aGUgc3RhY2suXG4gICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHJlbmRlciBjb21wbGV0ZWQuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIHJlbmRlciBtYXkgaGF2ZSB5aWVsZGVkIHRvIGEgY29uY3VycmVudCBldmVudCwgYW5kIGlmIHNvLFxuICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuXG4gICAgICAvLyBUT0RPOiBJdCdzIHBvc3NpYmxlIHRoYXQgZXZlbiBhIGNvbmN1cnJlbnQgcmVuZGVyIG1heSBuZXZlciBoYXZlIHlpZWxkZWRcbiAgICAgIC8vIHRvIHRoZSBtYWluIHRocmVhZCwgaWYgaXQgd2FzIGZhc3QgZW5vdWdoLCBvciBpZiBpdCBleHBpcmVkLiBXZSBjb3VsZFxuICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uXG4gICAgICB2YXIgcmVuZGVyV2FzQ29uY3VycmVudCA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcyk7XG4gICAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHJlbmRlcldhc0NvbmN1cnJlbnQgJiYgIWlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspKSB7XG4gICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbixcbiAgICAgICAgLy8gc3luY2hyb25vdXNseSwgdG8gYmxvY2sgZnVydGhlciBtdXRhdGlvbnMuXG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7IC8vIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaWYgc29tZXRoaW5nIHRocmV3XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICBsYW5lcyA9IF9lcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgX2Vycm9yUmV0cnlMYW5lcyk7IC8vIFdlIGFzc3VtZSB0aGUgdHJlZSBpcyBub3cgY29uc2lzdGVudCBiZWNhdXNlIHdlIGRpZG4ndCB5aWVsZCB0byBhbnlcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgICAgIHRocm93IF9mYXRhbEVycm9yO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgICAvLyBvciwgaWYgc29tZXRoaW5nIHN1c3BlbmRlZCwgd2FpdCB0byBjb21taXQgaXQgYWZ0ZXIgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICAgICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgICBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHtcbiAgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbiwgZGlzY2FyZCBzZXJ2ZXIgcmVzcG9uc2UgYW5kIGZhbGxcbiAgLy8gYmFjayB0byBjbGllbnQgc2lkZSByZW5kZXIuXG4gIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LlxuICB2YXIgZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnM7XG5cbiAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAvLyBUaGUgc2hlbGwgZmFpbGVkIHRvIGh5ZHJhdGUuIFNldCBhIGZsYWcgdG8gZm9yY2UgYSBjbGllbnQgcmVuZGVyaW5nXG4gICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93XG4gICAgLy8gdG8gY3JlYXRlIHRoZSByb290IHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIFRoaXMgaXMgYSBiaXQgd2VpcmQgaW4gdGVybXNcbiAgICAvLyBvZiBmYWN0b3JpbmcsIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHJlbmRlclJvb3RTeW5jIG5vdCBjYWxsaW5nXG4gICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGVcbiAgICAvLyByb290IGFuZCBsYW5lcyBoYXZlbid0IGNoYW5nZWQuXG4gICAgLy9cbiAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGVcbiAgICAvLyB0aHJvd0V4Y2VwdGlvbiwgbGlrZSB3ZSBkbyBmb3IgbmVzdGVkIFN1c3BlbnNlIGJvdW5kYXJpZXMuIFRoZSByZWFzb25cbiAgICAvLyBpdCdzIGhlcmUgaW5zdGVhZCBpcyBzbyB3ZSBjYW4gc3dpdGNoIHRvIHRoZSBzeW5jaHJvbm91cyB3b3JrIGxvb3AsIHRvby5cbiAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLlxuICAgIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIHJvb3RXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcblxuICAgIHtcbiAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuXG4gIGlmIChleGl0U3RhdHVzICE9PSBSb290RXJyb3JlZCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnlcbiAgICAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIGZhaWxlZCBmaXJzdCBhdHRlbXB0IGhhdmUgYmVlbiByZWNvdmVyZWQuIEFkZFxuICAgIC8vIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gb2YgcmVjb3ZlcmFibGUgZXJyb3JzLiBXZSdsbCBsb2cgdGhlbSBpbiB0aGVcbiAgICAvLyBjb21taXQgcGhhc2UuXG4gICAgdmFyIGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnM7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0OyAvLyBUaGUgZXJyb3JzIGZyb20gdGhlIHNlY29uZCBhdHRlbXB0IHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIGVycm9yc1xuICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuXG5cbiAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHtcbiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGl0U3RhdHVzO1xufVxuXG5mdW5jdGlvbiBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9ycykge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9ycztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycy5wdXNoLmFwcGx5KHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCBlcnJvcnMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpIHtcbiAgc3dpdGNoIChleGl0U3RhdHVzKSB7XG4gICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICBjYXNlIFJvb3RGYXRhbEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIC8vIEZsb3cga25vd3MgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMgaWYgSSBhZGQgYSBicmVha1xuICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnNcbiAgICAvLyBpZiBJIGRvLiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgUm9vdEVycm9yZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZFxuICAgICAgICAvLyB0aGlzIHBvaW50LCBpdCBlcnJvcmVkIGFnYWluLiBDb21taXQgaXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2VcbiAgICAgICAgLy8gc2hvdWxkIGltbWVkaWF0ZWx5IGNvbW1pdCBpdCBvciB3YWl0IGEgYml0LlxuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlSZXRyaWVzKGxhbmVzKSAmJiAvLyBkbyBub3QgZGVsYXkgaWYgd2UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlXG4gICAgICAgICFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZ1xuICAgICAgICAgIC8vIHJldHJpZXMgc28gdGhhdCB3ZSBkb24ndCBzaG93IHRvbyBtYW55IGxvYWRpbmcgc3RhdGVzIHRvbyBxdWlja2x5LlxuICAgICAgICAgIHZhciBtc1VudGlsVGltZW91dCA9IGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgKyBGQUxMQkFDS19USFJPVFRMRV9NUyAtIG5vdygpOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuICAgICAgICAgIGlmIChtc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdC5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHtcbiAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZWZlciB0byByZW5kZXIgdGhlIGZhbGxiYWNrIG9mIGF0IHRoZSBsYXN0XG4gICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBsZXZlbC4gUGluZyB0aGUgbGFzdCBzdXNwZW5kZWQgbGV2ZWwgdG8gdHJ5XG4gICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgSWRsZT8gU2hvdWxkIG5vdCByZXN0YXJ0LlxuICAgICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSAvLyBUaGUgcmVuZGVyIGlzIHN1c3BlbmRlZCwgaXQgaGFzbid0IHRpbWVkIG91dCwgYW5kIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGEgdG8gYXJyaXZlLlxuXG5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHRyYW5zaXRpb24sIHNvIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgY29tbWl0dGluZyBhXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYW5kIHdpdGhvdXQgc2NoZWR1bGluZyBhIHRpbWVvdXQuIERlbGF5IGluZGVmaW5pdGVseVxuICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuXG4gICAgICAgICAgLy8gU2NoZWR1bGUgYSBwbGFjZWhvbGRlciB0byBkaXNwbGF5IGFmdGVyIGEgc2hvcnQgZGVsYXksIHVzaW5nIHRoZSBKdXN0XG4gICAgICAgICAgLy8gTm90aWNlYWJsZSBEaWZmZXJlbmNlLlxuICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzXG4gICAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHdlIHRyYWNrIHRoZSBldmVudCB0aW1lLCB0aGVuIHByb2JhYmx5IG5vdC5cbiAgICAgICAgICAvLyBDb25zaWRlciByZW1vdmluZy5cbiAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIHZhciBldmVudFRpbWVNcyA9IG1vc3RSZWNlbnRFdmVudFRpbWU7XG4gICAgICAgICAgdmFyIHRpbWVFbGFwc2VkTXMgPSBub3coKSAtIGV2ZW50VGltZU1zO1xuXG4gICAgICAgICAgdmFyIF9tc1VudGlsVGltZW91dCA9IGpuZCh0aW1lRWxhcHNlZE1zKSAtIHRpbWVFbGFwc2VkTXM7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG5cbiAgICAgICAgICBpZiAoX21zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sgaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YVxuICAgICAgICAgICAgLy8gdG8gYXJyaXZlLlxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIF9tc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ29tbWl0IHRoZSBwbGFjZWhvbGRlci5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gU2VhcmNoIHRoZSByZW5kZXJlZCB0cmVlIGZvciBleHRlcm5hbCBzdG9yZSByZWFkcywgYW5kIGNoZWNrIHdoZXRoZXIgdGhlXG4gIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQgaW4gYSBjb25jdXJyZW50IGV2ZW50LiBJbnRlbnRpb25hbGx5IHVzaW5nIGFuIGl0ZXJhdGl2ZVxuICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LlxuICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yaztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLmZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSkge1xuICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTtcblxuICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjaGVja3MgPSB1cGRhdGVRdWV1ZS5zdG9yZXM7XG5cbiAgICAgICAgaWYgKGNoZWNrcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07XG4gICAgICAgICAgICB2YXIgZ2V0U25hcHNob3QgPSBjaGVjay5nZXRTbmFwc2hvdDtcbiAgICAgICAgICAgIHZhciByZW5kZXJlZFZhbHVlID0gY2hlY2sudmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBpbmNvbnNpc3RlbnQgc3RvcmUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiBgZ2V0U25hcHNob3RgIHRocm93cywgcmV0dXJuIGBmYWxzZWAuIFRoaXMgd2lsbCBzY2hlZHVsZVxuICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBjaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnJlYWNoYWJsZVxuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKTtcbiAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnb1xuLy8gdGhyb3VnaCBTY2hlZHVsZXJcblxuXG5mdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkge1xuICB7XG4gICAgc3luY05lc3RlZFVwZGF0ZUZsYWcoKTtcbiAgfVxuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAvLyBUaGVyZSdzIG5vIHJlbWFpbmluZyBzeW5jIHdvcmsgbGVmdC5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gSWYgc29tZXRoaW5nIHRocmV3IGFuIGVycm9yLCB0cnkgcmVuZGVyaW5nIG9uZSBtb3JlIHRpbWUuIFdlJ2xsIHJlbmRlclxuICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzXG4gICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAvLyBhdHRlbXB0LCB3ZSdsbCBnaXZlIHVwIGFuZCBjb21taXQgdGhlIHJlc3VsdGluZyB0cmVlLlxuICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICB0aHJvdyBmYXRhbEVycm9yO1xuICB9XG5cbiAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2VcbiAgLy8gd2lsbCBjb21taXQgaXQgZXZlbiBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLlxuXG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHRcbiAgLy8gcGVuZGluZyBsZXZlbC5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7XG4gIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG1lcmdlTGFuZXMobGFuZXMsIFN5bmNMYW5lKSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gSWYgdGhlcmUgd2VyZSBsZWdhY3kgc3luYyB1cGRhdGVzLCBmbHVzaCB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIG91dGVyXG4gICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC5cblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS5cbiAgICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kpKSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIH1cbiAgfVxufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHtcbiAgLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGZsdXNoIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlXG4gIC8vIG5leHQgZXZlbnQsIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBvbmUuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guXG4gICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBoYXBwZW4gZXZlbiBpZiBiYXRjaGVkVXBkYXRlcyBpcyBoaWdoZXIgdXBcbiAgICAvLyB0aGUgc3RhY2suXG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQWxyZWFkeVJlbmRlcmluZygpIHtcbiAgLy8gVXNlZCBieSB0aGUgcmVuZGVyZXIgdG8gcHJpbnQgYSB3YXJuaW5nIGlmIGNlcnRhaW4gQVBJcyBhcmUgY2FsbGVkIGZyb21cbiAgLy8gdGhlIHdyb25nIGNvbnRleHQuXG4gIHJldHVybiAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0O1xufVxuZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykge1xuICBwdXNoKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgc3VidHJlZVJlbmRlckxhbmVzLCBmaWJlcik7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMoc3VidHJlZVJlbmRlckxhbmVzLCBsYW5lcyk7XG4gIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHBvcFJlbmRlckxhbmVzKGZpYmVyKSB7XG4gIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICBwb3Aoc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKSB7XG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcbiAgdmFyIHRpbWVvdXRIYW5kbGUgPSByb290LnRpbWVvdXRIYW5kbGU7XG5cbiAgaWYgKHRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dCkge1xuICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFja1xuICAgIC8vIHN0YXRlLiBOb3cgdGhhdCB3ZSBoYXZlIGFkZGl0aW9uYWwgd29yaywgY2FuY2VsIHRoZSB0aW1lb3V0LlxuICAgIHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDsgLy8gJEZsb3dGaXhNZSBDb21wbGFpbnMgbm9UaW1lb3V0IGlzIG5vdCBhIFRpbWVvdXRJRCwgZGVzcGl0ZSB0aGUgY2hlY2sgYWJvdmVcblxuICAgIGNhbmNlbFRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgd2hpbGUgKGludGVycnVwdGVkV29yayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpbnRlcnJ1cHRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBpbnRlcnJ1cHRlZFdvcmsgPSBpbnRlcnJ1cHRlZFdvcmsucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7XG4gIHZhciByb290V29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhyb290LmN1cnJlbnQsIG51bGwpO1xuICB3b3JrSW5Qcm9ncmVzcyA9IHJvb3RXb3JrSW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsO1xuICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCk7XG5cbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgfVxuXG4gIHJldHVybiByb290V29ya0luUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKSB7XG4gIGRvIHtcbiAgICB2YXIgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXNldCBtb2R1bGUtbGV2ZWwgc3RhdGUgdGhhdCB3YXMgc2V0IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpO1xuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsgLy8gVE9ETzogSSBmb3VuZCBhbmQgYWRkZWQgdGhpcyBtaXNzaW5nIGxpbmUgd2hpbGUgaW52ZXN0aWdhdGluZyBhXG4gICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuXG5cbiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG5cbiAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgdG8gYmUgd29ya2luZyBvbiBhIG5vbi1yb290IGZpYmVyLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3JcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSdzIG5vIGFuY2VzdG9yIHRoYXQgY2FuIGhhbmRsZSBpdDsgdGhlIHJvb3QgaXNcbiAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3JcbiAgICAgICAgLy8gYm91bmRhcnkuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHRcbiAgICAgICAgLy8gc2libGluZywgb3IgdGhlIHBhcmVudCBpZiB0aGVyZSBhcmUgbm8gc2libGluZ3MuIEJ1dCBzaW5jZSB0aGUgcm9vdFxuICAgICAgICAvLyBoYXMgbm8gc2libGluZ3Mgbm9yIGEgcGFyZW50LCB3ZSBzZXQgaXQgdG8gbnVsbC4gVXN1YWxseSB0aGlzIGlzXG4gICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gaW50ZW50aW9uYWxseSBub3QgY2FsbGluZyB0aG9zZSwgd2UgbmVlZCBzZXQgaXQgaGVyZS5cbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgY2FsbGluZyBgdW53aW5kV29ya2AgdG8gcG9wIHRoZSBjb250ZXh0cy5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIgJiYgZXJyb3JlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZSBzcGVudCByZW5kZXJpbmcgYmVmb3JlIGFuIGVycm9yIHdhcyB0aHJvd24uIFRoaXNcbiAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGFcbiAgICAgICAgLy8gc3VzcGVuZGVkIHJlbmRlci5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShlcnJvcmVkV29yaywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHtcbiAgICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcblxuICAgICAgICBpZiAodGhyb3duVmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHRocm93blZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGhyb3duVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB3YWtlYWJsZSA9IHRocm93blZhbHVlO1xuICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya0NvbXBvbmVudEVycm9yZWQoZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCkge1xuICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7XG59XG5mdW5jdGlvbiBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGxhbmUpIHtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZCgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcyB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHVwZGF0ZXMgdGhhdCB3ZSBza2lwcGVkIHRyZWUgdGhhdCBtaWdodCBoYXZlIHVuYmxvY2tlZFxuICAvLyB0aGlzIHJlbmRlci5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwgJiYgKGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKSB8fCBpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzKSkpIHtcbiAgICAvLyBNYXJrIHRoZSBjdXJyZW50IHJlbmRlciBhcyBzdXNwZW5kZWQgc28gdGhhdCB3ZSBzd2l0Y2ggdG8gd29ya2luZyBvblxuICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWx3YXlzIG1hcmsgdGhlIHJvb3QgYXMgc3VzcGVuZGVkIGltbWVkaWF0ZWx5XG4gICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXJcbiAgICAvLyBwaGFzZSBpbnRyb2R1Y2VzIGEgcG90ZW50aWFsIG1pc3Rha2Ugd2hlcmUgd2Ugc3VzcGVuZCBsYW5lcyB0aGF0IHdlcmVcbiAgICAvLyBwaW5nZWQgb3IgdXBkYXRlZCB3aGlsZSB3ZSB3ZXJlIHJlbmRlcmluZy5cbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG59IC8vIFRoZSB3b3JrIGxvb3AgaXMgYW4gZXh0cmVtZWx5IGhvdCBwYXRoLiBUZWxsIENsb3N1cmUgbm90IHRvIGlubGluZSBpdC5cblxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wU3luYygpIHtcbiAgLy8gQWxyZWFkeSB0aW1lZCBvdXQsIHNvIHBlcmZvcm0gd29yayB3aXRob3V0IGNoZWNraW5nIGlmIHdlIG5lZWQgdG8geWllbGQuXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBTdGlsbCB3b3JrIHJlbWFpbmluZy5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyWWllbGRlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBSb290SW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuXG4gICAge1xuICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLlxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gIH1cbn1cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcENvbmN1cnJlbnQoKSB7XG4gIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZFxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwgJiYgIXNob3VsZFlpZWxkKCkpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspO1xuICB2YXIgbmV4dDtcblxuICBpZiAoICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKHVuaXRPZldvcmssIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgdW5pdE9mV29yay5tZW1vaXplZFByb3BzID0gdW5pdE9mV29yay5wZW5kaW5nUHJvcHM7XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuXG4gICAgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgfVxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHRcbiAgLy8gc2libGluZy4gSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2libGluZ3MsIHJldHVybiB0byB0aGUgcGFyZW50IGZpYmVyLlxuICB2YXIgY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG5cbiAgZG8ge1xuICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAgIC8vIG5lZWQgYW4gYWRkaXRpb25hbCBmaWVsZCBvbiB0aGUgd29yayBpbiBwcm9ncmVzcy5cbiAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlO1xuICAgIHZhciByZXR1cm5GaWJlciA9IGNvbXBsZXRlZFdvcmsucmV0dXJuOyAvLyBDaGVjayBpZiB0aGUgd29yayBjb21wbGV0ZWQgb3IgaWYgc29tZXRoaW5nIHRocmV3LlxuXG4gICAgaWYgKChjb21wbGV0ZWRXb3JrLmZsYWdzICYgSW5jb21wbGV0ZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHZhciBuZXh0ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsgLy8gVXBkYXRlIHJlbmRlciBkdXJhdGlvbiBhc3N1bWluZyB3ZSBkaWRuJ3QgZXJyb3IuXG5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG5cbiAgICAgIGlmIChuZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIHNvbWV0aGluZyB0aHJldy4gUG9wIHZhbHVlcyBvZmZcbiAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LFxuICAgICAgLy8gY2FwdHVyZSB2YWx1ZXMgaWYgcG9zc2libGUuXG4gICAgICB2YXIgX25leHQgPSB1bndpbmRXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmspOyAvLyBCZWNhdXNlIHRoaXMgZmliZXIgZGlkIG5vdCBjb21wbGV0ZSwgZG9uJ3QgcmVzZXQgaXRzIGxhbmVzLlxuXG5cbiAgICAgIGlmIChfbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjb21wbGV0aW5nIHRoaXMgd29yayBzcGF3bmVkIG5ldyB3b3JrLCBkbyB0aGF0IG5leHQuIFdlJ2xsIGNvbWVcbiAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLlxuICAgICAgICAvLyBTaW5jZSB3ZSdyZSByZXN0YXJ0aW5nLCByZW1vdmUgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBob3N0IGVmZmVjdFxuICAgICAgICAvLyBmcm9tIHRoZSBlZmZlY3QgdGFnLlxuICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzaztcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBfbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHJlbmRlciBkdXJhdGlvbiBmb3IgdGhlIGZpYmVyIHRoYXQgZXJyb3JlZC5cbiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YShjb21wbGV0ZWRXb3JrLCBmYWxzZSk7IC8vIEluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgd29ya2luZyBvbiBmYWlsZWQgY2hpbGRyZW4gYmVmb3JlIGNvbnRpbnVpbmcuXG5cbiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAvLyBNYXJrIHRoZSBwYXJlbnQgZmliZXIgYXMgaW5jb21wbGV0ZSBhbmQgY2xlYXIgaXRzIHN1YnRyZWUgZmxhZ3MuXG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICAgIHJldHVybkZpYmVyLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSd2ZSB1bndvdW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdERpZE5vdENvbXBsZXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB3b3JrIHRvIGRvIGluIHRoaXMgcmV0dXJuRmliZXIsIGRvIHRoYXQgbmV4dC5cbiAgICAgIHdvcmtJblByb2dyZXNzID0gc2libGluZ0ZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gT3RoZXJ3aXNlLCByZXR1cm4gdG8gdGhlIHBhcmVudFxuXG5cbiAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy5cblxuICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yaztcbiAgfSB3aGlsZSAoY29tcGxldGVkV29yayAhPT0gbnVsbCk7IC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIHJvb3QuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykge1xuICAvLyBUT0RPOiBUaGlzIG5vIGxvbmdlciBtYWtlcyBhbnkgc2Vuc2UuIFdlIGFscmVhZHkgd3JhcCB0aGUgbXV0YXRpb24gYW5kXG4gIC8vIGxheW91dCBwaGFzZXMuIFNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZS5cbiAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgZG8ge1xuICAgIC8vIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIGNhbGwgYGZsdXNoU3luY1VwZGF0ZVF1ZXVlYCBhdCB0aGUgZW5kLCB3aGljaFxuICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbFxuICAgIC8vIHBhc3NpdmUgZWZmZWN0cy4gU28gd2UgbmVlZCB0byBrZWVwIGZsdXNoaW5nIGluIGEgbG9vcCB1bnRpbCB0aGVyZSBhcmVcbiAgICAvLyBubyBtb3JlIHBlbmRpbmcgZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseVxuICAgIC8vIGZsdXNoIHN5bmNocm9ub3VzIHdvcmsgYXQgdGhlIGVuZCwgdG8gYXZvaWQgZmFjdG9yaW5nIGhhemFyZHMgbGlrZSB0aGlzLlxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpO1xuXG4gIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9XG5cbiAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuZmluaXNoZWRXb3JrO1xuICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IG51bGwpIHtcblxuICAgIHtcbiAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgICAgIGVycm9yKCdyb290LmZpbmlzaGVkTGFuZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSBkdXJpbmcgYSBjb21taXQuIFRoaXMgaXMgYSAnICsgJ2J1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH0gLy8gY29tbWl0Um9vdCBuZXZlciByZXR1cm5zIGEgY29udGludWF0aW9uOyBpdCBhbHdheXMgZmluaXNoZXMgc3luY2hyb25vdXNseS5cbiAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuXG5cblxuICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdFxuICAvLyBwZW5kaW5nIHRpbWUgaXMgd2hhdGV2ZXIgaXMgbGVmdCBvbiB0aGUgcm9vdCBmaWJlci5cblxuICB2YXIgcmVtYWluaW5nTGFuZXMgPSBtZXJnZUxhbmVzKGZpbmlzaGVkV29yay5sYW5lcywgZmluaXNoZWRXb3JrLmNoaWxkTGFuZXMpO1xuICBtYXJrUm9vdEZpbmlzaGVkKHJvb3QsIHJlbWFpbmluZ0xhbmVzKTtcblxuICBpZiAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290KSB7XG4gICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLlxuICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgfSAvLyBJZiB0aGVyZSBhcmUgcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGVtLlxuICAvLyBEbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLCBzbyBpdCBpcyBxdWV1ZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdFxuICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LilcbiAgLy8gVE9ETzogRGVsZXRlIGFsbCBvdGhlciBwbGFjZXMgdGhhdCBzY2hlZHVsZSB0aGUgcGFzc2l2ZSBlZmZlY3QgY2FsbGJhY2tcbiAgLy8gVGhleSdyZSByZWR1bmRhbnQuXG5cblxuICBpZiAoKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgfHwgKGZpbmlzaGVkV29yay5mbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncykge1xuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIC8vIHRvIHN0b3JlIGl0IGluIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgdW50aWwgdGhleSBnZXQgcHJvY2Vzc2VkXG4gICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgdGhpcyB0aHJvdWdoIGFzIGFuIGFyZ3VtZW50IHRvIGNvbW1pdFJvb3RcbiAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlblxuICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciBhbmQgY29tbWl0IGlmIHdlIHRocm90dGxlIHRoZSBjb21taXRcbiAgICAgIC8vIHdpdGggc2V0VGltZW91dFxuXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOyAvLyBUaGlzIHJlbmRlciB0cmlnZ2VyZWQgcGFzc2l2ZSBlZmZlY3RzOiByZWxlYXNlIHRoZSByb290IGNhY2hlIHBvb2xcbiAgICAgICAgLy8gKmFmdGVyKiBwYXNzaXZlIGVmZmVjdHMgZmlyZSB0byBhdm9pZCBmcmVlaW5nIGEgY2FjaGUgcG9vbCB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YylcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuXG4gIC8vIFRPRE86IFRoaXMgaXMgbGVmdCBvdmVyIGZyb20gdGhlIGVmZmVjdCBsaXN0IGltcGxlbWVudGF0aW9uLCB3aGVyZSB3ZSBoYWRcbiAgLy8gdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYGZpcnN0RWZmZWN0YCB0byBzYXRpc2Z5IEZsb3cuIEkgdGhpbmsgdGhlXG4gIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLlxuICAvLyBSZWNvbnNpZGVyIHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuXG5cblxuICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcbiAgdmFyIHJvb3RIYXNFZmZlY3QgPSAoZmluaXNoZWRXb3JrLmZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChzdWJ0cmVlSGFzRWZmZWN0cyB8fCByb290SGFzRWZmZWN0KSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDsgLy8gUmVzZXQgdGhpcyB0byBudWxsIGJlZm9yZSBjYWxsaW5nIGxpZmVjeWNsZXNcblxuICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7IC8vIFRoZSBjb21taXQgcGhhc2UgaXMgYnJva2VuIGludG8gc2V2ZXJhbCBzdWItcGhhc2VzLiBXZSBkbyBhIHNlcGFyYXRlIHBhc3NcbiAgICAvLyBvZiB0aGUgZWZmZWN0IGxpc3QgZm9yIGVhY2ggcGhhc2U6IGFsbCBtdXRhdGlvbiBlZmZlY3RzIGNvbWUgYmVmb3JlIGFsbFxuICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uXG4gICAgLy8gVGhlIGZpcnN0IHBoYXNlIGEgXCJiZWZvcmUgbXV0YXRpb25cIiBwaGFzZS4gV2UgdXNlIHRoaXMgcGhhc2UgdG8gcmVhZCB0aGVcbiAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmVcbiAgICAvLyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSBpcyBjYWxsZWQuXG5cbiAgICB2YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG5cbiAgICB7XG4gICAgICAvLyBNYXJrIHRoZSBjdXJyZW50IGNvbW1pdCB0aW1lIHRvIGJlIHNoYXJlZCBieSBhbGwgUHJvZmlsZXJzIGluIHRoaXNcbiAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLlxuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cblxuXG4gICAgY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuXG4gICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcblxuICAgIHtcbiAgICAgIG1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC5cblxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLlxuXG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gIH0gZWxzZSB7XG5cbiAgICB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgfVxuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYW4gZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3RcbiAgLy8gVE9ETzogVGhpcyBpcyBwYXJ0IG9mIHRoZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGltcGxlbWVudGF0aW9uLiBJdHMgcHVycG9zZVxuICAvLyBpcyB0byBkZXRlY3Qgd2hldGhlciBzb21ldGhpbmcgbWlnaHQgaGF2ZSBjYWxsZWQgc2V0U3RhdGUgaW5zaWRlXG4gIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYFxuICAvLyBpbnNpZGUgYGNvbXBvbmVudERpZENhdGNoYCBpcyBpdHNlbGYgZmxhd2VkIFx1MjAxNCB0aGF0J3Mgd2h5IHdlIHJlY29tbWVuZFxuICAvLyBgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yYCBpbnN0ZWFkLiBIb3dldmVyLCBpdCBjb3VsZCBiZSBpbXByb3ZlZCBieVxuICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzXG4gIC8vIGFueSB3b3JrIHJlbWFpbmluZyBhdCBhbGwgKHdoaWNoIHdvdWxkIGFsc28gaW5jbHVkZSBzdHVmZiBsaWtlIFN1c3BlbnNlXG4gIC8vIHJldHJpZXMgb3IgdHJhbnNpdGlvbnMpLiBJdCdzIGJlZW4gbGlrZSB0aGlzIGZvciBhIHdoaWxlLCB0aG91Z2gsIHNvIGZpeGluZ1xuICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC5cblxuICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ29tbWl0Um9vdChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLCByZW5kZXJQcmlvcml0eUxldmVsKTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICByb290Lm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgb25Db21taXRSb290JDEoKTtcbiAgfSAvLyBBbHdheXMgY2FsbCB0aGlzIGJlZm9yZSBleGl0aW5nIGBjb21taXRSb290YCwgdG8gZW5zdXJlIHRoYXQgYW55XG4gIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLlxuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocmVjb3ZlcmFibGVFcnJvcnMgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXRcbiAgICAvLyBuZWVkaW5nIHRvIHN1cmZhY2UgaXQgdG8gdGhlIFVJLiBXZSBsb2cgdGhlbSBoZXJlLlxuICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSByb290Lm9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07XG4gICAgICB2YXIgY29tcG9uZW50U3RhY2sgPSByZWNvdmVyYWJsZUVycm9yLnN0YWNrO1xuICAgICAgdmFyIGRpZ2VzdCA9IHJlY292ZXJhYmxlRXJyb3IuZGlnZXN0O1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IGNvbXBvbmVudFN0YWNrLFxuICAgICAgICBkaWdlc3Q6IGRpZ2VzdFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGVycm9yJDEgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvciQxO1xuICB9IC8vIElmIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIHRoZSByZXN1bHQgb2YgYSBkaXNjcmV0ZSByZW5kZXIsIGZsdXNoIHRoZW1cbiAgLy8gc3luY2hyb25vdXNseSBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRhc2sgc28gdGhhdCB0aGUgcmVzdWx0IGlzXG4gIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90XG4gIC8vIG9yZGVyLWRlcGVuZGVudCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgb2JzZXJ2ZWQgYnkgZXh0ZXJuYWwgc3lzdGVtcywgc28gd2VcbiAgLy8gY2FuIHdhaXQgdW50aWwgYWZ0ZXIgcGFpbnQuXG4gIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZVxuICAvLyBjdXJyZW50bHkgc2NoZWR1bGUgdGhlIGNhbGxiYWNrIGluIG11bHRpcGxlIHBsYWNlcywgd2lsbCB3YWl0IHVudGlsIHRob3NlXG4gIC8vIGFyZSBjb25zb2xpZGF0ZWQuXG5cblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcywgU3luY0xhbmUpICYmIHJvb3QudGFnICE9PSBMZWdhY3lSb290KSB7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIHtcbiAgICAgIG1hcmtOZXN0ZWRVcGRhdGVTY2hlZHVsZWQoKTtcbiAgICB9IC8vIENvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJvb3Qgc3luY2hyb25vdXNseSByZS1yZW5kZXJzIHdpdGhvdXRcbiAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLlxuXG5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH0gLy8gSWYgbGF5b3V0IHdvcmsgd2FzIHNjaGVkdWxlZCwgZmx1c2ggaXQgbm93LlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIG1hcmtDb21taXRTdG9wcGVkKCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHtcbiAgLy8gUmV0dXJucyB3aGV0aGVyIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIGZsdXNoZWQuXG4gIC8vIFRPRE86IENvbWJpbmUgdGhpcyBjaGVjayB3aXRoIHRoZSBvbmUgaW4gZmx1c2hQYXNzaXZlRUZmZWN0c0ltcGwuIFdlIHNob3VsZFxuICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZVxuICAvLyBpbiB0aGUgZmlyc3QgcGxhY2UgYmVjYXVzZSB3ZSB1c2VkIHRvIHdyYXAgaXQgd2l0aFxuICAvLyBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsIHdoaWNoIGFjY2VwdHMgYSBmdW5jdGlvbi4gQnV0IG5vdyB3ZSB0cmFjayB0aGVcbiAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuXG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIHZhciByZW5kZXJQcmlvcml0eSA9IGxhbmVzVG9FdmVudFByaW9yaXR5KHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzKTtcbiAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICAgIHRyeSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByaW9yaXR5KTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsgLy8gT25jZSBwYXNzaXZlIGVmZmVjdHMgaGF2ZSBydW4gZm9yIHRoZSB0cmVlIC0gZ2l2aW5nIGNvbXBvbmVudHMgYVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cy5wdXNoKGZpYmVyKTtcblxuICAgIGlmICghcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gQ2FjaGUgYW5kIGNsZWFyIHRoZSB0cmFuc2l0aW9ucyBmbGFnXG5cblxuICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zO1xuICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbDtcbiAgdmFyIHJvb3QgPSByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cztcbiAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7XG4gIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gbnVsbDsgLy8gVE9ETzogVGhpcyBpcyBzb21ldGltZXMgb3V0IG9mIHN5bmMgd2l0aCByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy5cbiAgLy8gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gSXQncyBub3QgY2F1c2luZyBhbnkga25vd24gaXNzdWVzIChwcm9iYWJseVxuICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC5cblxuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHMocm9vdCwgcm9vdC5jdXJyZW50LCBsYW5lcywgdHJhbnNpdGlvbnMpOyAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuICB7XG4gICAgdmFyIHByb2ZpbGVyRWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzO1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIF9maWJlciA9IHByb2ZpbGVyRWZmZWN0c1tpXTtcbiAgICAgIGNvbW1pdFBhc3NpdmVFZmZlY3REdXJhdGlvbnMocm9vdCwgX2ZpYmVyKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RvcHBlZCgpO1xuICB9XG5cbiAge1xuICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIHRydWUpO1xuICB9XG5cbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgICAvLyBleGNlZWRzIHRoZSBsaW1pdCwgd2UnbGwgZmlyZSBhIHdhcm5pbmcuXG4gICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGlmIChyb290ID09PSByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG5cbiAgb25Qb3N0Q29tbWl0Um9vdChyb290KTtcblxuICB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IHJvb3QuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgc291cmNlRmliZXIpO1xuICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7XG4gICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gVE9ETzogVW50aWwgd2UgcmUtbGFuZCBza2lwVW5tb3VudGVkQm91bmRhcmllcyAoc2VlICMyMDE0NyksIHRoaXMgd2FybmluZ1xuICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZFxuICAgIC8vIHRyZWVzLiBXaGF0IGl0IHNob3VsZCBpbnN0ZWFkIGRvIGlzIHByb3BhZ2F0ZSB0aGUgZXJyb3IgdG8gdGhlIHBhcmVudCBvZlxuICAgIC8vIHRoZSBkZWxldGVkIHRyZWUuIEluIHRoZSBtZWFudGltZSwgZG8gbm90IGFkZCB0aGlzIHdhcm5pbmcgdG8gdGhlXG4gICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuXG4gICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciAnICsgJ2luc2lkZSBhIGRldGFjaGVkIHRyZWUuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LiBMaWtlbHkgJyArICdjYXVzZXMgaW5jbHVkZSBkZWxldGluZyB0aGUgc2FtZSBmaWJlciBtb3JlIHRoYW4gb25jZSwgY29tbWl0dGluZyBhbiAnICsgJ2FscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbicgKyAnRXJyb3IgbWVzc2FnZTpcXG5cXG4lcycsIGVycm9yJDEpO1xuICB9XG59XG5mdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgdmFyIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlO1xuXG4gIGlmIChwaW5nQ2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTtcbiAgd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCk7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJiBpc1N1YnNldE9mTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsIHBpbmdlZExhbmVzKSkge1xuICAgIC8vIFJlY2VpdmVkIGEgcGluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCB3ZSdyZSBjdXJyZW50bHlcbiAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yXG4gICAgLy8gdGhlIGxvZ2ljIG9mIHdoZXRoZXIgb3Igbm90IGEgcm9vdCBzdXNwZW5kcyBvbmNlIGl0IGNvbXBsZXRlcy5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSByZW5kZXJpbmcgc3luYyBlaXRoZXIgZHVlIHRvIFN5bmMsIEJhdGNoZWQgb3IgZXhwaXJlZCxcbiAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC5cbiAgICAvLyBJZiB3ZSdyZSBzdXNwZW5kZWQgd2l0aCBkZWxheSwgb3IgaWYgaXQncyBhIHJldHJ5LCB3ZSdsbCBhbHdheXMgc3VzcGVuZFxuICAgIC8vIHNvIHdlIGNhbiBhbHdheXMgcmVzdGFydC5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7XG4gICAgICAvLyBSZXN0YXJ0IGZyb20gdGhlIHJvb3QuXG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY2FuJ3QgcmVzdGFydCByaWdodCBub3csIHdlIG1pZ2h0IGdldCBhblxuICAgICAgLy8gb3Bwb3J0dW5pdHkgbGF0ZXIuIFNvIHdlIG1hcmsgdGhpcyByZW5kZXIgYXMgaGF2aW5nIGEgcGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xufVxuXG5mdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gIC8vIFRoZSBib3VuZGFyeSBmaWJlciAoYSBTdXNwZW5zZSBjb21wb25lbnQgb3IgU3VzcGVuc2VMaXN0IGNvbXBvbmVudClcbiAgLy8gcHJldmlvdXNseSB3YXMgcmVuZGVyZWQgaW4gaXRzIGZhbGxiYWNrIHN0YXRlLiBPbmUgb2YgdGhlIHByb21pc2VzIHRoYXRcbiAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXNcbiAgLy8gbGlrZWx5IHVuYmxvY2tlZC4gVHJ5IHJlbmRlcmluZyBhZ2FpbiwgYXQgYSBuZXcgbGFuZXMuXG4gIGlmIChyZXRyeUxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkXG4gICAgLy8gdW5uZWNlc3NhcnkgZW50YW5nbGVtZW50P1xuICAgIHJldHJ5TGFuZSA9IHJlcXVlc3RSZXRyeUxhbmUoYm91bmRhcnlGaWJlcik7XG4gIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/XG5cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gV2UgbGV0IHRoZSBvdGhlciB3YXJuaW5nIGFib3V0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGRlYWwgd2l0aCB0aGlzIG9uZS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBzaG93IHRoZSB3aG9sZSBzdGFjayBidXQgZGVkdXBlIG9uIHRoZSB0b3AgY29tcG9uZW50J3MgbmFtZSBiZWNhdXNlXG4gICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC5cblxuXG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbmV3IFNldChbY29tcG9uZW50TmFtZV0pO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgIHRyeSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYSBjb21wb25lbnQgdGhhdCBoYXNuJ3QgbW91bnRlZCB5ZXQuIFwiICsgJ1RoaXMgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgYSBzaWRlLWVmZmVjdCBpbiB5b3VyIHJlbmRlciBmdW5jdGlvbiB0aGF0ICcgKyAnYXN5bmNocm9ub3VzbHkgbGF0ZXIgY2FsbHMgdHJpZXMgdG8gdXBkYXRlIHRoZSBjb21wb25lbnQuIE1vdmUgdGhpcyB3b3JrIHRvICcgKyAndXNlRWZmZWN0IGluc3RlYWQuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLlxuICAgICAgICAvLyBEb24ndCByZXBsYXkgZXJyb3JzIGlmIHdlIGFyZSBoeWRyYXRpbmcgYW5kIGhhdmUgYWxyZWFkeSBzdXNwZW5kZWQgb3IgaGFuZGxlZCBhbiBlcnJvclxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcGxheUVycm9yID09PSAnb2JqZWN0JyAmJiByZXBsYXlFcnJvciAhPT0gbnVsbCAmJiByZXBsYXlFcnJvci5fc3VwcHJlc3NMb2dnaW5nICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yID09PSAnb2JqZWN0JyAmJiBvcmlnaW5hbEVycm9yICE9PSBudWxsICYmICFvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcpIHtcbiAgICAgICAgICAvLyBJZiBzdXBwcmVzc2VkLCBsZXQgdGhlIGZsYWcgY2Fycnkgb3ZlciB0byB0aGUgb3JpZ2luYWwgZXJyb3Igd2hpY2ggaXMgdGhlIG9uZSB3ZSdsbCByZXRocm93LlxuICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2UgYWx3YXlzIHRocm93IHRoZSBvcmlnaW5hbCBlcnJvciBpbiBjYXNlIHRoZSBzZWNvbmQgcmVuZGVyIHBhc3MgaXMgbm90IGlkZW1wb3RlbnQuXG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLlxuXG5cbiAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmICFnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSkge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUgPSB3b3JrSW5Qcm9ncmVzcyAmJiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIpIHtcbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmApLiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlICcgKyAnZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLicpO1xuXG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIHNjaGVkdWxpbmdGaWJlciwgbGFuZXMpO1xuICAgICAgfSk7IC8vIFRoaXMgZnVuY3Rpb24gaW50ZW50aW9uYWxseSBkb2VzIG5vdCBjbGVhciBtZW1vaXplZCB1cGRhdGVycy5cbiAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXRcbiAgICAgIC8vIGFuZCBhIGZ1dHVyZSBvbmUgKGUuZy4gU3VzcGVuc2UpLlxuICAgIH1cbiAgfVxufVxudmFyIGZha2VBY3RDYWxsYmFja05vZGUgPSB7fTtcblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFjayQxKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGFuIGBhY3RgIHNjb3BlLCBieXBhc3MgU2NoZWR1bGVyIGFuZCBwdXNoIHRvXG4gICAgLy8gdGhlIGBhY3RgIHF1ZXVlIGluc3RlYWQuXG4gICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50O1xuXG4gICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7XG4gICAgICBhY3RRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBmYWtlQWN0Q2FsbGJhY2tOb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKSB7XG4gIGlmICggY2FsbGJhY2tOb2RlID09PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIEluIHByb2R1Y3Rpb24sIGFsd2F5cyBjYWxsIFNjaGVkdWxlci4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHN0cmlwcGVkIG91dC5cblxuXG4gIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRGb3JjZUZsdXNoRmFsbGJhY2tzSW5ERVYoKSB7XG4gIC8vIE5ldmVyIGZvcmNlIGZsdXNoIGluIHByb2R1Y3Rpb24uIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdldCBzdHJpcHBlZCBvdXQuXG4gIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgIGlmICghaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLlxuICAgICAgaWYgKCFpc0xlZ2FjeUFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ICE9PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gTGVnYWN5IG1vZGUgZG9lc24ndCB3YXJuIGlmIHRoZSB1cGRhdGUgaXMgYmF0Y2hlZCwgaS5lLlxuICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpYmVyLnRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgZmliZXIudGFnICE9PSBGb3J3YXJkUmVmICYmIGZpYmVyLnRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seVxuICAgICAgICAvLyB3YXJucyBmb3IgdXBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIGEgaG9vay5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlICcgKyAnd3JhcHBlZCBpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KSB7XG4gIHtcbiAgICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIHN1c3BlbmRlZCByZXNvdXJjZSBmaW5pc2hlZCBsb2FkaW5nIGluc2lkZSBhIHRlc3QsIGJ1dCB0aGUgZXZlbnQgJyArICd3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7XG4gIHtcbiAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSBpc1J1bm5pbmc7XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcyAqL1xudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoX3Jvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyBJbnN0YW5jZVxuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMuZWxlbWVudFR5cGUgPSBudWxsO1xuICB0aGlzLnR5cGUgPSBudWxsO1xuICB0aGlzLnN0YXRlTm9kZSA9IG51bGw7IC8vIEZpYmVyXG5cbiAgdGhpcy5yZXR1cm4gPSBudWxsO1xuICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgdGhpcy5zaWJsaW5nID0gbnVsbDtcbiAgdGhpcy5pbmRleCA9IDA7XG4gIHRoaXMucmVmID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gIHRoaXMubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBudWxsO1xuICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB0aGlzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIHRoaXMubW9kZSA9IG1vZGU7IC8vIEVmZmVjdHNcblxuICB0aGlzLmZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLmRlbGV0aW9ucyA9IG51bGw7XG4gIHRoaXMubGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmFsdGVybmF0ZSA9IG51bGw7XG5cbiAge1xuICAgIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgaXMgZG9uZSB0byBhdm9pZCBhIHY4IHBlcmZvcm1hbmNlIGNsaWZmLlxuICAgIC8vXG4gICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBmaWVsZHMgYmVsb3cgdG8gc21pcyBhbmQgbGF0ZXIgdXBkYXRpbmcgdGhlbSB3aXRoXG4gICAgLy8gZG91YmxlIHZhbHVlcyB3aWxsIGNhdXNlIEZpYmVycyB0byBlbmQgdXAgaGF2aW5nIHNlcGFyYXRlIHNoYXBlcy5cbiAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS5cbiAgICAvLyBGb3J0dW5hdGVseSB0aGlzIG9ubHkgaW1wYWN0cyBERVYgYnVpbGRzLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgaXQgbWFrZXMgUmVhY3QgdW51c2FibHkgc2xvdyBmb3Igc29tZSBhcHBsaWNhdGlvbnMuXG4gICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy5cbiAgICAvL1xuICAgIC8vIExlYXJuIG1vcmUgYWJvdXQgdGhpcyBoZXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjVcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD04NTM4XG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjsgLy8gSXQncyBva2F5IHRvIHJlcGxhY2UgdGhlIGluaXRpYWwgZG91YmxlcyB3aXRoIHNtaXMgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsXG4gICAgLy8gYW5kIGl0IHNpbXBsaWZpZXMgb3RoZXIgcHJvZmlsZXIgY29kZSAoaW5jbHVkaW5nIERldlRvb2xzKS5cblxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6XG4gICAgdGhpcy5fZGVidWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnT3duZXIgPSBudWxsO1xuICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7XG4gICAgdGhpcy5fZGVidWdIb29rVHlwZXMgPSBudWxsO1xuXG4gICAgaWYgKCFoYXNCYWRNYXBQb2x5ZmlsbCAmJiB0eXBlb2YgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGhpcyk7XG4gICAgfVxuICB9XG59IC8vIFRoaXMgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgcmF0aGVyIHRoYW4gYSBQT0pPIGNvbnN0cnVjdG9yLCBzdGlsbFxuLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOlxuLy8gMSkgTm9ib2R5IHNob3VsZCBhZGQgYW55IGluc3RhbmNlIG1ldGhvZHMgb24gdGhpcy4gSW5zdGFuY2UgbWV0aG9kcyBjYW4gYmVcbi8vICAgIG1vcmUgZGlmZmljdWx0IHRvIHByZWRpY3Qgd2hlbiB0aGV5IGdldCBvcHRpbWl6ZWQgYW5kIHRoZXkgYXJlIGFsbW9zdFxuLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLlxuLy8gMikgTm9ib2R5IHNob3VsZCByZWx5IG9uIGBpbnN0YW5jZW9mIEZpYmVyYCBmb3IgdHlwZSB0ZXN0aW5nLiBXZSBzaG91bGRcbi8vICAgIGFsd2F5cyBrbm93IHdoZW4gaXQgaXMgYSBmaWJlci5cbi8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXJcbi8vICAgIHRvIG9wdGltaXplIGluIGEgbm9uLUpJVCBlbnZpcm9ubWVudC5cbi8vIDQpIFdlIGNhbiBlYXNpbHkgZ28gZnJvbSBhIGNvbnN0cnVjdG9yIHRvIGEgY3JlYXRlRmliZXIgb2JqZWN0IGxpdGVyYWwgaWYgdGhhdFxuLy8gICAgaXMgZmFzdGVyLlxuLy8gNSkgSXQgc2hvdWxkIGJlIGVhc3kgdG8gcG9ydCB0aGlzIHRvIGEgQyBzdHJ1Y3QgYW5kIGtlZXAgYSBDIGltcGxlbWVudGF0aW9uXG4vLyAgICBjb21wYXRpYmxlLlxuXG5cbnZhciBjcmVhdGVGaWJlciA9IGZ1bmN0aW9uICh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vICRGbG93Rml4TWU6IHRoZSBzaGFwZXMgYXJlIGV4YWN0IGhlcmUgYnV0IEZsb3cgZG9lc24ndCBsaWtlIGNvbnN0cnVjdG9yc1xuICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgIXNob3VsZENvbnN0cnVjdCQxKHR5cGUpICYmIHR5cGUuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7XG4gIH0gZWxzZSBpZiAoQ29tcG9uZW50ICE9PSB1bmRlZmluZWQgJiYgQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gQ29tcG9uZW50LiQkdHlwZW9mO1xuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICByZXR1cm4gRm9yd2FyZFJlZjtcbiAgICB9XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgcmV0dXJuIE1lbW9Db21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7XG59IC8vIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYW4gYWx0ZXJuYXRlIGZpYmVyIHRvIGRvIHdvcmsgb24uXG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIHBlbmRpbmdQcm9wcykge1xuICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHtcbiAgICAvLyBXZSB1c2UgYSBkb3VibGUgYnVmZmVyaW5nIHBvb2xpbmcgdGVjaG5pcXVlIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHdlJ2xsXG4gICAgLy8gb25seSBldmVyIG5lZWQgYXQgbW9zdCB0d28gdmVyc2lvbnMgb2YgYSB0cmVlLiBXZSBwb29sIHRoZSBcIm90aGVyXCIgdW51c2VkXG4gICAgLy8gbm9kZSB0aGF0IHdlJ3JlIGZyZWUgdG8gcmV1c2UuIFRoaXMgaXMgbGF6aWx5IGNyZWF0ZWQgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICAgIC8vIGV4dHJhIG9iamVjdHMgZm9yIHRoaW5ncyB0aGF0IGFyZSBuZXZlciB1cGRhdGVkLiBJdCBhbHNvIGFsbG93IHVzIHRvXG4gICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZUZpYmVyKGN1cnJlbnQudGFnLCBwZW5kaW5nUHJvcHMsIGN1cnJlbnQua2V5LCBjdXJyZW50Lm1vZGUpO1xuICAgIHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAge1xuICAgICAgLy8gREVWLW9ubHkgZmllbGRzXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7XG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSB3b3JrSW5Qcm9ncmVzcztcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLlxuICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgdGFnLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBOb0ZsYWdzOyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRpbWUgZnJvbSBlbmRsZXNzbHkgYWNjdW11bGF0aW5nIGluIG5ldyBjb21taXRzLlxuICAgICAgLy8gVGhpcyBoYXMgdGhlIGRvd25zaWRlIG9mIHJlc2V0dGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwcmlvcml0eSByZW5kZXJzLFxuICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB9XG4gIH0gLy8gUmVzZXQgYWxsIGVmZmVjdHMgZXhjZXB0IHN0YXRpYyBvbmVzLlxuICAvLyBTdGF0aWMgZWZmZWN0cyBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb25cblxuICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nO1xuICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gIHdvcmtJblByb2dyZXNzLnJlZiA9IGN1cnJlbnQucmVmO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7XG5cbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgcmVzZXRzIHRoZSBGaWJlciB0byB3aGF0IGNyZWF0ZUZpYmVyIG9yIGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkXG4gIC8vIGhhdmUgc2V0IHRoZSB2YWx1ZXMgdG8gYmVmb3JlIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSWRlYWxseSB0aGlzIHdvdWxkbid0XG4gIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3NcbiAgLy8gd2hlbiB0aGV5IHNob3VsZCBiZSByZWFkaW5nIGZyb20gY3VycmVudCBhbmQgd3JpdGluZyB0byB3b3JrSW5Qcm9ncmVzcy5cbiAgLy8gV2UgYXNzdW1lIHBlbmRpbmdQcm9wcywgaW5kZXgsIGtleSwgcmVmLCByZXR1cm4gYXJlIHN0aWxsIHVudG91Y2hlZCB0b1xuICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLlxuICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJ1dCBrZWVwIGFueSBQbGFjZW1lbnQgdGFncywgc2luY2UgdGhhdCdzIHNvbWV0aGluZ1xuICAvLyB0aGF0IGNoaWxkIGZpYmVyIGlzIHNldHRpbmcsIG5vdCB0aGUgcmVjb25jaWxpYXRpb24uXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBSZXNldCB0byBjcmVhdGVGaWJlcidzIGluaXRpYWwgdmFsdWVzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBOb0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gICAgLy8gaXQgY2Fubm90IGJlIHNoYXJlZCB3aXRoIHRoZSBjdXJyZW50IGZpYmVyLlxuXG4gICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICAgIGxhbmVzOiBjdXJyZW50RGVwZW5kZW5jaWVzLmxhbmVzLFxuICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICAgIH07XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSkge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZTtcblxuICAgIGlmIChpc1N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAge1xuICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludFx1MjAxM1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICBmaWJlclRhZyA9IE1vZGU7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcblxuICAgICAgICBpZiAoIChtb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAvLyBTdHJpY3QgZWZmZWN0cyBzaG91bGQgbmV2ZXIgcnVuIG9uIGxlZ2FjeSByb290c1xuICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfU0NPUEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfQ0FDSEVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGNhc2UgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBcIiArICduYW1lZCBpbXBvcnRzLic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIob3duZXIpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiAnICsgJ2NvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgJyArIChcImJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gdHlwZTtcbiAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBvd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIG93bmVyID0gbnVsbDtcblxuICB7XG4gICAgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBlbGVtZW50LnByb3BzO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwga2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcyk7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRnJhZ21lbnQsIGVsZW1lbnRzLCBrZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFByb2ZpbGVyLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSB8IFByb2ZpbGVNb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgICBlZmZlY3REdXJhdGlvbjogMCxcbiAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbjogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKE9mZnNjcmVlbkNvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICB2YXIgcHJpbWFyeUNoaWxkSW5zdGFuY2UgPSB7XG4gICAgaXNIaWRkZW46IGZhbHNlXG4gIH07XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjMuMSc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShjdXJyZW50JDEsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgY3VycmVudCQxLCBsYW5lLCBldmVudFRpbWUpO1xuICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgY29udGFpbmVyRmliZXIgPSBjb250YWluZXIuY3VycmVudDtcblxuICBpZiAoIWNvbnRhaW5lckZpYmVyLmNoaWxkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgICAvLyBGbHVzaCB0aGUgZmlyc3Qgc2NoZWR1bGVkIFwidXBkYXRlXCIuXG4gICAgICAgICAgdmFyIGxhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpO1xuICAgICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXNcbiAgICAgICAgLy8gYm91bmRhcnkgc28gdGhhdCB0aGV5IG5leHQgYXR0ZW1wdCBhbHNvIGhhcyBoaWdoZXIgcHJpLlxuXG4gICAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsICYmIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gaGlnaGVyUHJpb3JpdHlMYW5lKHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lLCByZXRyeUxhbmUpO1xuICB9XG59IC8vIEluY3JlYXNlcyB0aGUgcHJpb3JpdHkgb2YgdGhlbmFibGVzIHdoZW4gdGhleSByZXNvbHZlIHdpdGhpbiB0aGlzIGJvdW5kYXJ5LlxuXG5cbmZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSkge1xuICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIH1cblxuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG52YXIgc2hvdWxkRXJyb3JJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBudWxsO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZEVycm9ySW1wbChmaWJlcik7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRFcnJvckhhbmRsZXIgPSBudWxsO1xudmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7XG5cbntcbiAgdmFyIGNvcHlXaXRoRGVsZXRlSW1wbCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIGluZGV4KSB7XG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7XG5cbiAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkodXBkYXRlZCkpIHtcbiAgICAgICAgdXBkYXRlZC5zcGxpY2Uoa2V5LCAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoRGVsZXRlID0gZnVuY3Rpb24gKG9iaiwgcGF0aCkge1xuICAgIHJldHVybiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICB2YXIgb2xkS2V5ID0gb2xkUGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH07XG5cbiAgdmFyIGNvcHlXaXRoU2V0ID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpO1xuICB9O1xuXG4gIHZhciBmaW5kSG9vayA9IGZ1bmN0aW9uIChmaWJlciwgaWQpIHtcbiAgICAvLyBGb3Igbm93LCB0aGUgXCJpZFwiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguXG4gICAgLy8gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUgd2l0aCBlLmcuIG5lc3RlZCBob29rcy5cbiAgICB2YXIgY3VycmVudEhvb2sgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGN1cnJlbnRIb29rICE9PSBudWxsICYmIGlkID4gMCkge1xuICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgaWQtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudEhvb2s7XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci5cblxuXG4gIG92ZXJyaWRlSG9va1N0YXRlID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCwgdmFsdWUpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhTZXQoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoRGVsZXRlKGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBwcm9wcyBmb3IgZnVuY3Rpb24gY29tcG9uZW50cywgZm9yd2FyZFJlZiwgbWVtbywgaG9zdCBjb21wb25lbnRzLCBldGMuXG5cblxuICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoU2V0KGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIHZhbHVlKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhEZWxldGUoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoUmVuYW1lKGZpYmVyLm1lbW9pemVkUHJvcHMsIG9sZFBhdGgsIG5ld1BhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2NoZWR1bGVVcGRhdGUgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgc2V0RXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZEVycm9ySW1wbCkge1xuICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDtcbiAgfTtcblxuICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICBzaG91bGRTdXNwZW5kSW1wbCA9IG5ld1Nob3VsZFN1c3BlbmRJbXBsO1xuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcihmaWJlcikge1xuICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xufVxuXG5mdW5jdGlvbiBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scygpIHtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykge1xuICB2YXIgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgPSBkZXZUb29sc0NvbmZpZy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtcbiAgdmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xuICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHtcbiAgICBidW5kbGVUeXBlOiBkZXZUb29sc0NvbmZpZy5idW5kbGVUeXBlLFxuICAgIHZlcnNpb246IGRldlRvb2xzQ29uZmlnLnZlcnNpb24sXG4gICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSxcbiAgICByZW5kZXJlckNvbmZpZzogZGV2VG9vbHNDb25maWcucmVuZGVyZXJDb25maWcsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGU6IG92ZXJyaWRlSG9va1N0YXRlLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHM6IG92ZXJyaWRlUHJvcHMsXG4gICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLFxuICAgIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOiBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCxcbiAgICBzZXRFcnJvckhhbmRsZXI6IHNldEVycm9ySGFuZGxlcixcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlcixcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG4gICAgY3VycmVudERpc3BhdGNoZXJSZWY6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLFxuICAgIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSB8fCBlbXB0eUZpbmRGaWJlckJ5SG9zdEluc3RhbmNlLFxuICAgIC8vIFJlYWN0IFJlZnJlc2hcbiAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLFxuICAgIHNjaGVkdWxlUmVmcmVzaDogIHNjaGVkdWxlUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSb290OiAgc2NoZWR1bGVSb290ICxcbiAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICxcbiAgICAvLyBFbmFibGVzIERldlRvb2xzIHRvIGFwcGVuZCBvd25lciBzdGFja3MgdG8gZXJyb3IgbWVzc2FnZXMgaW4gREVWIG1vZGUuXG4gICAgZ2V0Q3VycmVudEZpYmVyOiAgZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uXG4gICAgLy8gd2hpY2ggbWF5IG5vdCBtYXRjaCBmb3IgdGhpcmQgcGFydHkgcmVuZGVyZXJzLlxuICAgIHJlY29uY2lsZXJWZXJzaW9uOiBSZWFjdFZlcnNpb25cbiAgfSk7XG59XG5cbi8qIGdsb2JhbCByZXBvcnRFcnJvciAqL1xuXG52YXIgZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvciA9IHR5cGVvZiByZXBvcnRFcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IC8vIEluIG1vZGVybiBicm93c2VycywgcmVwb3J0RXJyb3Igd2lsbCBkaXNwYXRjaCBhbiBlcnJvciBldmVudCxcbi8vIGVtdWxhdGluZyBhbiB1bmNhdWdodCBKYXZhU2NyaXB0IGVycm9yLlxucmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgYW5kIHRlc3QgZW52aXJvbm1lbnRzLCBmYWxsYmFjayB0byBjb25zb2xlLmVycm9yLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpO1xufTtcblxuZnVuY3Rpb24gUmVhY3RET01Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIGNvbnRhaW5lciB0byB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHJvb3QucmVuZGVyKC4uLikuICcgKyBcIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzICcgKyAnb25lIGFyZ3VtZW50LicpO1xuICAgIH1cblxuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoZSAnICsgJ3Jvb3QgY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgXCJyb290LnVubW91bnQoKSB0byBlbXB0eSBhIHJvb3QncyBjb250YWluZXIuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBudWxsLCBudWxsKTtcbn07XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IFJlYWN0RE9NUm9vdC5wcm90b3R5cGUudW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcigndW5tb3VudCguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87XG5cbiAgICB7XG4gICAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgICAgZXJyb3IoJ0F0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5ICcgKyAncmVuZGVyaW5nLiBSZWFjdCBjYW5ub3QgZmluaXNoIHVubW91bnRpbmcgdGhlIHJvb3QgdW50aWwgdGhlICcgKyAnY3VycmVudCByZW5kZXIgaGFzIGNvbXBsZXRlZCwgd2hpY2ggbWF5IGxlYWQgdG8gYSByYWNlIGNvbmRpdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKG51bGwsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuICB2YXIgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG51bGw7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgaWYgKG9wdGlvbnMuaHlkcmF0ZSkge1xuICAgICAgICB3YXJuKCdoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgSlNYIGVsZW1lbnQgdG8gY3JlYXRlUm9vdC4gWW91IHByb2JhYmx5IG1lYW50IHRvICcgKyAnY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiAnICsgJ0V4YW1wbGUgdXNhZ2U6XFxuXFxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xcbicgKyAnICByb290LnJlbmRlcig8QXBwIC8+KTsnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uQ2FsbGJhY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgbnVsbCwgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTtcbn1cblxuZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBpbnRlcm5hbFJvb3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkge1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcXVldWVFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICB9XG59XG5cblJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBzY2hlZHVsZUh5ZHJhdGlvbjtcbmZ1bmN0aW9uIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdoeWRyYXRlUm9vdCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuXG4gIHtcbiAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCdNdXN0IHByb3ZpZGUgaW5pdGlhbCBjaGlsZHJlbiBhcyBzZWNvbmQgYXJndW1lbnQgdG8gaHlkcmF0ZVJvb3QuICcgKyAnRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KScpO1xuICAgIH1cbiAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW5cbiAgLy8gdGhlIGh5ZHJhdGlvbiBjYWxsYmFja3MuXG5cblxuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvblxuXG4gIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsO1xuICB2YXIgaXNTdHJpY3RNb2RlID0gZmFsc2U7XG4gIHZhciBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlID0gZmFsc2U7XG4gIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7XG4gIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnVuc3RhYmxlX3N0cmljdE1vZGUgPT09IHRydWUpIHtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xuICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsgLy8gVGhpcyBjYW4ndCBiZSBhIGNvbW1lbnQgbm9kZSBzaW5jZSBoeWRyYXRpb24gZG9lc24ndCB3b3JrIG9uIGNvbW1lbnQgbm9kZXMgYW55d2F5LlxuXG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG5cbiAgaWYgKG11dGFibGVTb3VyY2VzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTtcbiAgICAgIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTtcbn0gLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hpY2ggYWxzbyBpbmNsdWRlcyBjb21tZW50IG5vZGVzLlxuLy8gV2Ugb25seSB1c2UgaXQgaW4gcGxhY2VzIHRoYXQgYXJlIGN1cnJlbnRseSBtb3JlIHJlbGF4ZWQuXG5cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXJMZWdhY3kobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ2NyZWF0ZVJvb3QoKTogQ3JlYXRpbmcgcm9vdHMgZGlyZWN0bHkgd2l0aCBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgdXNpbmcgYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cblxuICAgIGlmIChpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5yZW5kZXIoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIHRvcExldmVsVXBkYXRlV2FybmluZ3M7XG5cbntcbiAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgJiYgY29udGFpbmVyLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lci5jdXJyZW50KTtcblxuICAgICAgaWYgKGhvc3RJbnN0YW5jZSkge1xuICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogSXQgbG9va3MgbGlrZSB0aGUgUmVhY3QtcmVuZGVyZWQgY29udGVudCBvZiB0aGlzICcgKyAnY29udGFpbmVyIHdhcyByZW1vdmVkIHdpdGhvdXQgdXNpbmcgUmVhY3QuIFRoaXMgaXMgbm90ICcgKyAnc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGVycm9ycy4gSW5zdGVhZCwgY2FsbCAnICsgJ1JlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUgdG8gZW1wdHkgYSBjb250YWluZXIuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCA9ICEhY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xuXG4gICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7XG4gICAgICBlcnJvcigncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcE9uUmVjb3ZlcmFibGVFcnJvcigpIHsvLyBUaGlzIGlzbid0IHJlYWNoYWJsZSBiZWNhdXNlIG9uUmVjb3ZlcmFibGVFcnJvciBpc24ndCBjYWxsZWQgaW4gdGhlXG4gIC8vIGxlZ2FjeSBBUEkuXG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrLCBpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICBpZiAoaXNIeWRyYXRpb25Db250YWluZXIpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xuICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIGNhbGxiYWNrLCBjb250YWluZXIsIExlZ2FjeVJvb3QsIG51bGwsIC8vIGh5ZHJhdGlvbkNhbGxiYWNrc1xuICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGVcbiAgICBmYWxzZSwgLy8gY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSxcbiAgICAnJywgLy8gaWRlbnRpZmllclByZWZpeFxuICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpO1xuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gcm9vdDtcbiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTtcbiAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICBmbHVzaFN5bmMoKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cbiAgICB2YXIgcm9vdFNpYmxpbmc7XG5cbiAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQocm9vdFNpYmxpbmcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKF9yb290KTtcblxuICAgICAgICBfb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG5cbiAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IF9yb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3QoX3Jvb3QuY3VycmVudCwgY29udGFpbmVyKTtcblxuICAgIHZhciBfcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuXG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoX3Jvb3RDb250YWluZXJFbGVtZW50KTsgLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHJldHVybiBfcm9vdDtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgY2hpbGRyZW4sIGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlLCBjYWxsYmFjaykge1xuICB7XG4gICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpO1xuICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2ssICdyZW5kZXInKTtcbiAgfVxuXG4gIHZhciBtYXliZVJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgdmFyIHJvb3Q7XG5cbiAgaWYgKCFtYXliZVJvb3QpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgcm9vdCA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGZvcmNlSHlkcmF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdCA9IG1heWJlUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpO1xufVxuXG52YXIgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0RmluZERPTU5vZGUgPSB0cnVlO1xuXG4gICAgICBlcnJvcignZmluZERPTU5vZGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yICcgKyAncmVsZWFzZS4gSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50ICcgKyAndG8gcmVmZXJlbmNlLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScpO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciB3YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXI7XG5cbiAgICAgIGlmICghd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB7XG4gICAgcmV0dXJuIGZpbmRIb3N0SW5zdGFuY2VXaXRoV2FybmluZyhjb21wb25lbnRPckVsZW1lbnQsICdmaW5kRE9NTm9kZScpO1xuICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLnJlbmRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIFJlYWN0IDE4LiBVc2UgY3JlYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyBcImlmIGl0J3MgcnVubmluZyBSZWFjdCAxNy4gTGVhcm4gXCIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnaW4gUmVhY3QgMTguIENvbnNpZGVyIHVzaW5nIGEgcG9ydGFsIGluc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gJyArIFwidGhlIGNyZWF0ZVJvb3QgQVBJLCB5b3VyIGFwcCB3aWxsIGJlaGF2ZSBhcyBpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgXCIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpO1xuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKTtcbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG52YXIgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGZhbHNlO1xuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpIHtcbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSkge1xuICAgICAgZGlkV2FybkFib3V0VW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHRydWU7XG5cbiAgICAgIGVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgJyArICduZXh0IG1ham9yIHJlbGVhc2UuIFN3aXRjaCB0byB0aGUgY3JlYXRlUm9vdCBBUEkuIExlYXJuICcgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG51bGwsIGNvbnRhaW5lciwgZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYGRlbGV0ZSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcmBcbiAgICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBudWxsO1xuICAgICAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgIH0pOyAvLyBJZiB5b3UgY2FsbCB1bm1vdW50Q29tcG9uZW50QXROb2RlIHR3aWNlIGluIHF1aWNrIHN1Y2Nlc3Npb24sIHlvdSdsbFxuICAgIC8vIGdldCBgdHJ1ZWAgdHdpY2UuIFRoYXQncyBwcm9iYWJseSBmaW5lP1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgdmFyIF9yb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcblxuICAgICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEoX3Jvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKF9yb290RWwpKTsgLy8gQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpdHNlbGYgaXMgYSBSZWFjdCByb290IG5vZGUuXG5cbiAgICAgIHZhciBpc0NvbnRhaW5lclJlYWN0Um9vdCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyLnBhcmVudE5vZGUpICYmICEhY29udGFpbmVyLnBhcmVudE5vZGUuX3JlYWN0Um9vdENvbnRhaW5lcjtcblxuICAgICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkKSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnNldEF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbihhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHJ1bldpdGhQcmlvcml0eSk7XG5cbntcbiAgaWYgKHR5cGVvZiBNYXAgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBNYXAgaGFzIG5vIHByb3RvdHlwZVxuICBNYXAucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIE1hcC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0ICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgU2V0IGhhcyBubyBwcm90b3R5cGVcbiAgU2V0LnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmNsZWFyICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICBlcnJvcignUmVhY3QgZGVwZW5kcyBvbiBNYXAgYW5kIFNldCBidWlsdC1pbiB0eXBlcy4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzJyk7XG4gIH1cbn1cblxuc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyk7XG5zZXRCYXRjaGluZ0ltcGxlbWVudGF0aW9uKGJhdGNoZWRVcGRhdGVzJDEsIGRpc2NyZXRlVXBkYXRlcywgZmx1c2hTeW5jKTtcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lcikge1xuICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICByZXR1cm4gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjayk7XG59XG5cbnZhciBJbnRlcm5hbHMgPSB7XG4gIHVzaW5nQ2xpZW50RW50cnlQb2ludDogZmFsc2UsXG4gIC8vIEtlZXAgaW4gc3luYyB3aXRoIFJlYWN0VGVzdFV0aWxzLmpzLlxuICAvLyBUaGlzIGlzIGFuIGFycmF5IGZvciBiZXR0ZXIgbWluaWZpY2F0aW9uLlxuICBFdmVudHM6IFtnZXRJbnN0YW5jZUZyb21Ob2RlLCBnZXROb2RlRnJvbUluc3RhbmNlLCBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlLCBlbnF1ZXVlU3RhdGVSZXN0b3JlLCByZXN0b3JlU3RhdGVJZk5lZWRlZCwgYmF0Y2hlZFVwZGF0ZXMkMV1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QkMShjb250YWluZXIsIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBjcmVhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlUm9vdCQxKGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgaHlkcmF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlUm9vdChjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucyk7XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jJDEoZm4pIHtcbiAge1xuICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmx1c2hTeW5jKGZuKTtcbn1cbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuY3JlYXRlUm9vdCA9IGNyZWF0ZVJvb3QkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jJDE7XG5leHBvcnRzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGh5ZHJhdGVSb290JDE7XG5leHBvcnRzLnJlbmRlciA9IHJlbmRlcjtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IHVubW91bnRDb21wb25lbnRBdE5vZGU7XG5leHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gYmF0Y2hlZFVwZGF0ZXMkMTtcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIgPSByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20uZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBtID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBtLmNyZWF0ZVJvb3Q7XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBtLmh5ZHJhdGVSb290O1xufSBlbHNlIHtcbiAgdmFyIGkgPSBtLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbihjLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5jcmVhdGVSb290KGMsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIGgsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmh5ZHJhdGVSb290KGMsIGgsIG8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiB1c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAgIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUkMihzdWJzY3JpYmUsIGdldFNuYXBzaG90KSB7XG4gICAgICBkaWRXYXJuT2xkMThBbHBoYSB8fFxuICAgICAgICB2b2lkIDAgPT09IFJlYWN0LnN0YXJ0VHJhbnNpdGlvbiB8fFxuICAgICAgICAoKGRpZFdhcm5PbGQxOEFscGhhID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiWW91IGFyZSB1c2luZyBhbiBvdXRkYXRlZCwgcHJlLXJlbGVhc2UgYWxwaGEgb2YgUmVhY3QgMTggdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHVzZVN5bmNFeHRlcm5hbFN0b3JlLiBUaGUgdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUgc2hpbSB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4gVXBncmFkZSB0byBhIG5ld2VyIHByZS1yZWxlYXNlLlwiXG4gICAgICAgICkpO1xuICAgICAgdmFyIHZhbHVlID0gZ2V0U25hcHNob3QoKTtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgdmFyIGNhY2hlZFZhbHVlID0gZ2V0U25hcHNob3QoKTtcbiAgICAgICAgb2JqZWN0SXModmFsdWUsIGNhY2hlZFZhbHVlKSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMCkpO1xuICAgICAgfVxuICAgICAgY2FjaGVkVmFsdWUgPSB1c2VTdGF0ZSh7XG4gICAgICAgIGluc3Q6IHsgdmFsdWU6IHZhbHVlLCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfVxuICAgICAgfSk7XG4gICAgICB2YXIgaW5zdCA9IGNhY2hlZFZhbHVlWzBdLmluc3QsXG4gICAgICAgIGZvcmNlVXBkYXRlID0gY2FjaGVkVmFsdWVbMV07XG4gICAgICB1c2VMYXlvdXRFZmZlY3QoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90O1xuICAgICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgICB9LFxuICAgICAgICBbc3Vic2NyaWJlLCB2YWx1ZSwgZ2V0U25hcHNob3RdXG4gICAgICApO1xuICAgICAgdXNlRWZmZWN0KFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVVwZGF0ZSh7IGluc3Q6IGluc3QgfSk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgW3N1YnNjcmliZV1cbiAgICAgICk7XG4gICAgICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICAgICAgaW5zdCA9IGluc3QudmFsdWU7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTtcbiAgICAgICAgcmV0dXJuICFvYmplY3RJcyhpbnN0LCBuZXh0VmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgICAgIHJldHVybiBnZXRTbmFwc2hvdCgpO1xuICAgIH1cbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0ICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0YXJ0KEVycm9yKCkpO1xuICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgICAgIG9iamVjdElzID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogaXMsXG4gICAgICB1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlLFxuICAgICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0ID0gUmVhY3QudXNlTGF5b3V0RWZmZWN0LFxuICAgICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWUsXG4gICAgICBkaWRXYXJuT2xkMThBbHBoYSA9ICExLFxuICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMSxcbiAgICAgIHNoaW0gPVxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93IHx8XG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICAgICAgICAgPyB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQxXG4gICAgICAgICAgOiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyO1xuICAgIGV4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmUgPVxuICAgICAgdm9pZCAwICE9PSBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZSA/IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlIDogc2hpbTtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0ucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cInByb2R1Y3Rpb25cIiAhPT0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgJiZcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgICByZXR1cm4gKHggPT09IHkgJiYgKDAgIT09IHggfHwgMSAvIHggPT09IDEgLyB5KSkgfHwgKHggIT09IHggJiYgeSAhPT0geSk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpLFxuICAgICAgc2hpbSA9IHJlcXVpcmUoXCJ1c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltXCIpLFxuICAgICAgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlID0gc2hpbS51c2VTeW5jRXh0ZXJuYWxTdG9yZSxcbiAgICAgIHVzZVJlZiA9IFJlYWN0LnVzZVJlZixcbiAgICAgIHVzZUVmZmVjdCA9IFJlYWN0LnVzZUVmZmVjdCxcbiAgICAgIHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vLFxuICAgICAgdXNlRGVidWdWYWx1ZSA9IFJlYWN0LnVzZURlYnVnVmFsdWU7XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciA9IGZ1bmN0aW9uIChcbiAgICAgIHN1YnNjcmliZSxcbiAgICAgIGdldFNuYXBzaG90LFxuICAgICAgZ2V0U2VydmVyU25hcHNob3QsXG4gICAgICBzZWxlY3RvcixcbiAgICAgIGlzRXF1YWxcbiAgICApIHtcbiAgICAgIHZhciBpbnN0UmVmID0gdXNlUmVmKG51bGwpO1xuICAgICAgaWYgKG51bGwgPT09IGluc3RSZWYuY3VycmVudCkge1xuICAgICAgICB2YXIgaW5zdCA9IHsgaGFzVmFsdWU6ICExLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgICBpbnN0UmVmLmN1cnJlbnQgPSBpbnN0O1xuICAgICAgfSBlbHNlIGluc3QgPSBpbnN0UmVmLmN1cnJlbnQ7XG4gICAgICBpbnN0UmVmID0gdXNlTWVtbyhcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZ1bmN0aW9uIG1lbW9pemVkU2VsZWN0b3IobmV4dFNuYXBzaG90KSB7XG4gICAgICAgICAgICBpZiAoIWhhc01lbW8pIHtcbiAgICAgICAgICAgICAgaGFzTWVtbyA9ICEwO1xuICAgICAgICAgICAgICBtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90O1xuICAgICAgICAgICAgICBuZXh0U25hcHNob3QgPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBpc0VxdWFsICYmIGluc3QuaGFzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGluc3QudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwoY3VycmVudFNlbGVjdGlvbiwgbmV4dFNuYXBzaG90KSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNuYXBzaG90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBtZW1vaXplZFNlbGVjdGlvbjtcbiAgICAgICAgICAgIGlmIChvYmplY3RJcyhtZW1vaXplZFNuYXBzaG90LCBuZXh0U25hcHNob3QpKVxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgIHZhciBuZXh0U2VsZWN0aW9uID0gc2VsZWN0b3IobmV4dFNuYXBzaG90KTtcbiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBuZXh0U2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNuYXBzaG90ID0gbmV4dFNuYXBzaG90KSwgY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU2VsZWN0aW9uID0gbmV4dFNlbGVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBoYXNNZW1vID0gITEsXG4gICAgICAgICAgICBtZW1vaXplZFNuYXBzaG90LFxuICAgICAgICAgICAgbWVtb2l6ZWRTZWxlY3Rpb24sXG4gICAgICAgICAgICBtYXliZUdldFNlcnZlclNuYXBzaG90ID1cbiAgICAgICAgICAgICAgdm9pZCAwID09PSBnZXRTZXJ2ZXJTbmFwc2hvdCA/IG51bGwgOiBnZXRTZXJ2ZXJTbmFwc2hvdDtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihnZXRTbmFwc2hvdCgpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudWxsID09PSBtYXliZUdldFNlcnZlclNuYXBzaG90XG4gICAgICAgICAgICAgID8gdm9pZCAwXG4gICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbW9pemVkU2VsZWN0b3IobWF5YmVHZXRTZXJ2ZXJTbmFwc2hvdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfSxcbiAgICAgICAgW2dldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCwgc2VsZWN0b3IsIGlzRXF1YWxdXG4gICAgICApO1xuICAgICAgdmFyIHZhbHVlID0gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBpbnN0UmVmWzBdLCBpbnN0UmVmWzFdKTtcbiAgICAgIHVzZUVmZmVjdChcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGluc3QuaGFzVmFsdWUgPSAhMDtcbiAgICAgICAgICBpbnN0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIFt2YWx1ZV1cbiAgICAgICk7XG4gICAgICB1c2VEZWJ1Z1ZhbHVlKHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vY2pzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0vd2l0aC1zZWxlY3Rvci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVDbGVhcjtcbiIsICIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsICJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgZGF0YS5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gIH1cbiAgLS10aGlzLnNpemU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZURlbGV0ZTtcbiIsICJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICArK3RoaXMuc2l6ZTtcbiAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZVNldDtcbiIsICJ2YXIgbGlzdENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVDbGVhcicpLFxuICAgIGxpc3RDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZURlbGV0ZScpLFxuICAgIGxpc3RDYWNoZUdldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUdldCcpLFxuICAgIGxpc3RDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUhhcycpLFxuICAgIGxpc3RDYWNoZVNldCA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuTGlzdENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBsaXN0Q2FjaGVEZWxldGU7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuTGlzdENhY2hlLnByb3RvdHlwZS5zZXQgPSBsaXN0Q2FjaGVTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gTGlzdENhY2hlO1xuIiwgInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0NsZWFyO1xuIiwgIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsICIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tHZXQ7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0hhcztcbiIsICIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCAidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGdW5jdGlvbjtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwgInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNvdXJjZSBjb2RlLlxuICovXG5mdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gIGlmIChmdW5jICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1NvdXJjZTtcbiIsICJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwgIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwgInZhciBiYXNlSXNOYXRpdmUgPSByZXF1aXJlKCcuL19iYXNlSXNOYXRpdmUnKSxcbiAgICBnZXRWYWx1ZSA9IHJlcXVpcmUoJy4vX2dldFZhbHVlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsICJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsICIvKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hEZWxldGU7XG4iLCAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEdldDtcbiIsICJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuIiwgInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBoYXNoIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaFNldDtcbiIsICJ2YXIgaGFzaENsZWFyID0gcmVxdWlyZSgnLi9faGFzaENsZWFyJyksXG4gICAgaGFzaERlbGV0ZSA9IHJlcXVpcmUoJy4vX2hhc2hEZWxldGUnKSxcbiAgICBoYXNoR2V0ID0gcmVxdWlyZSgnLi9faGFzaEdldCcpLFxuICAgIGhhc2hIYXMgPSByZXF1aXJlKCcuL19oYXNoSGFzJyksXG4gICAgaGFzaFNldCA9IHJlcXVpcmUoJy4vX2hhc2hTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcbiIsICJ2YXIgSGFzaCA9IHJlcXVpcmUoJy4vX0hhc2gnKSxcbiAgICBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5fX2RhdGFfXyA9IHtcbiAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICdzdHJpbmcnOiBuZXcgSGFzaFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlQ2xlYXI7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsICJ2YXIgaXNLZXlhYmxlID0gcmVxdWlyZSgnLi9faXNLZXlhYmxlJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXBEYXRhO1xuIiwgInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZURlbGV0ZTtcbiIsICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwgInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlSGFzO1xuIiwgInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCAidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcbiIsICJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsICJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgc3RhY2tDbGVhciA9IHJlcXVpcmUoJy4vX3N0YWNrQ2xlYXInKSxcbiAgICBzdGFja0RlbGV0ZSA9IHJlcXVpcmUoJy4vX3N0YWNrRGVsZXRlJyksXG4gICAgc3RhY2tHZXQgPSByZXF1aXJlKCcuL19zdGFja0dldCcpLFxuICAgIHN0YWNrSGFzID0gcmVxdWlyZSgnLi9fc3RhY2tIYXMnKSxcbiAgICBzdGFja1NldCA9IHJlcXVpcmUoJy4vX3N0YWNrU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxubW9kdWxlLmV4cG9ydHMgPSBTdGFjaztcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlFYWNoO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iLCAidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduVmFsdWU7XG4iLCAidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnblZhbHVlO1xuIiwgInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyk7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29waWVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPYmplY3Qoc291cmNlLCBwcm9wcywgb2JqZWN0LCBjdXN0b21pemVyKSB7XG4gIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcblxuICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlPYmplY3Q7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcmd1bWVudHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqL1xuZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzQXJndW1lbnRzO1xuIiwgInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwgIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViRmFsc2U7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwgIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwgIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0xlbmd0aCgzKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aCgnMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0xlbmd0aDtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuYXJ5O1xuIiwgInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vZGVVdGlsO1xuIiwgInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwgInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsICIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCAiLyoqXG4gKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlckFyZztcbiIsICJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCAidmFyIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5cycpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXM7XG4iLCAidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCAidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzO1xuIiwgInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ247XG4iLCAiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5c0luO1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgbmF0aXZlS2V5c0luID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgfVxuICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICByZXN1bHQgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXNJbjtcbiIsICJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5c0luID0gcmVxdWlyZSgnLi9fYmFzZUtleXNJbicpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzSW4obmV3IEZvbyk7XG4gKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqL1xuZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzSW47XG4iLCAidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25JbjtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mICBgYnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gIGlmIChpc0RlZXApIHtcbiAgICByZXR1cm4gYnVmZmVyLnNsaWNlKCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBhbGxvY1Vuc2FmZSA/IGFsbG9jVW5zYWZlKGxlbmd0aCkgOiBuZXcgYnVmZmVyLmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUJ1ZmZlcjtcbiIsICIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5QXJyYXk7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmlsdGVyO1xuIiwgIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIiwgInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgc3R1YkFycmF5ID0gcmVxdWlyZSgnLi9zdHViQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUdldFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHJldHVybiBhcnJheUZpbHRlcihuYXRpdmVHZXRTeW1ib2xzKG9iamVjdCksIGZ1bmN0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHM7XG4iLCAidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzO1xuIiwgIi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVB1c2g7XG4iLCAidmFyIG92ZXJBcmcgPSByZXF1aXJlKCcuL19vdmVyQXJnJyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFByb3RvdHlwZTtcbiIsICJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChvYmplY3QpIHtcbiAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpO1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFN5bWJvbHNJbjtcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzSW4nKTtcblxuLyoqXG4gKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW1ib2xzSW47XG4iLCAidmFyIGFycmF5UHVzaCA9IHJlcXVpcmUoJy4vX2FycmF5UHVzaCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykge1xuICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRBbGxLZXlzO1xuIiwgInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9scyA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5cztcbiIsICJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWxsS2V5c0luO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgRGF0YVZpZXcgPSBnZXROYXRpdmUocm9vdCwgJ0RhdGFWaWV3Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVZpZXc7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFNldCA9IGdldE5hdGl2ZShyb290LCAnU2V0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgV2Vha01hcCA9IGdldE5hdGl2ZShyb290LCAnV2Vha01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7XG4iLCAidmFyIERhdGFWaWV3ID0gcmVxdWlyZSgnLi9fRGF0YVZpZXcnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBQcm9taXNlID0gcmVxdWlyZSgnLi9fUHJvbWlzZScpLFxuICAgIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIFdlYWtNYXAgPSByZXF1aXJlKCcuL19XZWFrTWFwJyksXG4gICAgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICBwcm9taXNlVGFnID0gJ1tvYmplY3QgUHJvbWlzZV0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG52YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxuICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBgdG9TdHJpbmdUYWdgIG9mIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xudmFyIGdldFRhZyA9IGJhc2VHZXRUYWc7XG5cbi8vIEZhbGxiYWNrIGZvciBkYXRhIHZpZXdzLCBtYXBzLCBzZXRzLCBhbmQgd2VhayBtYXBzIGluIElFIDExIGFuZCBwcm9taXNlcyBpbiBOb2RlLmpzIDwgNi5cbmlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8XG4gICAgKFByb21pc2UgJiYgZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fFxuICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7XG4gIGdldFRhZyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7XG5cbiAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgc3dpdGNoIChjdG9yU3RyaW5nKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOiByZXR1cm4gZGF0YVZpZXdUYWc7XG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7XG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZztcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGFnO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLlxuICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgIHJlc3VsdC5pbnB1dCA9IGFycmF5LmlucHV0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQXJyYXk7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsICJ2YXIgVWludDhBcnJheSA9IHJlcXVpcmUoJy4vX1VpbnQ4QXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpO1xuICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQXJyYXlCdWZmZXI7XG4iLCAidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBkYXRhVmlld2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhVmlldyBUaGUgZGF0YSB2aWV3IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICByZXR1cm4gbmV3IGRhdGFWaWV3LmNvbnN0cnVjdG9yKGJ1ZmZlciwgZGF0YVZpZXcuYnl0ZU9mZnNldCwgZGF0YVZpZXcuYnl0ZUxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVEYXRhVmlldztcbiIsICIvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUZsYWdzID0gL1xcdyokLztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gKi9cbmZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lUmVnRXhwO1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lU3ltYm9sO1xuIiwgInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gIHJldHVybiBuZXcgdHlwZWRBcnJheS5jb25zdHJ1Y3RvcihidWZmZXIsIHR5cGVkQXJyYXkuYnl0ZU9mZnNldCwgdHlwZWRBcnJheS5sZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lVHlwZWRBcnJheTtcbiIsICJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKSxcbiAgICBjbG9uZURhdGFWaWV3ID0gcmVxdWlyZSgnLi9fY2xvbmVEYXRhVmlldycpLFxuICAgIGNsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKSxcbiAgICBjbG9uZVN5bWJvbCA9IHJlcXVpcmUoJy4vX2Nsb25lU3ltYm9sJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5Jyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNsb25pbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtcblxuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzpcbiAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgY2FzZSB1aW50OFRhZzogY2FzZSB1aW50OENsYW1wZWRUYWc6IGNhc2UgdWludDE2VGFnOiBjYXNlIHVpbnQzMlRhZzpcbiAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgY2FzZSBtYXBUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpO1xuXG4gICAgY2FzZSByZWdleHBUYWc6XG4gICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZUJ5VGFnO1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xudmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIG9iamVjdCgpIHt9XG4gIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgIHJldHVybiBvYmplY3RDcmVhdGUocHJvdG8pO1xuICAgIH1cbiAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQ3JlYXRlO1xuIiwgInZhciBiYXNlQ3JlYXRlID0gcmVxdWlyZSgnLi9fYmFzZUNyZWF0ZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICovXG5mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSlcbiAgICA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRDbG9uZU9iamVjdDtcbiIsICJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBtYXBUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWFwO1xuIiwgInZhciBiYXNlSXNNYXAgPSByZXF1aXJlKCcuL19iYXNlSXNNYXAnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBNYXBgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTWFwKG5ldyBNYXApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXA7XG4iLCAidmFyIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gc2V0VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc1NldDtcbiIsICJ2YXIgYmFzZUlzU2V0ID0gcmVxdWlyZSgnLi9fYmFzZUlzU2V0JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1NldChuZXcgU2V0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU2V0O1xuIiwgInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VBc3NpZ24gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduJyksXG4gICAgYmFzZUFzc2lnbkluID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnbkluJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGNvcHlTeW1ib2xzID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHMnKSxcbiAgICBjb3B5U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fY29weVN5bWJvbHNJbicpLFxuICAgIGdldEFsbEtleXMgPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzJyksXG4gICAgZ2V0QWxsS2V5c0luID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5c0luJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaW5pdENsb25lQXJyYXkgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVBcnJheScpLFxuICAgIGluaXRDbG9uZUJ5VGFnID0gcmVxdWlyZSgnLi9faW5pdENsb25lQnlUYWcnKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNNYXAgPSByZXF1aXJlKCcuL2lzTWFwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTZXQgPSByZXF1aXJlKCcuL2lzU2V0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICBmbG9hdDMyVGFnID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICBpbnQxNlRhZyA9ICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICB1aW50OENsYW1wZWRUYWcgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbnZhciBjbG9uZWFibGVUYWdzID0ge307XG5jbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG5jbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG5jbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbmNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG5jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG5jbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIGFuZCBgXy5jbG9uZURlZXBgIHdoaWNoIHRyYWNrc1xuICogdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBEZWVwIGNsb25lXG4gKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY2xvbmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgdGhlaXIgY2xvbmUgY291bnRlcnBhcnRzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUNsb25lKHZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2spIHtcbiAgdmFyIHJlc3VsdCxcbiAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICBpc0ZsYXQgPSBiaXRtYXNrICYgQ0xPTkVfRkxBVF9GTEFHLFxuICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICBpZiAoY3VzdG9taXplcikge1xuICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgfVxuICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNBcnIpIHtcbiAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgaWYgKCFpc0RlZXApIHtcbiAgICAgIHJldHVybiBjb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLFxuICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNsb25lQnVmZmVyKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cbiAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICByZXN1bHQgPSAoaXNGbGF0IHx8IGlzRnVuYykgPyB7fSA6IGluaXRDbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgPyBjb3B5U3ltYm9sc0luKHZhbHVlLCBiYXNlQXNzaWduSW4ocmVzdWx0LCB2YWx1ZSkpXG4gICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpO1xuICBpZiAoc3RhY2tlZCkge1xuICAgIHJldHVybiBzdGFja2VkO1xuICB9XG4gIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkge1xuICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICA/IChpc0ZsYXQgPyBnZXRBbGxLZXlzSW4gOiBnZXRBbGxLZXlzKVxuICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDbG9uZTtcbiIsICJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcyxcbiAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2hcbiAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAqIEBzZWUgXy5jbG9uZURlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07XG4gKlxuICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7XG4gIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG4iLCAiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29uc3RhbnQ7XG4iLCAiLyoqXG4gKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUZvcjtcbiIsICJ2YXIgY3JlYXRlQmFzZUZvciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VGb3InKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbnZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3I7XG4iLCAidmFyIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93bmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvck93bjtcbiIsICJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQmFzZUVhY2g7XG4iLCAidmFyIGJhc2VGb3JPd24gPSByZXF1aXJlKCcuL19iYXNlRm9yT3duJyksXG4gICAgY3JlYXRlQmFzZUVhY2ggPSByZXF1aXJlKCcuL19jcmVhdGVCYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICovXG52YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRWFjaDtcbiIsICIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlkZW50aXR5O1xuIiwgInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0RnVuY3Rpb247XG4iLCAidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBjYXN0RnVuY3Rpb24gPSByZXF1aXJlKCcuL19jYXN0RnVuY3Rpb24nKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LlxuICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAqIG9yIGBfLmZvck93bmAgZm9yIG9iamVjdCBpdGVyYXRpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGFsaWFzIGVhY2hcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICogQHNlZSBfLmZvckVhY2hSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICpcbiAqIF8uZm9yRWFjaCh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAqICAgY29uc29sZS5sb2coa2V5KTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFYWNoIDogYmFzZUVhY2g7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGNhc3RGdW5jdGlvbihpdGVyYXRlZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2g7XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZvckVhY2gnKTtcbiIsICJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZpbHRlcjtcbiIsICIvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgYWRkXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBhbGlhcyBwdXNoXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUFkZDtcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVIYXM7XG4iLCAidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKSxcbiAgICBzZXRDYWNoZUFkZCA9IHJlcXVpcmUoJy4vX3NldENhY2hlQWRkJyksXG4gICAgc2V0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19zZXRDYWNoZUhhcycpO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICByZXR1cm4gY2FjaGUuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FjaGVIYXM7XG4iLCAidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheVNvbWUgPSByZXF1aXJlKCcuL19hcnJheVNvbWUnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNQYXJ0aWFsICYmIG90aExlbmd0aCA+IGFyckxlbmd0aCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIGFyclN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChhcnJTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gYXJyU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IGFycmF5O1xuICB9XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gIHN0YWNrLnNldChhcnJheSwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb21wYXJlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKHNlZW4pIHtcbiAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmXG4gICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSB7XG4gICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8XG4gICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEFycmF5cztcbiIsICIvKipcbiAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcFRvQXJyYXk7XG4iLCAiLyoqXG4gKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb0FycmF5O1xuIiwgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBtYXBUb0FycmF5ID0gcmVxdWlyZSgnLi9fbWFwVG9BcnJheScpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZztcbiIsICJ2YXIgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLFxuICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hlY2sgdGhhdCBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAob2JqU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHRydWU7XG4gIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDtcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcbiAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTtcblxuICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChvYmpWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKG9ialZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKVxuICAgICAgICAgIDogY29tcGFyZWRcbiAgICAgICAgKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xuICB9XG4gIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxPYmplY3RzO1xuIiwgInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIGVxdWFsQnlUYWcgPSByZXF1aXJlKCcuL19lcXVhbEJ5VGFnJyksXG4gICAgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9fZXF1YWxPYmplY3RzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsRGVlcDtcbiIsICJ2YXIgYmFzZUlzRXF1YWxEZWVwID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWxEZWVwJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzRXF1YWw7XG4iLCAidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICFsZW5ndGg7XG4gIH1cbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgPyBkYXRhWzFdICE9PSBvYmplY3RbZGF0YVswXV1cbiAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc01hdGNoO1xuIiwgInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsICJ2YXIgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgdmFyIGtleSA9IHJlc3VsdFtsZW5ndGhdLFxuICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXRjaERhdGE7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYG1hdGNoZXNQcm9wZXJ0eWAgZm9yIHNvdXJjZSB2YWx1ZXMgc3VpdGFibGVcbiAqIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZSAmJlxuICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlO1xuIiwgInZhciBiYXNlSXNNYXRjaCA9IHJlcXVpcmUoJy4vX2Jhc2VJc01hdGNoJyksXG4gICAgZ2V0TWF0Y2hEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWF0Y2hEYXRhJyksXG4gICAgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlcztcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCAidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuIiwgInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwgInZhciBtZW1vaXplID0gcmVxdWlyZSgnLi9tZW1vaXplJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbnZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tZW1vaXplYCB3aGljaCBjbGVhcnMgdGhlIG1lbW9pemVkIGZ1bmN0aW9uJ3NcbiAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHtcbiAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH0pO1xuXG4gIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplQ2FwcGVkO1xuIiwgInZhciBtZW1vaXplQ2FwcGVkID0gcmVxdWlyZSgnLi9fbWVtb2l6ZUNhcHBlZCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgcmVzdWx0LnB1c2goJycpO1xuICB9XG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaW5nVG9QYXRoO1xuIiwgIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlNYXA7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDA7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICByZXR1cm4gYXJyYXlNYXAodmFsdWUsIGJhc2VUb1N0cmluZykgKyAnJztcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN5bWJvbFRvU3RyaW5nID8gc3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRvU3RyaW5nO1xuIiwgInZhciBiYXNlVG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlVG9TdHJpbmcnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICogYW5kIGB1bmRlZmluZWRgIHZhbHVlcy4gVGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvU3RyaW5nKG51bGwpO1xuICogLy8gPT4gJydcbiAqXG4gKiBfLnRvU3RyaW5nKC0wKTtcbiAqIC8vID0+ICctMCdcbiAqXG4gKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAnMSwyLDMnXG4gKi9cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU3RyaW5nO1xuIiwgInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwgInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9LZXk7XG4iLCAidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcbiIsICJ2YXIgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpc1xuICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7XG4gKiAvLyA9PiAnZGVmYXVsdCdcbiAqL1xuZnVuY3Rpb24gZ2V0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldDtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzSW47XG4iLCAidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBmYWxzZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSk7XG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gIH1cbiAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc1BhdGg7XG4iLCAidmFyIGJhc2VIYXNJbiA9IHJlcXVpcmUoJy4vX2Jhc2VIYXNJbicpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNJbjtcbiIsICJ2YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbCcpLFxuICAgIGdldCA9IHJlcXVpcmUoJy4vZ2V0JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIGlzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX2lzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVByb3BlcnR5O1xuIiwgInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVByb3BlcnR5YCB3aGljaCBzdXBwb3J0cyBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocGF0aCkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHlEZWVwO1xuIiwgInZhciBiYXNlUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHknKSxcbiAgICBiYXNlUHJvcGVydHlEZWVwID0gcmVxdWlyZSgnLi9fYmFzZVByb3BlcnR5RGVlcCcpLFxuICAgIGlzS2V5ID0gcmVxdWlyZSgnLi9faXNLZXknKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW1xuICogICB7ICdhJzogeyAnYic6IDIgfSB9LFxuICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gKiBdO1xuICpcbiAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAqIC8vID0+IFsyLCAxXVxuICpcbiAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqL1xuZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwcm9wZXJ0eTtcbiIsICJ2YXIgYmFzZU1hdGNoZXMgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlcycpLFxuICAgIGJhc2VNYXRjaGVzUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlTWF0Y2hlc1Byb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIHByb3BlcnR5ID0gcmVxdWlyZSgnLi9wcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJdGVyYXRlZTtcbiIsICJ2YXIgYXJyYXlGaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheUZpbHRlcicpLFxuICAgIGJhc2VGaWx0ZXIgPSByZXF1aXJlKCcuL19iYXNlRmlsdGVyJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSGFzO1xuIiwgInZhciBiYXNlSGFzID0gcmVxdWlyZSgnLi9fYmFzZUhhcycpLFxuICAgIGhhc1BhdGggPSByZXF1aXJlKCcuL19oYXNQYXRoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG90aGVyLCAnYScpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcztcbiIsICJ2YXIgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1Byb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2lzUHJvdG90eXBlJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VtcHR5O1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1VuZGVmaW5lZDtcbiIsICJ2YXIgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXA7XG4iLCAidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XVxuICpcbiAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAqL1xuZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwO1xuIiwgIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVJlZHVjZTtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlZHVjZTtcbiIsICJ2YXIgYXJyYXlSZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheVJlZHVjZScpLFxuICAgIGJhc2VFYWNoID0gcmVxdWlyZSgnLi9fYmFzZUVhY2gnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlUmVkdWNlID0gcmVxdWlyZSgnLi9fYmFzZVJlZHVjZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZVxuICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6XG4gKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICogYW5kIGBzb3J0QnlgXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQHNlZSBfLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7XG4gKiAgIHJldHVybiBzdW0gKyBuO1xuICogfSwgMCk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpO1xuICogICByZXR1cm4gcmVzdWx0O1xuICogfSwge30pO1xuICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlIDogYmFzZVJlZHVjZSxcbiAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2U7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3RyaW5nKDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwgInZhciBiYXNlUHJvcGVydHkgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHknKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG52YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc2NpaVNpemU7XG4iLCAiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xudmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzVW5pY29kZTtcbiIsICIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJyxcbiAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgcnNTdXJyUGFpciA9ICdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLFxuICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xudmFyIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4vKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xudmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG5mdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwO1xuICB3aGlsZSAocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkge1xuICAgICsrcmVzdWx0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZVNpemU7XG4iLCAidmFyIGFzY2lpU2l6ZSA9IHJlcXVpcmUoJy4vX2FzY2lpU2l6ZScpLFxuICAgIGhhc1VuaWNvZGUgPSByZXF1aXJlKCcuL19oYXNVbmljb2RlJyksXG4gICAgdW5pY29kZVNpemUgPSByZXF1aXJlKCcuL191bmljb2RlU2l6ZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICovXG5mdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpXG4gICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdTaXplO1xuIiwgInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNTdHJpbmcgPSByZXF1aXJlKCcuL2lzU3RyaW5nJyksXG4gICAgc3RyaW5nU2l6ZSA9IHJlcXVpcmUoJy4vX3N0cmluZ1NpemUnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gIGJ5IHJldHVybmluZyBpdHMgbGVuZ3RoIGZvciBhcnJheS1saWtlXG4gKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICogLy8gPT4gMlxuICpcbiAqIF8uc2l6ZSgncGViYmxlcycpO1xuICogLy8gPT4gN1xuICovXG5mdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKGNvbGxlY3Rpb24pO1xuICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgfVxuICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNpemU7XG4iLCAidmFyIGFycmF5RWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5RWFjaCcpLFxuICAgIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gKiB9LCBbXSk7XG4gKiAvLyA9PiBbNCwgOV1cbiAqXG4gKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICB9XG4gIH1cbiAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmFuc2Zvcm07XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZmxhdHRlbmFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpIHx8XG4gICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGbGF0dGVuYWJsZTtcbiIsICJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNGbGF0dGVuYWJsZSA9IHJlcXVpcmUoJy4vX2lzRmxhdHRlbmFibGUnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZsYXR0ZW47XG4iLCAiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwgInZhciBhcHBseSA9IHJlcXVpcmUoJy4vX2FwcGx5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VSZXN0YCB3aGljaCB0cmFuc2Zvcm1zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7XG4gIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgIGFycmF5ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgIH1cbiAgICBpbmRleCA9IC0xO1xuICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgIG90aGVyQXJnc1tpbmRleF0gPSBhcmdzW2luZGV4XTtcbiAgICB9XG4gICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHRyYW5zZm9ybShhcnJheSk7XG4gICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3ZlclJlc3Q7XG4iLCAidmFyIGNvbnN0YW50ID0gcmVxdWlyZSgnLi9jb25zdGFudCcpLFxuICAgIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHtcbiAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksXG4gICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVNldFRvU3RyaW5nO1xuIiwgIi8qKiBVc2VkIHRvIGRldGVjdCBob3QgZnVuY3Rpb25zIGJ5IG51bWJlciBvZiBjYWxscyB3aXRoaW4gYSBzcGFuIG9mIG1pbGxpc2Vjb25kcy4gKi9cbnZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgSE9UX1NQQU4gPSAxNjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZFxuICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gIHZhciBjb3VudCA9IDAsXG4gICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0YW1wID0gbmF0aXZlTm93KCksXG4gICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7XG5cbiAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgIGlmICgrK2NvdW50ID49IEhPVF9DT1VOVCkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb3VudCA9IDA7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG9ydE91dDtcbiIsICJ2YXIgYmFzZVNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVNldFRvU3RyaW5nJyksXG4gICAgc2hvcnRPdXQgPSByZXF1aXJlKCcuL19zaG9ydE91dCcpO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvU3RyaW5nO1xuIiwgInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVzdDtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmluZEluZGV4O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmFOO1xuIiwgIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpY3RJbmRleE9mO1xuIiwgInZhciBiYXNlRmluZEluZGV4ID0gcmVxdWlyZSgnLi9fYmFzZUZpbmRJbmRleCcpLFxuICAgIGJhc2VJc05hTiA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hTicpLFxuICAgIHN0cmljdEluZGV4T2YgPSByZXF1aXJlKCcuL19zdHJpY3RJbmRleE9mJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUluZGV4T2Y7XG4iLCAidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwgIi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBub29wO1xuIiwgInZhciBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBub29wID0gcmVxdWlyZSgnLi9ub29wJyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICovXG52YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTZXQ7XG4iLCAidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBjYWNoZUhhcyA9IHJlcXVpcmUoJy4vX2NhY2hlSGFzJyksXG4gICAgY3JlYXRlU2V0ID0gcmVxdWlyZSgnLi9fY3JlYXRlU2V0JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG52YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgcmVzdWx0ID0gW10sXG4gICAgICBzZWVuID0gcmVzdWx0O1xuXG4gIGlmIChjb21wYXJhdG9yKSB7XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICB9XG4gIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgdmFyIHNldCA9IGl0ZXJhdGVlID8gbnVsbCA6IGNyZWF0ZVNldChhcnJheSk7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICB9XG4gICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgIHNlZW4gPSBuZXcgU2V0Q2FjaGU7XG4gIH1cbiAgZWxzZSB7XG4gICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7XG4gIH1cbiAgb3V0ZXI6XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICB3aGlsZSAoc2VlbkluZGV4LS0pIHtcbiAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5pcTtcbiIsICJ2YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlT2JqZWN0O1xuIiwgInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLCAidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVZhbHVlcztcbiIsICJ2YXIgYmFzZVZhbHVlcyA9IHJlcXVpcmUoJy4vX2Jhc2VWYWx1ZXMnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy52YWx1ZXMobmV3IEZvbyk7XG4gKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLnZhbHVlcygnaGknKTtcbiAqIC8vID0+IFsnaCcsICdpJ11cbiAqL1xuZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZhbHVlcztcbiIsICIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBsb2Rhc2g7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgbG9kYXNoID0ge1xuICAgICAgY2xvbmU6IHJlcXVpcmUoXCJsb2Rhc2gvY2xvbmVcIiksXG4gICAgICBjb25zdGFudDogcmVxdWlyZShcImxvZGFzaC9jb25zdGFudFwiKSxcbiAgICAgIGVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZWFjaFwiKSxcbiAgICAgIGZpbHRlcjogcmVxdWlyZShcImxvZGFzaC9maWx0ZXJcIiksXG4gICAgICBoYXM6ICByZXF1aXJlKFwibG9kYXNoL2hhc1wiKSxcbiAgICAgIGlzQXJyYXk6IHJlcXVpcmUoXCJsb2Rhc2gvaXNBcnJheVwiKSxcbiAgICAgIGlzRW1wdHk6IHJlcXVpcmUoXCJsb2Rhc2gvaXNFbXB0eVwiKSxcbiAgICAgIGlzRnVuY3Rpb246IHJlcXVpcmUoXCJsb2Rhc2gvaXNGdW5jdGlvblwiKSxcbiAgICAgIGlzVW5kZWZpbmVkOiByZXF1aXJlKFwibG9kYXNoL2lzVW5kZWZpbmVkXCIpLFxuICAgICAga2V5czogcmVxdWlyZShcImxvZGFzaC9rZXlzXCIpLFxuICAgICAgbWFwOiByZXF1aXJlKFwibG9kYXNoL21hcFwiKSxcbiAgICAgIHJlZHVjZTogcmVxdWlyZShcImxvZGFzaC9yZWR1Y2VcIiksXG4gICAgICBzaXplOiByZXF1aXJlKFwibG9kYXNoL3NpemVcIiksXG4gICAgICB0cmFuc2Zvcm06IHJlcXVpcmUoXCJsb2Rhc2gvdHJhbnNmb3JtXCIpLFxuICAgICAgdW5pb246IHJlcXVpcmUoXCJsb2Rhc2gvdW5pb25cIiksXG4gICAgICB2YWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvdmFsdWVzXCIpXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWxvZGFzaCkge1xuICBsb2Rhc2ggPSB3aW5kb3cuXztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb2Rhc2g7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdyYXBoO1xuXG52YXIgREVGQVVMVF9FREdFX05BTUUgPSBcIlxceDAwXCI7XG52YXIgR1JBUEhfTk9ERSA9IFwiXFx4MDBcIjtcbnZhciBFREdFX0tFWV9ERUxJTSA9IFwiXFx4MDFcIjtcblxuLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6XG4vL1xuLy8gICogTm9kZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBzdHJpbmcgaWRzIGZvciB0aGUgbm9kZXNcbi8vICAqIEVkZ2UgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gXCJlZGdlT2JqXCIsIGVkZ2Ugb2JqZWN0LCB0aGF0IGlzXG4vLyAgICBjb21wb3NlZCBvZiBlbm91Z2ggaW5mb3JtYXRpb24gdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gZWRnZToge3YsIHcsIG5hbWV9LlxuLy8gICogSW50ZXJuYWxseSB3ZSB1c2UgYW4gXCJlZGdlSWRcIiwgYSBzdHJpbmdpZmllZCBmb3JtIG9mIHRoZSBlZGdlT2JqLCB0b1xuLy8gICAgcmVmZXJlbmNlIGVkZ2VzLiBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCBhIHBlcmZvcm1hbnQgd2F5IHRvIGxvb2sgdGhlc2Vcbi8vICAgIGVkZ2VzIHVwIGFuZCwgb2JqZWN0IHByb3BlcnRpZXMsIHdoaWNoIGhhdmUgc3RyaW5nIGtleXMsIGFyZSB0aGUgY2xvc2VzdFxuLy8gICAgd2UncmUgZ29pbmcgdG8gZ2V0IHRvIGEgcGVyZm9ybWFudCBoYXNodGFibGUgaW4gSmF2YVNjcmlwdC5cblxuZnVuY3Rpb24gR3JhcGgob3B0cykge1xuICB0aGlzLl9pc0RpcmVjdGVkID0gXy5oYXMob3B0cywgXCJkaXJlY3RlZFwiKSA/IG9wdHMuZGlyZWN0ZWQgOiB0cnVlO1xuICB0aGlzLl9pc011bHRpZ3JhcGggPSBfLmhhcyhvcHRzLCBcIm11bHRpZ3JhcGhcIikgPyBvcHRzLm11bHRpZ3JhcGggOiBmYWxzZTtcbiAgdGhpcy5faXNDb21wb3VuZCA9IF8uaGFzKG9wdHMsIFwiY29tcG91bmRcIikgPyBvcHRzLmNvbXBvdW5kIDogZmFsc2U7XG5cbiAgLy8gTGFiZWwgZm9yIHRoZSBncmFwaCBpdHNlbGZcbiAgdGhpcy5fbGFiZWwgPSB1bmRlZmluZWQ7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgbm9kZVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gRGVmYXVsdHMgdG8gYmUgc2V0IHdoZW4gY3JlYXRpbmcgYSBuZXcgZWRnZVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBfLmNvbnN0YW50KHVuZGVmaW5lZCk7XG5cbiAgLy8gdiAtPiBsYWJlbFxuICB0aGlzLl9ub2RlcyA9IHt9O1xuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgLy8gdiAtPiBwYXJlbnRcbiAgICB0aGlzLl9wYXJlbnQgPSB7fTtcblxuICAgIC8vIHYgLT4gY2hpbGRyZW5cbiAgICB0aGlzLl9jaGlsZHJlbiA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdID0ge307XG4gIH1cblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5faW4gPSB7fTtcblxuICAvLyB1IC0+IHYgLT4gTnVtYmVyXG4gIHRoaXMuX3ByZWRzID0ge307XG5cbiAgLy8gdiAtPiBlZGdlT2JqXG4gIHRoaXMuX291dCA9IHt9O1xuXG4gIC8vIHYgLT4gdyAtPiBOdW1iZXJcbiAgdGhpcy5fc3VjcyA9IHt9O1xuXG4gIC8vIGUgLT4gZWRnZU9ialxuICB0aGlzLl9lZGdlT2JqcyA9IHt9O1xuXG4gIC8vIGUgLT4gbGFiZWxcbiAgdGhpcy5fZWRnZUxhYmVscyA9IHt9O1xufVxuXG4vKiBOdW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fbm9kZUNvdW50ID0gMDtcblxuLyogTnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4gU2hvdWxkIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgaW1wbGVtZW50YXRpb24uICovXG5HcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudCA9IDA7XG5cblxuLyogPT09IEdyYXBoIGZ1bmN0aW9ucyA9PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc011bHRpZ3JhcGg7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNDb21wb3VuZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXRHcmFwaCA9IGZ1bmN0aW9uKGxhYmVsKSB7XG4gIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmdyYXBoID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9sYWJlbDtcbn07XG5cblxuLyogPT09IE5vZGUgZnVuY3Rpb25zID09PT09PT09PT0gKi9cblxuR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7XG4gIGlmICghXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7XG4gICAgbmV3RGVmYXVsdCA9IF8uY29uc3RhbnQobmV3RGVmYXVsdCk7XG4gIH1cbiAgdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuID0gbmV3RGVmYXVsdDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUNvdW50ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9ub2RlQ291bnQ7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF8ua2V5cyh0aGlzLl9ub2Rlcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc291cmNlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKTtcbiAgfSk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2lua3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlcyA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldE5vZGUodiwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldE5vZGUodik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0Tm9kZSA9IGZ1bmN0aW9uKHYsIHZhbHVlKSB7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX25vZGVzW3ZdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fbm9kZXNbdl0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHZhbHVlIDogdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRoaXMuX3BhcmVudFt2XSA9IEdSQVBIX05PREU7XG4gICAgdGhpcy5fY2hpbGRyZW5bdl0gPSB7fTtcbiAgICB0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXVt2XSA9IHRydWU7XG4gIH1cbiAgdGhpcy5faW5bdl0gPSB7fTtcbiAgdGhpcy5fcHJlZHNbdl0gPSB7fTtcbiAgdGhpcy5fb3V0W3ZdID0ge307XG4gIHRoaXMuX3N1Y3Nbdl0gPSB7fTtcbiAgKyt0aGlzLl9ub2RlQ291bnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiB0aGlzLl9ub2Rlc1t2XTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5oYXNOb2RlID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsIHYpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGUgPSAgZnVuY3Rpb24odikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChfLmhhcyh0aGlzLl9ub2RlcywgdikpIHtcbiAgICB2YXIgcmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKGUpIHsgc2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKTsgfTtcbiAgICBkZWxldGUgdGhpcy5fbm9kZXNbdl07XG4gICAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAgIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICAgICAgZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtcbiAgICAgIF8uZWFjaCh0aGlzLmNoaWxkcmVuKHYpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICBzZWxmLnNldFBhcmVudChjaGlsZCk7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XTtcbiAgICB9XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9pblt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt2XTtcbiAgICBkZWxldGUgdGhpcy5fcHJlZHNbdl07XG4gICAgXy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLCByZW1vdmVFZGdlKTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9zdWNzW3ZdO1xuICAgIC0tdGhpcy5fbm9kZUNvdW50O1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKHYsIHBhcmVudCkge1xuICBpZiAoIXRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaFwiKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICBwYXJlbnQgPSBHUkFQSF9OT0RFO1xuICB9IGVsc2Uge1xuICAgIC8vIENvZXJjZSBwYXJlbnQgdG8gc3RyaW5nXG4gICAgcGFyZW50ICs9IFwiXCI7XG4gICAgZm9yICh2YXIgYW5jZXN0b3IgPSBwYXJlbnQ7XG4gICAgICAhXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7XG4gICAgICBhbmNlc3RvciA9IHRoaXMucGFyZW50KGFuY2VzdG9yKSkge1xuICAgICAgaWYgKGFuY2VzdG9yID09PSB2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNldHRpbmcgXCIgKyBwYXJlbnQrIFwiIGFzIHBhcmVudCBvZiBcIiArIHYgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgd291bGQgY3JlYXRlIGEgY3ljbGVcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXROb2RlKHBhcmVudCk7XG4gIH1cblxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO1xuICB0aGlzLl9wYXJlbnRbdl0gPSBwYXJlbnQ7XG4gIHRoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl0gPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QgPSBmdW5jdGlvbih2KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnBhcmVudCA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5fcGFyZW50W3ZdO1xuICAgIGlmIChwYXJlbnQgIT09IEdSQVBIX05PREUpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuY2hpbGRyZW4gPSBmdW5jdGlvbih2KSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHYpKSB7XG4gICAgdiA9IEdSQVBIX05PREU7XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgcmV0dXJuIF8ua2V5cyhjaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHYgPT09IEdSQVBIX05PREUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlcygpO1xuICB9IGVsc2UgaWYgKHRoaXMuaGFzTm9kZSh2KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzViA9IHRoaXMuX3ByZWRzW3ZdO1xuICBpZiAocHJlZHNWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhwcmVkc1YpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHN1Y3NWID0gdGhpcy5fc3Vjc1t2XTtcbiAgaWYgKHN1Y3NWKSB7XG4gICAgcmV0dXJuIF8ua2V5cyhzdWNzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBwcmVkcyA9IHRoaXMucHJlZGVjZXNzb3JzKHYpO1xuICBpZiAocHJlZHMpIHtcbiAgICByZXR1cm4gXy51bmlvbihwcmVkcywgdGhpcy5zdWNjZXNzb3JzKHYpKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLmlzTGVhZiA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBuZWlnaGJvcnM7XG4gIGlmICh0aGlzLmlzRGlyZWN0ZWQoKSkge1xuICAgIG5laWdoYm9ycyA9IHRoaXMuc3VjY2Vzc29ycyh2KTtcbiAgfSBlbHNlIHtcbiAgICBuZWlnaGJvcnMgPSB0aGlzLm5laWdoYm9ycyh2KTtcbiAgfVxuICByZXR1cm4gbmVpZ2hib3JzLmxlbmd0aCA9PT0gMDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2RlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICB2YXIgY29weSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICBkaXJlY3RlZDogdGhpcy5faXNEaXJlY3RlZCxcbiAgICBtdWx0aWdyYXBoOiB0aGlzLl9pc011bHRpZ3JhcGgsXG4gICAgY29tcG91bmQ6IHRoaXMuX2lzQ29tcG91bmRcbiAgfSk7XG5cbiAgY29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgXy5lYWNoKHRoaXMuX25vZGVzLCBmdW5jdGlvbih2YWx1ZSwgdikge1xuICAgIGlmIChmaWx0ZXIodikpIHtcbiAgICAgIGNvcHkuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICBfLmVhY2godGhpcy5fZWRnZU9ianMsIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoY29weS5oYXNOb2RlKGUudikgJiYgY29weS5oYXNOb2RlKGUudykpIHtcbiAgICAgIGNvcHkuc2V0RWRnZShlLCBzZWxmLmVkZ2UoZSkpO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHBhcmVudHMgPSB7fTtcbiAgZnVuY3Rpb24gZmluZFBhcmVudCh2KSB7XG4gICAgdmFyIHBhcmVudCA9IHNlbGYucGFyZW50KHYpO1xuICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBjb3B5Lmhhc05vZGUocGFyZW50KSkge1xuICAgICAgcGFyZW50c1t2XSA9IHBhcmVudDtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfSBlbHNlIGlmIChwYXJlbnQgaW4gcGFyZW50cykge1xuICAgICAgcmV0dXJuIHBhcmVudHNbcGFyZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIF8uZWFjaChjb3B5Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICAgIGNvcHkuc2V0UGFyZW50KHYsIGZpbmRQYXJlbnQodikpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59O1xuXG4vKiA9PT0gRWRnZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5lZGdlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldFBhdGggPSBmdW5jdGlvbih2cywgdmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgXy5yZWR1Y2UodnMsIGZ1bmN0aW9uKHYsIHcpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICBzZWxmLnNldEVkZ2UodiwgdywgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLnNldEVkZ2Uodiwgdyk7XG4gICAgfVxuICAgIHJldHVybiB3O1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKlxuICogc2V0RWRnZSh2LCB3LCBbdmFsdWUsIFtuYW1lXV0pXG4gKiBzZXRFZGdlKHsgdiwgdywgW25hbWVdIH0sIFt2YWx1ZV0pXG4gKi9cbkdyYXBoLnByb3RvdHlwZS5zZXRFZGdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2LCB3LCBuYW1lLCB2YWx1ZTtcbiAgdmFyIHZhbHVlU3BlY2lmaWVkID0gZmFsc2U7XG4gIHZhciBhcmcwID0gYXJndW1lbnRzWzBdO1xuXG4gIGlmICh0eXBlb2YgYXJnMCA9PT0gXCJvYmplY3RcIiAmJiBhcmcwICE9PSBudWxsICYmIFwidlwiIGluIGFyZzApIHtcbiAgICB2ID0gYXJnMC52O1xuICAgIHcgPSBhcmcwLnc7XG4gICAgbmFtZSA9IGFyZzAubmFtZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMV07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHYgPSBhcmcwO1xuICAgIHcgPSBhcmd1bWVudHNbMV07XG4gICAgbmFtZSA9IGFyZ3VtZW50c1szXTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHZhbHVlID0gYXJndW1lbnRzWzJdO1xuICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHYgPSBcIlwiICsgdjtcbiAgdyA9IFwiXCIgKyB3O1xuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBuYW1lID0gXCJcIiArIG5hbWU7XG4gIH1cblxuICB2YXIgZSA9IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTtcbiAgaWYgKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpKSB7XG4gICAgaWYgKHZhbHVlU3BlY2lmaWVkKSB7XG4gICAgICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKG5hbWUpICYmICF0aGlzLl9pc011bHRpZ3JhcGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCA9IGZhbHNlXCIpO1xuICB9XG5cbiAgLy8gSXQgZGlkbid0IGV4aXN0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBpdC5cbiAgLy8gRmlyc3QgZW5zdXJlIHRoZSBub2RlcyBleGlzdC5cbiAgdGhpcy5zZXROb2RlKHYpO1xuICB0aGlzLnNldE5vZGUodyk7XG5cbiAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlU3BlY2lmaWVkID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odiwgdywgbmFtZSk7XG5cbiAgdmFyIGVkZ2VPYmogPSBlZGdlQXJnc1RvT2JqKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICAvLyBFbnN1cmUgd2UgYWRkIHVuZGlyZWN0ZWQgZWRnZXMgaW4gYSBjb25zaXN0ZW50IHdheS5cbiAgdiA9IGVkZ2VPYmoudjtcbiAgdyA9IGVkZ2VPYmoudztcblxuICBPYmplY3QuZnJlZXplKGVkZ2VPYmopO1xuICB0aGlzLl9lZGdlT2Jqc1tlXSA9IGVkZ2VPYmo7XG4gIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSwgdyk7XG4gIHRoaXMuX2luW3ddW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fb3V0W3ZdW2VdID0gZWRnZU9iajtcbiAgdGhpcy5fZWRnZUNvdW50Kys7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc0VkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5yZW1vdmVFZGdlID0gZnVuY3Rpb24odiwgdywgbmFtZSkge1xuICB2YXIgZSA9IChhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyBlZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCBhcmd1bWVudHNbMF0pXG4gICAgOiBlZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSkpO1xuICB2YXIgZWRnZSA9IHRoaXMuX2VkZ2VPYmpzW2VdO1xuICBpZiAoZWRnZSkge1xuICAgIHYgPSBlZGdlLnY7XG4gICAgdyA9IGVkZ2UudztcbiAgICBkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtcbiAgICBkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7XG4gICAgZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgICBkZWxldGUgdGhpcy5faW5bd11bZV07XG4gICAgZGVsZXRlIHRoaXMuX291dFt2XVtlXTtcbiAgICB0aGlzLl9lZGdlQ291bnQtLTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pbkVkZ2VzID0gZnVuY3Rpb24odiwgdSkge1xuICB2YXIgaW5WID0gdGhpcy5faW5bdl07XG4gIGlmIChpblYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhpblYpO1xuICAgIGlmICghdSkge1xuICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gXy5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudiA9PT0gdTsgfSk7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5vdXRFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIG91dFYgPSB0aGlzLl9vdXRbdl07XG4gIGlmIChvdXRWKSB7XG4gICAgdmFyIGVkZ2VzID0gXy52YWx1ZXMob3V0Vik7XG4gICAgaWYgKCF3KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS53ID09PSB3OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHtcbiAgdmFyIGluRWRnZXMgPSB0aGlzLmluRWRnZXModiwgdyk7XG4gIGlmIChpbkVkZ2VzKSB7XG4gICAgcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModiwgdykpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsIGspIHtcbiAgaWYgKG1hcFtrXSkge1xuICAgIG1hcFtrXSsrO1xuICB9IGVsc2Uge1xuICAgIG1hcFtrXSA9IDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsIGspIHtcbiAgaWYgKCEtLW1hcFtrXSkgeyBkZWxldGUgbWFwW2tdOyB9XG59XG5cbmZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHJldHVybiB2ICsgRURHRV9LRVlfREVMSU0gKyB3ICsgRURHRV9LRVlfREVMSU0gK1xuICAgICAgICAgICAgIChfLmlzVW5kZWZpbmVkKG5hbWUpID8gREVGQVVMVF9FREdFX05BTUUgOiBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHtcbiAgdmFyIHYgPSBcIlwiICsgdl87XG4gIHZhciB3ID0gXCJcIiArIHdfO1xuICBpZiAoIWlzRGlyZWN0ZWQgJiYgdiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHZhciBlZGdlT2JqID0gIHsgdjogdiwgdzogdyB9O1xuICBpZiAobmFtZSkge1xuICAgIGVkZ2VPYmoubmFtZSA9IG5hbWU7XG4gIH1cbiAgcmV0dXJuIGVkZ2VPYmo7XG59XG5cbmZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmopIHtcbiAgcmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqLnYsIGVkZ2VPYmoudywgZWRnZU9iai5uYW1lKTtcbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9ICcyLjEuOCc7XG4iLCAiLy8gSW5jbHVkZXMgb25seSB0aGUgXCJjb3JlXCIgb2YgZ3JhcGhsaWJcbm1vZHVsZS5leHBvcnRzID0ge1xuICBHcmFwaDogcmVxdWlyZShcIi4vZ3JhcGhcIiksXG4gIHZlcnNpb246IHJlcXVpcmUoXCIuL3ZlcnNpb25cIilcbn07XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdyaXRlOiB3cml0ZSxcbiAgcmVhZDogcmVhZFxufTtcblxuZnVuY3Rpb24gd3JpdGUoZykge1xuICB2YXIganNvbiA9IHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBkaXJlY3RlZDogZy5pc0RpcmVjdGVkKCksXG4gICAgICBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpLFxuICAgICAgY29tcG91bmQ6IGcuaXNDb21wb3VuZCgpXG4gICAgfSxcbiAgICBub2Rlczogd3JpdGVOb2RlcyhnKSxcbiAgICBlZGdlczogd3JpdGVFZGdlcyhnKVxuICB9O1xuICBpZiAoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSkge1xuICAgIGpzb24udmFsdWUgPSBfLmNsb25lKGcuZ3JhcGgoKSk7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59XG5cbmZ1bmN0aW9uIHdyaXRlTm9kZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGVWYWx1ZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcGFyZW50ID0gZy5wYXJlbnQodik7XG4gICAgdmFyIG5vZGUgPSB7IHY6IHYgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSkge1xuICAgICAgbm9kZS52YWx1ZSA9IG5vZGVWYWx1ZTtcbiAgICB9XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpIHtcbiAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRWRnZXMoZykge1xuICByZXR1cm4gXy5tYXAoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2VWYWx1ZSA9IGcuZWRnZShlKTtcbiAgICB2YXIgZWRnZSA9IHsgdjogZS52LCB3OiBlLncgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSkge1xuICAgICAgZWRnZS5uYW1lID0gZS5uYW1lO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSkge1xuICAgICAgZWRnZS52YWx1ZSA9IGVkZ2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWFkKGpzb24pIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoanNvbi5vcHRpb25zKS5zZXRHcmFwaChqc29uLnZhbHVlKTtcbiAgXy5lYWNoKGpzb24ubm9kZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXROb2RlKGVudHJ5LnYsIGVudHJ5LnZhbHVlKTtcbiAgICBpZiAoZW50cnkucGFyZW50KSB7XG4gICAgICBnLnNldFBhcmVudChlbnRyeS52LCBlbnRyeS5wYXJlbnQpO1xuICAgIH1cbiAgfSk7XG4gIF8uZWFjaChqc29uLmVkZ2VzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGcuc2V0RWRnZSh7IHY6IGVudHJ5LnYsIHc6IGVudHJ5LncsIG5hbWU6IGVudHJ5Lm5hbWUgfSwgZW50cnkudmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIGc7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBvbmVudHM7XG5cbmZ1bmN0aW9uIGNvbXBvbmVudHMoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgY21wdHMgPSBbXTtcbiAgdmFyIGNtcHQ7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBjbXB0LnB1c2godik7XG4gICAgXy5lYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgY21wdCA9IFtdO1xuICAgIGRmcyh2KTtcbiAgICBpZiAoY21wdC5sZW5ndGgpIHtcbiAgICAgIGNtcHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY21wdHM7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByaW9yaXR5UXVldWU7XG5cbi8qKlxuICogQSBtaW4tcHJpb3JpdHkgcXVldWUgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgYWxnb3JpdGhtIGlzIGRlcml2ZWQgZnJvbSBDb3JtZW4sXG4gKiBldCBhbC4sIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi4gVGhlIGJhc2ljIGlkZWEgb2YgYSBtaW4tcHJpb3JpdHlcbiAqIHF1ZXVlIGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSAoaW4gTygxKSB0aW1lKSBnZXQgdGhlIHNtYWxsZXN0IGtleSBpblxuICogdGhlIHF1ZXVlLiBBZGRpbmcgYW5kIHJlbW92aW5nIGVsZW1lbnRzIHRha2VzIE8obG9nIG4pIHRpbWUuIEEga2V5IGNhblxuICogaGF2ZSBpdHMgcHJpb3JpdHkgZGVjcmVhc2VkIGluIE8obG9nIG4pIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIFByaW9yaXR5UXVldWUoKSB7XG4gIHRoaXMuX2FyciA9IFtdO1xuICB0aGlzLl9rZXlJbmRpY2VzID0ge307XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Fyci5sZW5ndGg7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTyhuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LmtleTsgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmICoqa2V5KiogaXMgaW4gdGhlIHF1ZXVlIGFuZCBgZmFsc2VgIGlmIG5vdC5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9rZXlJbmRpY2VzLCBrZXkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmlvcml0eSBmb3IgKiprZXkqKi4gSWYgKiprZXkqKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgcXVldWVcbiAqIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGB1bmRlZmluZWRgLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnByaW9yaXR5ID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoZSBtaW5pbXVtIGVsZW1lbnQgaW4gdGhpcyBxdWV1ZS4gSWYgdGhlIHF1ZXVlIGlzXG4gKiBlbXB0eSB0aGlzIGZ1bmN0aW9uIHRocm93cyBhbiBFcnJvci4gVGFrZXMgYE8oMSlgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5zaXplKCkgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWV1ZSB1bmRlcmZsb3dcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FyclswXS5rZXk7XG59O1xuXG4vKipcbiAqIEluc2VydHMgYSBuZXcga2V5IGludG8gdGhlIHByaW9yaXR5IHF1ZXVlLiBJZiB0aGUga2V5IGFscmVhZHkgZXhpc3RzIGluXG4gKiB0aGUgcXVldWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWA7IG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBgdHJ1ZWAuXG4gKiBUYWtlcyBgTyhuKWAgdGltZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2V5IHRoZSBrZXkgdG8gYWRkXG4gKiBAcGFyYW0ge051bWJlcn0gcHJpb3JpdHkgdGhlIGluaXRpYWwgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oa2V5LCBwcmlvcml0eSkge1xuICB2YXIga2V5SW5kaWNlcyA9IHRoaXMuX2tleUluZGljZXM7XG4gIGtleSA9IFN0cmluZyhrZXkpO1xuICBpZiAoIV8uaGFzKGtleUluZGljZXMsIGtleSkpIHtcbiAgICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICAgIHZhciBpbmRleCA9IGFyci5sZW5ndGg7XG4gICAga2V5SW5kaWNlc1trZXldID0gaW5kZXg7XG4gICAgYXJyLnB1c2goe2tleToga2V5LCBwcmlvcml0eTogcHJpb3JpdHl9KTtcbiAgICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBrZXkgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTyhsb2cgbilgIHRpbWUuXG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9zd2FwKDAsIHRoaXMuX2Fyci5sZW5ndGggLSAxKTtcbiAgdmFyIG1pbiA9IHRoaXMuX2Fyci5wb3AoKTtcbiAgZGVsZXRlIHRoaXMuX2tleUluZGljZXNbbWluLmtleV07XG4gIHRoaXMuX2hlYXBpZnkoMCk7XG4gIHJldHVybiBtaW4ua2V5O1xufTtcblxuLyoqXG4gKiBEZWNyZWFzZXMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqIHRvICoqcHJpb3JpdHkqKi4gSWYgdGhlIG5ldyBwcmlvcml0eSBpc1xuICogZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBwcmlvcml0eSwgdGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGFuIEVycm9yLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSBmb3Igd2hpY2ggdG8gcmFpc2UgcHJpb3JpdHlcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgbmV3IHByaW9yaXR5IGZvciB0aGUga2V5XG4gKi9cblByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlID0gZnVuY3Rpb24oa2V5LCBwcmlvcml0eSkge1xuICB2YXIgaW5kZXggPSB0aGlzLl9rZXlJbmRpY2VzW2tleV07XG4gIGlmIChwcmlvcml0eSA+IHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcHJpb3JpdHkuIFwiICtcbiAgICAgICAgXCJLZXk6IFwiICsga2V5ICsgXCIgT2xkOiBcIiArIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkgKyBcIiBOZXc6IFwiICsgcHJpb3JpdHkpO1xuICB9XG4gIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgdGhpcy5fZGVjcmVhc2UoaW5kZXgpO1xufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnkgPSBmdW5jdGlvbihpKSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBsID0gMiAqIGk7XG4gIHZhciByID0gbCArIDE7XG4gIHZhciBsYXJnZXN0ID0gaTtcbiAgaWYgKGwgPCBhcnIubGVuZ3RoKSB7XG4gICAgbGFyZ2VzdCA9IGFycltsXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IGwgOiBsYXJnZXN0O1xuICAgIGlmIChyIDwgYXJyLmxlbmd0aCkge1xuICAgICAgbGFyZ2VzdCA9IGFycltyXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IHIgOiBsYXJnZXN0O1xuICAgIH1cbiAgICBpZiAobGFyZ2VzdCAhPT0gaSkge1xuICAgICAgdGhpcy5fc3dhcChpLCBsYXJnZXN0KTtcbiAgICAgIHRoaXMuX2hlYXBpZnkobGFyZ2VzdCk7XG4gICAgfVxuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fZGVjcmVhc2UgPSBmdW5jdGlvbihpbmRleCkge1xuICB2YXIgYXJyID0gdGhpcy5fYXJyO1xuICB2YXIgcHJpb3JpdHkgPSBhcnJbaW5kZXhdLnByaW9yaXR5O1xuICB2YXIgcGFyZW50O1xuICB3aGlsZSAoaW5kZXggIT09IDApIHtcbiAgICBwYXJlbnQgPSBpbmRleCA+PiAxO1xuICAgIGlmIChhcnJbcGFyZW50XS5wcmlvcml0eSA8IHByaW9yaXR5KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fc3dhcChpbmRleCwgcGFyZW50KTtcbiAgICBpbmRleCA9IHBhcmVudDtcbiAgfVxufTtcblxuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX3N3YXAgPSBmdW5jdGlvbihpLCBqKSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAgdmFyIG9yaWdBcnJJID0gYXJyW2ldO1xuICB2YXIgb3JpZ0FyckogPSBhcnJbal07XG4gIGFycltpXSA9IG9yaWdBcnJKO1xuICBhcnJbal0gPSBvcmlnQXJySTtcbiAga2V5SW5kaWNlc1tvcmlnQXJySi5rZXldID0gaTtcbiAga2V5SW5kaWNlc1tvcmlnQXJySS5rZXldID0gajtcbn07XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYTtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBkaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkRpamtzdHJhKGcsIFN0cmluZyhzb3VyY2UpLFxuICAgIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZVTkMsXG4gICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pO1xufVxuXG5mdW5jdGlvbiBydW5EaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIHBxID0gbmV3IFByaW9yaXR5UXVldWUoKTtcbiAgdmFyIHYsIHZFbnRyeTtcblxuICB2YXIgdXBkYXRlTmVpZ2hib3JzID0gZnVuY3Rpb24oZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ICE9PSB2ID8gZWRnZS52IDogZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSByZXN1bHRzW3ddO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlZGdlKTtcbiAgICB2YXIgZGlzdGFuY2UgPSB2RW50cnkuZGlzdGFuY2UgKyB3ZWlnaHQ7XG5cbiAgICBpZiAod2VpZ2h0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlqa3N0cmEgZG9lcyBub3QgYWxsb3cgbmVnYXRpdmUgZWRnZSB3ZWlnaHRzLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJCYWQgZWRnZTogXCIgKyBlZGdlICsgXCIgV2VpZ2h0OiBcIiArIHdlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc3RhbmNlIDwgd0VudHJ5LmRpc3RhbmNlKSB7XG4gICAgICB3RW50cnkuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIHdFbnRyeS5wcmVkZWNlc3NvciA9IHY7XG4gICAgICBwcS5kZWNyZWFzZSh3LCBkaXN0YW5jZSk7XG4gICAgfVxuICB9O1xuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSB2ID09PSBzb3VyY2UgPyAwIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIHJlc3VsdHNbdl0gPSB7IGRpc3RhbmNlOiBkaXN0YW5jZSB9O1xuICAgIHBxLmFkZCh2LCBkaXN0YW5jZSk7XG4gIH0pO1xuXG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIHZFbnRyeSA9IHJlc3VsdHNbdl07XG4gICAgaWYgKHZFbnRyeS5kaXN0YW5jZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBlZGdlRm4odikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCAidmFyIGRpamtzdHJhID0gcmVxdWlyZShcIi4vZGlqa3N0cmFcIik7XG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlqa3N0cmFBbGw7XG5cbmZ1bmN0aW9uIGRpamtzdHJhQWxsKGcsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKSB7XG4gIHJldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksIGZ1bmN0aW9uKGFjYywgdikge1xuICAgIGFjY1t2XSA9IGRpamtzdHJhKGcsIHYsIHdlaWdodEZ1bmMsIGVkZ2VGdW5jKTtcbiAgfSwge30pO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0YXJqYW47XG5cbmZ1bmN0aW9uIHRhcmphbihnKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfVxuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGVudHJ5ID0gdmlzaXRlZFt2XSA9IHtcbiAgICAgIG9uU3RhY2s6IHRydWUsXG4gICAgICBsb3dsaW5rOiBpbmRleCxcbiAgICAgIGluZGV4OiBpbmRleCsrXG4gICAgfTtcbiAgICBzdGFjay5wdXNoKHYpO1xuXG4gICAgZy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgICBkZnModyk7XG4gICAgICAgIGVudHJ5Lmxvd2xpbmsgPSBNYXRoLm1pbihlbnRyeS5sb3dsaW5rLCB2aXNpdGVkW3ddLmxvd2xpbmspO1xuICAgICAgfSBlbHNlIGlmICh2aXNpdGVkW3ddLm9uU3RhY2spIHtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10uaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5Lmxvd2xpbmsgPT09IGVudHJ5LmluZGV4KSB7XG4gICAgICB2YXIgY21wdCA9IFtdO1xuICAgICAgdmFyIHc7XG4gICAgICBkbyB7XG4gICAgICAgIHcgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmlzaXRlZFt3XS5vblN0YWNrID0gZmFsc2U7XG4gICAgICAgIGNtcHQucHVzaCh3KTtcbiAgICAgIH0gd2hpbGUgKHYgIT09IHcpO1xuICAgICAgcmVzdWx0cy5wdXNoKGNtcHQpO1xuICAgIH1cbiAgfVxuXG4gIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICBkZnModik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdGFyamFuID0gcmVxdWlyZShcIi4vdGFyamFuXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRDeWNsZXM7XG5cbmZ1bmN0aW9uIGZpbmRDeWNsZXMoZykge1xuICByZXR1cm4gXy5maWx0ZXIodGFyamFuKGcpLCBmdW5jdGlvbihjbXB0KSB7XG4gICAgcmV0dXJuIGNtcHQubGVuZ3RoID4gMSB8fCAoY21wdC5sZW5ndGggPT09IDEgJiYgZy5oYXNFZGdlKGNtcHRbMF0sIGNtcHRbMF0pKTtcbiAgfSk7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsb3lkV2Fyc2hhbGw7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GVU5DID0gXy5jb25zdGFudCgxKTtcblxuZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHJldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgcmVzdWx0c1t2XSA9IHt9O1xuICAgIHJlc3VsdHNbdl1bdl0gPSB7IGRpc3RhbmNlOiAwIH07XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAodiAhPT0gdykge1xuICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIH07XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSkge1xuICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgICB2YXIgZCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgICAgcmVzdWx0c1t2XVt3XSA9IHsgZGlzdGFuY2U6IGQsIHByZWRlY2Vzc29yOiB2IH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgIHZhciByb3dLID0gcmVzdWx0c1trXTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIHZhciByb3dJID0gcmVzdWx0c1tpXTtcbiAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaikge1xuICAgICAgICB2YXIgaWsgPSByb3dJW2tdO1xuICAgICAgICB2YXIga2ogPSByb3dLW2pdO1xuICAgICAgICB2YXIgaWogPSByb3dJW2pdO1xuICAgICAgICB2YXIgYWx0RGlzdGFuY2UgPSBpay5kaXN0YW5jZSArIGtqLmRpc3RhbmNlO1xuICAgICAgICBpZiAoYWx0RGlzdGFuY2UgPCBpai5kaXN0YW5jZSkge1xuICAgICAgICAgIGlqLmRpc3RhbmNlID0gYWx0RGlzdGFuY2U7XG4gICAgICAgICAgaWoucHJlZGVjZXNzb3IgPSBrai5wcmVkZWNlc3NvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b3Bzb3J0O1xudG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uO1xuXG5mdW5jdGlvbiB0b3Bzb3J0KGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZSkge1xuICAgIGlmIChfLmhhcyhzdGFjaywgbm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmICghXy5oYXModmlzaXRlZCwgbm9kZSkpIHtcbiAgICAgIHN0YWNrW25vZGVdID0gdHJ1ZTtcbiAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlO1xuICAgICAgXy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7XG4gICAgICBkZWxldGUgc3RhY2tbbm9kZV07XG4gICAgICByZXN1bHRzLnB1c2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgXy5lYWNoKGcuc2lua3MoKSwgdmlzaXQpO1xuXG4gIGlmIChfLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHtcbiAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpIHt9XG5DeWNsZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsgLy8gbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBFcnJvciB0byBwYXNzIHRlc3RpbmciLCAidmFyIHRvcHNvcnQgPSByZXF1aXJlKFwiLi90b3Bzb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQWN5Y2xpYztcblxuZnVuY3Rpb24gaXNBY3ljbGljKGcpIHtcbiAgdHJ5IHtcbiAgICB0b3Bzb3J0KGcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRmcztcblxuLypcbiAqIEEgaGVscGVyIHRoYXQgcHJlZm9ybXMgYSBwcmUtIG9yIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9uIHRoZSBpbnB1dCBncmFwaFxuICogYW5kIHJldHVybnMgdGhlIG5vZGVzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgdmlzaXRlZC4gSWYgdGhlIGdyYXBoIGlzXG4gKiB1bmRpcmVjdGVkIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCBuYXZpZ2F0ZSB1c2luZyBuZWlnaGJvcnMuIElmIHRoZSBncmFwaFxuICogaXMgZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIHN1Y2Nlc3NvcnMuXG4gKlxuICogT3JkZXIgbXVzdCBiZSBvbmUgb2YgXCJwcmVcIiBvciBcInBvc3RcIi5cbiAqL1xuZnVuY3Rpb24gZGZzKGcsIHZzLCBvcmRlcikge1xuICBpZiAoIV8uaXNBcnJheSh2cykpIHtcbiAgICB2cyA9IFt2c107XG4gIH1cblxuICB2YXIgbmF2aWdhdGlvbiA9IChnLmlzRGlyZWN0ZWQoKSA/IGcuc3VjY2Vzc29ycyA6IGcubmVpZ2hib3JzKS5iaW5kKGcpO1xuXG4gIHZhciBhY2MgPSBbXTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgXy5lYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmhhc05vZGUodikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogXCIgKyB2KTtcbiAgICB9XG5cbiAgICBkb0RmcyhnLCB2LCBvcmRlciA9PT0gXCJwb3N0XCIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gIH0pO1xuICByZXR1cm4gYWNjO1xufVxuXG5mdW5jdGlvbiBkb0RmcyhnLCB2LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYykge1xuICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICBpZiAoIXBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICAgIF8uZWFjaChuYXZpZ2F0aW9uKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgICBkb0RmcyhnLCB3LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7XG4gICAgfSk7XG4gICAgaWYgKHBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfVxuICB9XG59XG4iLCAidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwb3N0b3JkZXI7XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnLCB2cykge1xuICByZXR1cm4gZGZzKGcsIHZzLCBcInBvc3RcIik7XG59XG4iLCAidmFyIGRmcyA9IHJlcXVpcmUoXCIuL2Rmc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmVvcmRlcjtcblxuZnVuY3Rpb24gcHJlb3JkZXIoZywgdnMpIHtcbiAgcmV0dXJuIGRmcyhnLCB2cywgXCJwcmVcIik7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBoXCIpO1xudmFyIFByaW9yaXR5UXVldWUgPSByZXF1aXJlKFwiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmltO1xuXG5mdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgcGFyZW50cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdjtcblxuICBmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSkge1xuICAgIHZhciB3ID0gZWRnZS52ID09PSB2ID8gZWRnZS53IDogZWRnZS52O1xuICAgIHZhciBwcmkgPSBwcS5wcmlvcml0eSh3KTtcbiAgICBpZiAocHJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBlZGdlV2VpZ2h0ID0gd2VpZ2h0RnVuYyhlZGdlKTtcbiAgICAgIGlmIChlZGdlV2VpZ2h0IDwgcHJpKSB7XG4gICAgICAgIHBhcmVudHNbd10gPSB2O1xuICAgICAgICBwcS5kZWNyZWFzZSh3LCBlZGdlV2VpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZy5ub2RlQ291bnQoKSA9PT0gMCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfLmVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcHEuYWRkKHYsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmVzdWx0LnNldE5vZGUodik7XG4gIH0pO1xuXG4gIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGVcbiAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTtcblxuICB2YXIgaW5pdCA9IGZhbHNlO1xuICB3aGlsZSAocHEuc2l6ZSgpID4gMCkge1xuICAgIHYgPSBwcS5yZW1vdmVNaW4oKTtcbiAgICBpZiAoXy5oYXMocGFyZW50cywgdikpIHtcbiAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pO1xuICAgIH0gZWxzZSBpZiAoaW5pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogXCIgKyBnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5pdCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcG9uZW50czogcmVxdWlyZShcIi4vY29tcG9uZW50c1wiKSxcbiAgZGlqa3N0cmE6IHJlcXVpcmUoXCIuL2RpamtzdHJhXCIpLFxuICBkaWprc3RyYUFsbDogcmVxdWlyZShcIi4vZGlqa3N0cmEtYWxsXCIpLFxuICBmaW5kQ3ljbGVzOiByZXF1aXJlKFwiLi9maW5kLWN5Y2xlc1wiKSxcbiAgZmxveWRXYXJzaGFsbDogcmVxdWlyZShcIi4vZmxveWQtd2Fyc2hhbGxcIiksXG4gIGlzQWN5Y2xpYzogcmVxdWlyZShcIi4vaXMtYWN5Y2xpY1wiKSxcbiAgcG9zdG9yZGVyOiByZXF1aXJlKFwiLi9wb3N0b3JkZXJcIiksXG4gIHByZW9yZGVyOiByZXF1aXJlKFwiLi9wcmVvcmRlclwiKSxcbiAgcHJpbTogcmVxdWlyZShcIi4vcHJpbVwiKSxcbiAgdGFyamFuOiByZXF1aXJlKFwiLi90YXJqYW5cIiksXG4gIHRvcHNvcnQ6IHJlcXVpcmUoXCIuL3RvcHNvcnRcIilcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIENocmlzIFBldHRpdHRcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICpcbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXG4gKiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxuICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRURcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgbGliID0gcmVxdWlyZShcIi4vbGliXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgR3JhcGg6IGxpYi5HcmFwaCxcbiAganNvbjogcmVxdWlyZShcIi4vbGliL2pzb25cIiksXG4gIGFsZzogcmVxdWlyZShcIi4vbGliL2FsZ1wiKSxcbiAgdmVyc2lvbjogbGliLnZlcnNpb25cbn07XG4iLCAiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgZ3JhcGhsaWI7XG5cbmlmICh0eXBlb2YgcmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gIHRyeSB7XG4gICAgZ3JhcGhsaWIgPSByZXF1aXJlKFwiZ3JhcGhsaWJcIik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFncmFwaGxpYikge1xuICBncmFwaGxpYiA9IHdpbmRvdy5ncmFwaGxpYjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBncmFwaGxpYjtcbiIsICJ2YXIgYmFzZUNsb25lID0gcmVxdWlyZSgnLi9fYmFzZUNsb25lJyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGNsb25pbmcuICovXG52YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAqIEBzZWUgXy5jbG9uZVxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAqXG4gKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpO1xuICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURlZXA7XG4iLCAidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsICJ2YXIgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmRlZmF1bHRzRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbnZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoO1xuICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgbGVuZ3RoID0gMTtcbiAgfVxuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHM7XG4iLCAidmFyIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgIHZhciBpdGVyYWJsZSA9IE9iamVjdChjb2xsZWN0aW9uKTtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgcHJlZGljYXRlID0gZnVuY3Rpb24oa2V5KSB7IHJldHVybiBpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKTsgfTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgcmV0dXJuIGluZGV4ID4gLTEgPyBpdGVyYWJsZVtpdGVyYXRlZSA/IGNvbGxlY3Rpb25baW5kZXhdIDogaW5kZXhdIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUZpbmQ7XG4iLCAiLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG52YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1tZWRFbmRJbmRleDtcbiIsICJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsICJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsICJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuIiwgInZhciB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0ludGVnZXI7XG4iLCAidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi90b0ludGVnZXInKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0XG4gKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kSW5kZXgodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlciA9PSAnYmFybmV5JzsgfSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gKiAvLyA9PiAxXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiAyXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgfVxuICByZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kSW5kZXg7XG4iLCAidmFyIGNyZWF0ZUZpbmQgPSByZXF1aXJlKCcuL19jcmVhdGVGaW5kJyksXG4gICAgZmluZEluZGV4ID0gcmVxdWlyZSgnLi9maW5kSW5kZXgnKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAqIF07XG4gKlxuICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKi9cbnZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmQ7XG4iLCAidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsICJ2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vX2Jhc2VGb3InKSxcbiAgICBjYXN0RnVuY3Rpb24gPSByZXF1aXJlKCcuL19jYXN0RnVuY3Rpb24nKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICogb2JqZWN0IGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjMuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJywgJ2InLCB0aGVuICdjJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGxcbiAgICA/IG9iamVjdFxuICAgIDogYmFzZUZvcihvYmplY3QsIGNhc3RGdW5jdGlvbihpdGVyYXRlZSksIGtleXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9ySW47XG4iLCAiLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKi9cbmZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGFzdDtcbiIsICJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAqIEBzZWUgXy5tYXBLZXlzXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IHtcbiAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAqICAgJ3BlYmJsZXMnOiB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gKiB9O1xuICpcbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZTsgfSk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVmFsdWVzO1xuIiwgInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAqIGBjb21wYXJhdG9yYCB0byBkZXRlcm1pbmUgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbChjdXJyZW50KSlcbiAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICkpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGN1cnJlbnQsXG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUV4dHJlbXVtO1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUd0O1xuIiwgInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlR3QgPSByZXF1aXJlKCcuL19iYXNlR3QnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiA4XG4gKlxuICogXy5tYXgoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1heChhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXg7XG4iLCAidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCAiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2FmZUdldChvYmplY3QsIGtleSkge1xuICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZUdldDtcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAqL1xuZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9QbGFpbk9iamVjdDtcbiIsICJ2YXIgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY2xvbmVUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fY2xvbmVUeXBlZEFycmF5JyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgaW5pdENsb25lT2JqZWN0ID0gcmVxdWlyZSgnLi9faW5pdENsb25lT2JqZWN0JyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi9pc1BsYWluT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpLFxuICAgIHRvUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL3RvUGxhaW5PYmplY3QnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgIHN0YWNrZWQgPSBzdGFjay5nZXQoc3JjVmFsdWUpO1xuXG4gIGlmIChzdGFja2VkKSB7XG4gICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICBpZiAoaXNDb21tb24pIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgaXNUeXBlZCA9ICFpc0FyciAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheShzcmNWYWx1ZSk7XG5cbiAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNCdWZmKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3Qob2JqVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGluaXRDbG9uZU9iamVjdChzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICB9XG4gIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2VEZWVwO1xuIiwgInZhciBTdGFjayA9IHJlcXVpcmUoJy4vX1N0YWNrJyksXG4gICAgYXNzaWduTWVyZ2VWYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnbk1lcmdlVmFsdWUnKSxcbiAgICBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGJhc2VNZXJnZURlZXAgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2VEZWVwJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKSxcbiAgICBzYWZlR2V0ID0gcmVxdWlyZSgnLi9fc2FmZUdldCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gKiAgY291bnRlcnBhcnRzLlxuICovXG5mdW5jdGlvbiBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIGlmIChpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH0sIGtleXNJbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlO1xuIiwgInZhciBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7XG4gIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsXG4gICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKVxuICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgIGxlbmd0aCA9IDE7XG4gICAgfVxuICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFzc2lnbmVyO1xuIiwgInZhciBiYXNlTWVyZ2UgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2UnKSxcbiAgICBjcmVhdGVBc3NpZ25lciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUFzc2lnbmVyJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kXG4gKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXNcbiAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjUuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0ge1xuICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICogfTtcbiAqXG4gKiB2YXIgb3RoZXIgPSB7XG4gKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dXG4gKiB9O1xuICpcbiAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gKi9cbnZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkge1xuICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlO1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUx0O1xuIiwgInZhciBiYXNlRXh0cmVtdW0gPSByZXF1aXJlKCcuL19iYXNlRXh0cmVtdW0nKSxcbiAgICBiYXNlTHQgPSByZXF1aXJlKCcuL19iYXNlTHQnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSxcbiAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5taW4oW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG1pbihhcnJheSkge1xuICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW47XG4iLCAidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICpcbiAqIF8ubWluQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAqIC8vID0+IHsgJ24nOiAxIH1cbiAqL1xuZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWluQnk7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbm93O1xuIiwgInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgdG9LZXkgPSByZXF1aXJlKCcuL190b0tleScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgbmVzdGVkID0gb2JqZWN0O1xuXG4gIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIGlmIChpbmRleCAhPSBsYXN0SW5kZXgpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgbmV3VmFsdWUgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihvYmpWYWx1ZSwga2V5LCBuZXN0ZWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICA/IG9ialZhbHVlXG4gICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0O1xuIiwgInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VTZXQgPSByZXF1aXJlKCcuL19iYXNlU2V0JyksXG4gICAgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcGF0aHMubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0ge307XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSxcbiAgICAgICAgdmFsdWUgPSBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG5cbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgYmFzZVNldChyZXN1bHQsIGNhc3RQYXRoKHBhdGgsIG9iamVjdCksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGlja0J5O1xuIiwgInZhciBiYXNlUGlja0J5ID0gcmVxdWlyZSgnLi9fYmFzZVBpY2tCeScpLFxuICAgIGhhc0luID0gcmVxdWlyZSgnLi9oYXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVBpY2s7XG4iLCAidmFyIGZsYXR0ZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW4nKSxcbiAgICBvdmVyUmVzdCA9IHJlcXVpcmUoJy4vX292ZXJSZXN0JyksXG4gICAgc2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19zZXRUb1N0cmluZycpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdFJlc3Q7XG4iLCAidmFyIGJhc2VQaWNrID0gcmVxdWlyZSgnLi9fYmFzZVBpY2snKSxcbiAgICBmbGF0UmVzdCA9IHJlcXVpcmUoJy4vX2ZsYXRSZXN0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gKlxuICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAqL1xudmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHt9IDogYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwaWNrO1xuIiwgIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwgInZhciBiYXNlUmFuZ2UgPSByZXF1aXJlKCcuL19iYXNlUmFuZ2UnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyksXG4gICAgdG9GaW5pdGUgPSByZXF1aXJlKCcuL3RvRmluaXRlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgIH1cbiAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSYW5nZTtcbiIsICJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU29ydEJ5O1xuIiwgInZhciBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqXG4gKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSwgb3RoZXIpIHtcbiAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgdmFyIG90aElzRGVmaW5lZCA9IG90aGVyICE9PSB1bmRlZmluZWQsXG4gICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChvdGhlcik7XG5cbiAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAodmFsSXNOdWxsICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgIChvdGhJc1N5bWJvbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUgJiYgIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wpIHx8XG4gICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIW90aElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVBc2NlbmRpbmc7XG4iLCAidmFyIGNvbXBhcmVBc2NlbmRpbmcgPSByZXF1aXJlKCcuL19jb21wYXJlQXNjZW5kaW5nJyk7XG5cbi8qKlxuICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gKiBhbmQgc3RhYmxlIHNvcnQgdGhlbS5cbiAqXG4gKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICogc3BlY2lmeSBhbiBvcmRlciBvZiBcImRlc2NcIiBmb3IgZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlclxuICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXG4gICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07XG4gICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgfVxuICB9XG4gIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3XG4gIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuXG4gIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZU11bHRpcGxlO1xuIiwgInZhciBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZUdldCA9IHJlcXVpcmUoJy4vX2Jhc2VHZXQnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBiYXNlTWFwID0gcmVxdWlyZSgnLi9fYmFzZU1hcCcpLFxuICAgIGJhc2VTb3J0QnkgPSByZXF1aXJlKCcuL19iYXNlU29ydEJ5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY29tcGFyZU11bHRpcGxlID0gcmVxdWlyZSgnLi9fY29tcGFyZU11bHRpcGxlJyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VPcmRlckJ5O1xuIiwgInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZU9yZGVyQnkgPSByZXF1aXJlKCcuL19iYXNlT3JkZXJCeScpLFxuICAgIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cywgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBieSB0aGUgcmVzdWx0cyBvZlxuICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICogZXF1YWwgZWxlbWVudHMuIFRoZSBpdGVyYXRlZXMgYXJlIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogMzAgfSxcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICogXTtcbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAqL1xudmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID4gMSAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbXTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW2l0ZXJhdGVlc1swXV07XG4gIH1cbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRCeTtcbiIsICJ2YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG52YXIgaWRDb3VudGVyID0gMDtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICpcbiAqIF8udW5pcXVlSWQoKTtcbiAqIC8vID0+ICcxMDUnXG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmlxdWVJZDtcbiIsICIvKipcbiAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVppcE9iamVjdDtcbiIsICJ2YXIgYXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25WYWx1ZScpLFxuICAgIGJhc2VaaXBPYmplY3QgPSByZXF1aXJlKCcuL19iYXNlWmlwT2JqZWN0Jyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cyxcbiAqIG9uZSBvZiBwcm9wZXJ0eSBpZGVudGlmaWVycyBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC40LjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICovXG5mdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykge1xuICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBhc3NpZ25WYWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gemlwT2JqZWN0O1xuIiwgIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGxvZGFzaDtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBsb2Rhc2ggPSB7XG4gICAgICBjbG9uZURlZXA6IHJlcXVpcmUoXCJsb2Rhc2gvY2xvbmVEZWVwXCIpLFxuICAgICAgY29uc3RhbnQ6IHJlcXVpcmUoXCJsb2Rhc2gvY29uc3RhbnRcIiksXG4gICAgICBkZWZhdWx0czogcmVxdWlyZShcImxvZGFzaC9kZWZhdWx0c1wiKSxcbiAgICAgIGVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZWFjaFwiKSxcbiAgICAgIGZpbHRlcjogcmVxdWlyZShcImxvZGFzaC9maWx0ZXJcIiksXG4gICAgICBmaW5kOiByZXF1aXJlKFwibG9kYXNoL2ZpbmRcIiksXG4gICAgICBmbGF0dGVuOiByZXF1aXJlKFwibG9kYXNoL2ZsYXR0ZW5cIiksXG4gICAgICBmb3JFYWNoOiByZXF1aXJlKFwibG9kYXNoL2ZvckVhY2hcIiksXG4gICAgICBmb3JJbjogcmVxdWlyZShcImxvZGFzaC9mb3JJblwiKSxcbiAgICAgIGhhczogIHJlcXVpcmUoXCJsb2Rhc2gvaGFzXCIpLFxuICAgICAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoXCJsb2Rhc2gvaXNVbmRlZmluZWRcIiksXG4gICAgICBsYXN0OiByZXF1aXJlKFwibG9kYXNoL2xhc3RcIiksXG4gICAgICBtYXA6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpLFxuICAgICAgbWFwVmFsdWVzOiByZXF1aXJlKFwibG9kYXNoL21hcFZhbHVlc1wiKSxcbiAgICAgIG1heDogcmVxdWlyZShcImxvZGFzaC9tYXhcIiksXG4gICAgICBtZXJnZTogcmVxdWlyZShcImxvZGFzaC9tZXJnZVwiKSxcbiAgICAgIG1pbjogcmVxdWlyZShcImxvZGFzaC9taW5cIiksXG4gICAgICBtaW5CeTogcmVxdWlyZShcImxvZGFzaC9taW5CeVwiKSxcbiAgICAgIG5vdzogcmVxdWlyZShcImxvZGFzaC9ub3dcIiksXG4gICAgICBwaWNrOiByZXF1aXJlKFwibG9kYXNoL3BpY2tcIiksXG4gICAgICByYW5nZTogcmVxdWlyZShcImxvZGFzaC9yYW5nZVwiKSxcbiAgICAgIHJlZHVjZTogcmVxdWlyZShcImxvZGFzaC9yZWR1Y2VcIiksXG4gICAgICBzb3J0Qnk6IHJlcXVpcmUoXCJsb2Rhc2gvc29ydEJ5XCIpLFxuICAgICAgdW5pcXVlSWQ6IHJlcXVpcmUoXCJsb2Rhc2gvdW5pcXVlSWRcIiksXG4gICAgICB2YWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvdmFsdWVzXCIpLFxuICAgICAgemlwT2JqZWN0OiByZXF1aXJlKFwibG9kYXNoL3ppcE9iamVjdFwiKSxcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghbG9kYXNoKSB7XG4gIGxvZGFzaCA9IHdpbmRvdy5fO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiIsICIvKlxuICogU2ltcGxlIGRvdWJseSBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGZyb20gQ29ybWVuLCBldCBhbC4sXG4gKiBcIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zXCIuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0O1xuXG5mdW5jdGlvbiBMaXN0KCkge1xuICB2YXIgc2VudGluZWwgPSB7fTtcbiAgc2VudGluZWwuX25leHQgPSBzZW50aW5lbC5fcHJldiA9IHNlbnRpbmVsO1xuICB0aGlzLl9zZW50aW5lbCA9IHNlbnRpbmVsO1xufVxuXG5MaXN0LnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsO1xuICB2YXIgZW50cnkgPSBzZW50aW5lbC5fcHJldjtcbiAgaWYgKGVudHJ5ICE9PSBzZW50aW5lbCkge1xuICAgIHVubGluayhlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG5MaXN0LnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24oZW50cnkpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIGlmIChlbnRyeS5fcHJldiAmJiBlbnRyeS5fbmV4dCkge1xuICAgIHVubGluayhlbnRyeSk7XG4gIH1cbiAgZW50cnkuX25leHQgPSBzZW50aW5lbC5fbmV4dDtcbiAgc2VudGluZWwuX25leHQuX3ByZXYgPSBlbnRyeTtcbiAgc2VudGluZWwuX25leHQgPSBlbnRyeTtcbiAgZW50cnkuX3ByZXYgPSBzZW50aW5lbDtcbn07XG5cbkxpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdHJzID0gW107XG4gIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsO1xuICB2YXIgY3VyciA9IHNlbnRpbmVsLl9wcmV2O1xuICB3aGlsZSAoY3VyciAhPT0gc2VudGluZWwpIHtcbiAgICBzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VyciwgZmlsdGVyT3V0TGlua3MpKTtcbiAgICBjdXJyID0gY3Vyci5fcHJldjtcbiAgfVxuICByZXR1cm4gXCJbXCIgKyBzdHJzLmpvaW4oXCIsIFwiKSArIFwiXVwiO1xufTtcblxuZnVuY3Rpb24gdW5saW5rKGVudHJ5KSB7XG4gIGVudHJ5Ll9wcmV2Ll9uZXh0ID0gZW50cnkuX25leHQ7XG4gIGVudHJ5Ll9uZXh0Ll9wcmV2ID0gZW50cnkuX3ByZXY7XG4gIGRlbGV0ZSBlbnRyeS5fbmV4dDtcbiAgZGVsZXRlIGVudHJ5Ll9wcmV2O1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLCB2KSB7XG4gIGlmIChrICE9PSBcIl9uZXh0XCIgJiYgayAhPT0gXCJfcHJldlwiKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIExpc3QgPSByZXF1aXJlKFwiLi9kYXRhL2xpc3RcIik7XG5cbi8qXG4gKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrXG4gKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuXG4gKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgXCJBIGZhc3QgYW5kXG4gKiBlZmZlY3RpdmUgaGV1cmlzdGljIGZvciB0aGUgZmVlZGJhY2sgYXJjIHNldCBwcm9ibGVtLlwiIFRoaXMgaW1wbGVtZW50YXRpb25cbiAqIGFkanVzdHMgdGhhdCBmcm9tIHRoZSBwYXBlciB0byBhbGxvdyBmb3Igd2VpZ2h0ZWQgZWRnZXMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ3JlZWR5RkFTO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRk4gPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBncmVlZHlGQVMoZywgd2VpZ2h0Rm4pIHtcbiAgaWYgKGcubm9kZUNvdW50KCkgPD0gMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgc3RhdGUgPSBidWlsZFN0YXRlKGcsIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZOKTtcbiAgdmFyIHJlc3VsdHMgPSBkb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCwgc3RhdGUuYnVja2V0cywgc3RhdGUuemVyb0lkeCk7XG5cbiAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzXG4gIHJldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTtcbiAgfSksIHRydWUpO1xufVxuXG5mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLCBidWNrZXRzLCB6ZXJvSWR4KSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBzb3VyY2VzID0gYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdO1xuICB2YXIgc2lua3MgPSBidWNrZXRzWzBdO1xuXG4gIHZhciBlbnRyeTtcbiAgd2hpbGUgKGcubm9kZUNvdW50KCkpIHtcbiAgICB3aGlsZSAoKGVudHJ5ID0gc2lua3MuZGVxdWV1ZSgpKSkgICB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgd2hpbGUgKChlbnRyeSA9IHNvdXJjZXMuZGVxdWV1ZSgpKSkgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfVxuICAgIGlmIChnLm5vZGVDb3VudCgpKSB7XG4gICAgICBmb3IgKHZhciBpID0gYnVja2V0cy5sZW5ndGggLSAyOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIGVudHJ5ID0gYnVja2V0c1tpXS5kZXF1ZXVlKCk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCB0cnVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgY29sbGVjdFByZWRlY2Vzc29ycykge1xuICB2YXIgcmVzdWx0cyA9IGNvbGxlY3RQcmVkZWNlc3NvcnMgPyBbXSA6IHVuZGVmaW5lZDtcblxuICBfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdUVudHJ5ID0gZy5ub2RlKGVkZ2Uudik7XG5cbiAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykge1xuICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7XG4gICAgfVxuXG4gICAgdUVudHJ5Lm91dCAtPSB3ZWlnaHQ7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIHVFbnRyeSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHdlaWdodCA9IGcuZWRnZShlZGdlKTtcbiAgICB2YXIgdyA9IGVkZ2UudztcbiAgICB2YXIgd0VudHJ5ID0gZy5ub2RlKHcpO1xuICAgIHdFbnRyeVtcImluXCJdIC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgd0VudHJ5KTtcbiAgfSk7XG5cbiAgZy5yZW1vdmVOb2RlKGVudHJ5LnYpO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YXRlKGcsIHdlaWdodEZuKSB7XG4gIHZhciBmYXNHcmFwaCA9IG5ldyBHcmFwaCgpO1xuICB2YXIgbWF4SW4gPSAwO1xuICB2YXIgbWF4T3V0ID0gMDtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsIFwiaW5cIjogMCwgb3V0OiAwIH0pO1xuICB9KTtcblxuICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlc1xuICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDtcbiAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7XG4gICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0O1xuICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpO1xuICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpO1xuICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpW1wiaW5cIl0gICs9IHdlaWdodCk7XG4gIH0pO1xuXG4gIHZhciBidWNrZXRzID0gXy5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBMaXN0KCk7IH0pO1xuICB2YXIgemVyb0lkeCA9IG1heEluICsgMTtcblxuICBfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBmYXNHcmFwaC5ub2RlKHYpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgZ3JhcGg6IGZhc0dyYXBoLCBidWNrZXRzOiBidWNrZXRzLCB6ZXJvSWR4OiB6ZXJvSWR4IH07XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkge1xuICBpZiAoIWVudHJ5Lm91dCkge1xuICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSBpZiAoIWVudHJ5W1wiaW5cIl0pIHtcbiAgICBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV0uZW5xdWV1ZShlbnRyeSk7XG4gIH0gZWxzZSB7XG4gICAgYnVja2V0c1tlbnRyeS5vdXQgLSBlbnRyeVtcImluXCJdICsgemVyb0lkeF0uZW5xdWV1ZShlbnRyeSk7XG4gIH1cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgZ3JlZWR5RkFTID0gcmVxdWlyZShcIi4vZ3JlZWR5LWZhc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICB1bmRvOiB1bmRvXG59O1xuXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgZmFzID0gKGcuZ3JhcGgoKS5hY3ljbGljZXIgPT09IFwiZ3JlZWR5XCJcbiAgICA/IGdyZWVkeUZBUyhnLCB3ZWlnaHRGbihnKSlcbiAgICA6IGRmc0ZBUyhnKSk7XG4gIF8uZm9yRWFjaChmYXMsIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7XG4gICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIGxhYmVsLmZvcndhcmROYW1lID0gZS5uYW1lO1xuICAgIGxhYmVsLnJldmVyc2VkID0gdHJ1ZTtcbiAgICBnLnNldEVkZ2UoZS53LCBlLnYsIGxhYmVsLCBfLnVuaXF1ZUlkKFwicmV2XCIpKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gd2VpZ2h0Rm4oZykge1xuICAgIHJldHVybiBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gZy5lZGdlKGUpLndlaWdodDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGRmc0ZBUyhnKSB7XG4gIHZhciBmYXMgPSBbXTtcbiAgdmFyIHN0YWNrID0ge307XG4gIHZhciB2aXNpdGVkID0ge307XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG4gICAgc3RhY2tbdl0gPSB0cnVlO1xuICAgIF8uZm9yRWFjaChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBpZiAoXy5oYXMoc3RhY2ssIGUudykpIHtcbiAgICAgICAgZmFzLnB1c2goZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZnMoZS53KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZWxldGUgc3RhY2tbdl07XG4gIH1cblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBkZnMpO1xuICByZXR1cm4gZmFzO1xufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBpZiAobGFiZWwucmV2ZXJzZWQpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcblxuICAgICAgdmFyIGZvcndhcmROYW1lID0gbGFiZWwuZm9yd2FyZE5hbWU7XG4gICAgICBkZWxldGUgbGFiZWwucmV2ZXJzZWQ7XG4gICAgICBkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7XG4gICAgICBnLnNldEVkZ2UoZS53LCBlLnYsIGxhYmVsLCBmb3J3YXJkTmFtZSk7XG4gICAgfVxuICB9KTtcbn1cbiIsICIvKiBlc2xpbnQgXCJuby1jb25zb2xlXCI6IG9mZiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZER1bW15Tm9kZTogYWRkRHVtbXlOb2RlLFxuICBzaW1wbGlmeTogc2ltcGxpZnksXG4gIGFzTm9uQ29tcG91bmRHcmFwaDogYXNOb25Db21wb3VuZEdyYXBoLFxuICBzdWNjZXNzb3JXZWlnaHRzOiBzdWNjZXNzb3JXZWlnaHRzLFxuICBwcmVkZWNlc3NvcldlaWdodHM6IHByZWRlY2Vzc29yV2VpZ2h0cyxcbiAgaW50ZXJzZWN0UmVjdDogaW50ZXJzZWN0UmVjdCxcbiAgYnVpbGRMYXllck1hdHJpeDogYnVpbGRMYXllck1hdHJpeCxcbiAgbm9ybWFsaXplUmFua3M6IG5vcm1hbGl6ZVJhbmtzLFxuICByZW1vdmVFbXB0eVJhbmtzOiByZW1vdmVFbXB0eVJhbmtzLFxuICBhZGRCb3JkZXJOb2RlOiBhZGRCb3JkZXJOb2RlLFxuICBtYXhSYW5rOiBtYXhSYW5rLFxuICBwYXJ0aXRpb246IHBhcnRpdGlvbixcbiAgdGltZTogdGltZSxcbiAgbm90aW1lOiBub3RpbWVcbn07XG5cbi8qXG4gKiBBZGRzIGEgZHVtbXkgbm9kZSB0byB0aGUgZ3JhcGggYW5kIHJldHVybiB2LlxuICovXG5mdW5jdGlvbiBhZGREdW1teU5vZGUoZywgdHlwZSwgYXR0cnMsIG5hbWUpIHtcbiAgdmFyIHY7XG4gIGRvIHtcbiAgICB2ID0gXy51bmlxdWVJZChuYW1lKTtcbiAgfSB3aGlsZSAoZy5oYXNOb2RlKHYpKTtcblxuICBhdHRycy5kdW1teSA9IHR5cGU7XG4gIGcuc2V0Tm9kZSh2LCBhdHRycyk7XG4gIHJldHVybiB2O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBncmFwaCB3aXRoIG9ubHkgc2ltcGxlIGVkZ2VzLiBIYW5kbGVzIGFnZ3JlZ2F0aW9uIG9mIGRhdGFcbiAqIGFzc29jaWF0ZWQgd2l0aCBtdWx0aS1lZGdlcy5cbiAqL1xuZnVuY3Rpb24gc2ltcGxpZnkoZykge1xuICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCgpLnNldEdyYXBoKGcuZ3JhcGgoKSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHNpbXBsZUxhYmVsID0gc2ltcGxpZmllZC5lZGdlKGUudiwgZS53KSB8fCB7IHdlaWdodDogMCwgbWlubGVuOiAxIH07XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLnYsIGUudywge1xuICAgICAgd2VpZ2h0OiBzaW1wbGVMYWJlbC53ZWlnaHQgKyBsYWJlbC53ZWlnaHQsXG4gICAgICBtaW5sZW46IE1hdGgubWF4KHNpbXBsZUxhYmVsLm1pbmxlbiwgbGFiZWwubWlubGVuKVxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKSB7XG4gIHZhciBzaW1wbGlmaWVkID0gbmV3IEdyYXBoKHsgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSB9KS5zZXRHcmFwaChnLmdyYXBoKCkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKCFnLmNoaWxkcmVuKHYpLmxlbmd0aCkge1xuICAgICAgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7XG4gICAgfVxuICB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLCBnLmVkZ2UoZSkpO1xuICB9KTtcbiAgcmV0dXJuIHNpbXBsaWZpZWQ7XG59XG5cbmZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHN1Y3MgPSB7fTtcbiAgICBfLmZvckVhY2goZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgc3Vjc1tlLnddID0gKHN1Y3NbZS53XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Y3M7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG5mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZykge1xuICB2YXIgd2VpZ2h0TWFwID0gXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHByZWRzID0ge307XG4gICAgXy5mb3JFYWNoKGcuaW5FZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcHJlZHNbZS52XSA9IChwcmVkc1tlLnZdIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJlZHM7XG4gIH0pO1xuICByZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLCB3ZWlnaHRNYXApO1xufVxuXG4vKlxuICogRmluZHMgd2hlcmUgYSBsaW5lIHN0YXJ0aW5nIGF0IHBvaW50ICh7eCwgeX0pIHdvdWxkIGludGVyc2VjdCBhIHJlY3RhbmdsZVxuICogKHt4LCB5LCB3aWR0aCwgaGVpZ2h0fSkgaWYgaXQgd2VyZSBwb2ludGluZyBhdCB0aGUgcmVjdGFuZ2xlJ3MgY2VudGVyLlxuICovXG5mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QsIHBvaW50KSB7XG4gIHZhciB4ID0gcmVjdC54O1xuICB2YXIgeSA9IHJlY3QueTtcblxuICAvLyBSZWN0YW5nbGUgaW50ZXJzZWN0aW9uIGFsZ29yaXRobSBmcm9tOlxuICAvLyBodHRwOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTA4MTEzL2ZpbmQtZWRnZS1iZXR3ZWVuLXR3by1ib3hlc1xuICB2YXIgZHggPSBwb2ludC54IC0geDtcbiAgdmFyIGR5ID0gcG9pbnQueSAtIHk7XG4gIHZhciB3ID0gcmVjdC53aWR0aCAvIDI7XG4gIHZhciBoID0gcmVjdC5oZWlnaHQgLyAyO1xuXG4gIGlmICghZHggJiYgIWR5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlXCIpO1xuICB9XG5cbiAgdmFyIHN4LCBzeTtcbiAgaWYgKE1hdGguYWJzKGR5KSAqIHcgPiBNYXRoLmFicyhkeCkgKiBoKSB7XG4gICAgLy8gSW50ZXJzZWN0aW9uIGlzIHRvcCBvciBib3R0b20gb2YgcmVjdC5cbiAgICBpZiAoZHkgPCAwKSB7XG4gICAgICBoID0gLWg7XG4gICAgfVxuICAgIHN4ID0gaCAqIGR4IC8gZHk7XG4gICAgc3kgPSBoO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVyc2VjdGlvbiBpcyBsZWZ0IG9yIHJpZ2h0IG9mIHJlY3QuXG4gICAgaWYgKGR4IDwgMCkge1xuICAgICAgdyA9IC13O1xuICAgIH1cbiAgICBzeCA9IHc7XG4gICAgc3kgPSB3ICogZHkgLyBkeDtcbiAgfVxuXG4gIHJldHVybiB7IHg6IHggKyBzeCwgeTogeSArIHN5IH07XG59XG5cbi8qXG4gKiBHaXZlbiBhIERBRyB3aXRoIGVhY2ggbm9kZSBhc3NpZ25lZCBcInJhbmtcIiBhbmQgXCJvcmRlclwiIHByb3BlcnRpZXMsIHRoaXNcbiAqIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZSBhIG1hdHJpeCB3aXRoIHRoZSBpZHMgb2YgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpIHtcbiAgdmFyIGxheWVyaW5nID0gXy5tYXAoXy5yYW5nZShtYXhSYW5rKGcpICsgMSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0pO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIHJhbmsgPSBub2RlLnJhbms7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHJhbmspKSB7XG4gICAgICBsYXllcmluZ1tyYW5rXVtub2RlLm9yZGVyXSA9IHY7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxheWVyaW5nO1xufVxuXG4vKlxuICogQWRqdXN0cyB0aGUgcmFua3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggc3VjaCB0aGF0IGFsbCBub2RlcyB2IGhhdmVcbiAqIHJhbmsodikgPj0gMCBhbmQgYXQgbGVhc3Qgb25lIG5vZGUgdyBoYXMgcmFuayh3KSA9IDAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpIHtcbiAgdmFyIG1pbiA9IF8ubWluKF8ubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyhub2RlLCBcInJhbmtcIikpIHtcbiAgICAgIG5vZGUucmFuayAtPSBtaW47XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKSB7XG4gIC8vIFJhbmtzIG1heSBub3Qgc3RhcnQgYXQgMCwgc28gd2UgbmVlZCB0byBvZmZzZXQgdGhlbVxuICB2YXIgb2Zmc2V0ID0gXy5taW4oXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuXG4gIHZhciBsYXllcnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciByYW5rID0gZy5ub2RlKHYpLnJhbmsgLSBvZmZzZXQ7XG4gICAgaWYgKCFsYXllcnNbcmFua10pIHtcbiAgICAgIGxheWVyc1tyYW5rXSA9IFtdO1xuICAgIH1cbiAgICBsYXllcnNbcmFua10ucHVzaCh2KTtcbiAgfSk7XG5cbiAgdmFyIGRlbHRhID0gMDtcbiAgdmFyIG5vZGVSYW5rRmFjdG9yID0gZy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO1xuICBfLmZvckVhY2gobGF5ZXJzLCBmdW5jdGlvbih2cywgaSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHZzKSAmJiBpICUgbm9kZVJhbmtGYWN0b3IgIT09IDApIHtcbiAgICAgIC0tZGVsdGE7XG4gICAgfSBlbHNlIGlmIChkZWx0YSkge1xuICAgICAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7IGcubm9kZSh2KS5yYW5rICs9IGRlbHRhOyB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByZWZpeCwgcmFuaywgb3JkZXIpIHtcbiAgdmFyIG5vZGUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwXG4gIH07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIHtcbiAgICBub2RlLnJhbmsgPSByYW5rO1xuICAgIG5vZGUub3JkZXIgPSBvcmRlcjtcbiAgfVxuICByZXR1cm4gYWRkRHVtbXlOb2RlKGcsIFwiYm9yZGVyXCIsIG5vZGUsIHByZWZpeCk7XG59XG5cbmZ1bmN0aW9uIG1heFJhbmsoZykge1xuICByZXR1cm4gXy5tYXgoXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocmFuaykpIHtcbiAgICAgIHJldHVybiByYW5rO1xuICAgIH1cbiAgfSkpO1xufVxuXG4vKlxuICogUGFydGl0aW9uIGEgY29sbGVjdGlvbiBpbnRvIHR3byBncm91cHM6IGBsaHNgIGFuZCBgcmhzYC4gSWYgdGhlIHN1cHBsaWVkXG4gKiBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGFuIGVudHJ5IGl0IGdvZXMgaW50byBgbGhzYC4gT3RoZXJ3aXNlIGl0IGdvZXNcbiAqIGludG8gYHJocy5cbiAqL1xuZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sIGZuKSB7XG4gIHZhciByZXN1bHQgPSB7IGxoczogW10sIHJoczogW10gfTtcbiAgXy5mb3JFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKGZuKHZhbHVlKSkge1xuICAgICAgcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnJocy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKlxuICogUmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmbmAgd2l0aCBhIHRpbWVyLiBUaGUgd3JhcHBlciBsb2dzIHRoZVxuICogdGltZSBpdCB0YWtlcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGltZShuYW1lLCBmbikge1xuICB2YXIgc3RhcnQgPSBfLm5vdygpO1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnNvbGUubG9nKG5hbWUgKyBcIiB0aW1lOiBcIiArIChfLm5vdygpIC0gc3RhcnQpICsgXCJtc1wiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RpbWUobmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbi8qXG4gKiBCcmVha3MgYW55IGxvbmcgZWRnZXMgaW4gdGhlIGdyYXBoIGludG8gc2hvcnQgc2VnbWVudHMgdGhhdCBzcGFuIDEgbGF5ZXJcbiAqIGVhY2guIFRoaXMgb3BlcmF0aW9uIGlzIHVuZG9hYmxlIHdpdGggdGhlIGRlbm9ybWFsaXplIGZ1bmN0aW9uLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBpcyBhIERBRy5cbiAqICAgIDIuIEVhY2ggbm9kZSBpbiB0aGUgZ3JhcGggaGFzIGEgXCJyYW5rXCIgcHJvcGVydHkuXG4gKlxuICogUG9zdC1jb25kaXRpb246XG4gKlxuICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuXG4gKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSBcImR1bW15Q2hhaW5zXCIgYXR0cmlidXRlIHdoaWNoIGNvbnRhaW5zXG4gKiAgICAgICB0aGUgZmlyc3QgZHVtbXkgaW4gZWFjaCBjaGFpbiBvZiBkdW1teSBub2RlcyBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZywgZSkge1xuICB2YXIgdiA9IGUudjtcbiAgdmFyIHZSYW5rID0gZy5ub2RlKHYpLnJhbms7XG4gIHZhciB3ID0gZS53O1xuICB2YXIgd1JhbmsgPSBnLm5vZGUodykucmFuaztcbiAgdmFyIG5hbWUgPSBlLm5hbWU7XG4gIHZhciBlZGdlTGFiZWwgPSBnLmVkZ2UoZSk7XG4gIHZhciBsYWJlbFJhbmsgPSBlZGdlTGFiZWwubGFiZWxSYW5rO1xuXG4gIGlmICh3UmFuayA9PT0gdlJhbmsgKyAxKSByZXR1cm47XG5cbiAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gIHZhciBkdW1teSwgYXR0cnMsIGk7XG4gIGZvciAoaSA9IDAsICsrdlJhbms7IHZSYW5rIDwgd1Jhbms7ICsraSwgKyt2UmFuaykge1xuICAgIGVkZ2VMYWJlbC5wb2ludHMgPSBbXTtcbiAgICBhdHRycyA9IHtcbiAgICAgIHdpZHRoOiAwLCBoZWlnaHQ6IDAsXG4gICAgICBlZGdlTGFiZWw6IGVkZ2VMYWJlbCwgZWRnZU9iajogZSxcbiAgICAgIHJhbms6IHZSYW5rXG4gICAgfTtcbiAgICBkdW1teSA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZVwiLCBhdHRycywgXCJfZFwiKTtcbiAgICBpZiAodlJhbmsgPT09IGxhYmVsUmFuaykge1xuICAgICAgYXR0cnMud2lkdGggPSBlZGdlTGFiZWwud2lkdGg7XG4gICAgICBhdHRycy5oZWlnaHQgPSBlZGdlTGFiZWwuaGVpZ2h0O1xuICAgICAgYXR0cnMuZHVtbXkgPSBcImVkZ2UtbGFiZWxcIjtcbiAgICAgIGF0dHJzLmxhYmVscG9zID0gZWRnZUxhYmVsLmxhYmVscG9zO1xuICAgIH1cbiAgICBnLnNldEVkZ2UodiwgZHVtbXksIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xuICAgIGlmIChpID09PSAwKSB7XG4gICAgICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7XG4gICAgfVxuICAgIHYgPSBkdW1teTtcbiAgfVxuXG4gIGcuc2V0RWRnZSh2LCB3LCB7IHdlaWdodDogZWRnZUxhYmVsLndlaWdodCB9LCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIF8uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgb3JpZ0xhYmVsID0gbm9kZS5lZGdlTGFiZWw7XG4gICAgdmFyIHc7XG4gICAgZy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwgb3JpZ0xhYmVsKTtcbiAgICB3aGlsZSAobm9kZS5kdW1teSkge1xuICAgICAgdyA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICAgIGcucmVtb3ZlTm9kZSh2KTtcbiAgICAgIG9yaWdMYWJlbC5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuICAgICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1sYWJlbFwiKSB7XG4gICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54O1xuICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTtcbiAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgdiA9IHc7XG4gICAgICBub2RlID0gZy5ub2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGxvbmdlc3RQYXRoOiBsb25nZXN0UGF0aCxcbiAgc2xhY2s6IHNsYWNrXG59O1xuXG4vKlxuICogSW5pdGlhbGl6ZXMgcmFua3MgZm9yIHRoZSBpbnB1dCBncmFwaCB1c2luZyB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobS4gVGhpc1xuICogYWxnb3JpdGhtIHNjYWxlcyB3ZWxsIGFuZCBpcyBmYXN0IGluIHByYWN0aWNlLCBpdCB5aWVsZHMgcmF0aGVyIHBvb3JcbiAqIHNvbHV0aW9ucy4gTm9kZXMgYXJlIHB1c2hlZCB0byB0aGUgbG93ZXN0IGxheWVyIHBvc3NpYmxlLCBsZWF2aW5nIHRoZSBib3R0b21cbiAqIHJhbmtzIHdpZGUgYW5kIGxlYXZpbmcgZWRnZXMgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiBIb3dldmVyLCBkdWUgdG8gaXRzXG4gKiBzcGVlZCwgdGhpcyBhbGdvcml0aG0gaXMgZ29vZCBmb3IgZ2V0dGluZyBhbiBpbml0aWFsIHJhbmtpbmcgdGhhdCBjYW4gYmUgZmVkXG4gKiBpbnRvIG90aGVyIGFsZ29yaXRobXMuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gZG9lcyBub3Qgbm9ybWFsaXplIGxheWVycyBiZWNhdXNlIGl0IHdpbGwgYmUgdXNlZCBieSBvdGhlclxuICogYWxnb3JpdGhtcyBpbiBtb3N0IGNhc2VzLiBJZiB1c2luZyB0aGlzIGFsZ29yaXRobSBkaXJlY3RseSwgYmUgc3VyZSB0b1xuICogcnVuIG5vcm1hbGl6ZSBhdCB0aGUgZW5kLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gSW5wdXQgZ3JhcGggbm9kZSBsYWJlbHMgY2FuIGJlIGFzc2lnbmVkIHByb3BlcnRpZXMuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggbm9kZSB3aWxsIGJlIGFzc2lnbiBhbiAodW5ub3JtYWxpemVkKSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuIGxhYmVsLnJhbms7XG4gICAgfVxuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuXG4gICAgdmFyIHJhbmsgPSBfLm1pbihfLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gZGZzKGUudykgLSBnLmVkZ2UoZSkubWlubGVuO1xuICAgIH0pKTtcblxuICAgIGlmIChyYW5rID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDNcbiAgICAgICAgcmFuayA9PT0gdW5kZWZpbmVkIHx8IC8vIHJldHVybiB2YWx1ZSBvZiBfLm1hcChbXSkgZm9yIExvZGFzaCA0XG4gICAgICAgIHJhbmsgPT09IG51bGwpIHsgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtudWxsXSlcbiAgICAgIHJhbmsgPSAwO1xuICAgIH1cblxuICAgIHJldHVybiAobGFiZWwucmFuayA9IHJhbmspO1xuICB9XG5cbiAgXy5mb3JFYWNoKGcuc291cmNlcygpLCBkZnMpO1xufVxuXG4vKlxuICogUmV0dXJucyB0aGUgYW1vdW50IG9mIHNsYWNrIGZvciB0aGUgZ2l2ZW4gZWRnZS4gVGhlIHNsYWNrIGlzIGRlZmluZWQgYXMgdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxlbmd0aCBvZiB0aGUgZWRnZSBhbmQgaXRzIG1pbmltdW0gbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBzbGFjayhnLCBlKSB7XG4gIHJldHVybiBnLm5vZGUoZS53KS5yYW5rIC0gZy5ub2RlKGUudikucmFuayAtIGcuZWRnZShlKS5taW5sZW47XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciBzbGFjayA9IHJlcXVpcmUoXCIuL3V0aWxcIikuc2xhY2s7XG5cbm1vZHVsZS5leHBvcnRzID0gZmVhc2libGVUcmVlO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIHNwYW5uaW5nIHRyZWUgd2l0aCB0aWdodCBlZGdlcyBhbmQgYWRqdXN0ZWQgdGhlIGlucHV0IG5vZGUnc1xuICogcmFua3MgdG8gYWNoaWV2ZSB0aGlzLiBBIHRpZ2h0IGVkZ2UgaXMgb25lIHRoYXQgaXMgaGFzIGEgbGVuZ3RoIHRoYXQgbWF0Y2hlc1xuICogaXRzIFwibWlubGVuXCIgYXR0cmlidXRlLlxuICpcbiAqIFRoZSBiYXNpYyBzdHJ1Y3R1cmUgZm9yIHRoaXMgZnVuY3Rpb24gaXMgZGVyaXZlZCBmcm9tIEdhbnNuZXIsIGV0IGFsLiwgXCJBXG4gKiBUZWNobmlxdWUgZm9yIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLlwiXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEdyYXBoIG11c3QgYmUgY29ubmVjdGVkLlxuICogICAgMy4gR3JhcGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub2RlLlxuICogICAgNS4gR3JhcGggbm9kZXMgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhc3NpZ25lZCBhIFwicmFua1wiIHByb3BlcnR5IHRoYXRcbiAqICAgICAgIHJlc3BlY3RzIHRoZSBcIm1pbmxlblwiIHByb3BlcnR5IG9mIGluY2lkZW50IGVkZ2VzLlxuICogICAgNi4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIGEgXCJtaW5sZW5cIiBwcm9wZXJ0eS5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgLSBHcmFwaCBub2RlcyB3aWxsIGhhdmUgdGhlaXIgcmFuayBhZGp1c3RlZCB0byBlbnN1cmUgdGhhdCBhbGwgZWRnZXMgYXJlXG4gKiAgICAgIHRpZ2h0LlxuICpcbiAqIFJldHVybnMgYSB0cmVlICh1bmRpcmVjdGVkIGdyYXBoKSB0aGF0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIG9ubHkgXCJ0aWdodFwiXG4gKiBlZGdlcy5cbiAqL1xuZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpIHtcbiAgdmFyIHQgPSBuZXcgR3JhcGgoeyBkaXJlY3RlZDogZmFsc2UgfSk7XG5cbiAgLy8gQ2hvb3NlIGFyYml0cmFyeSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgb3VyIHRyZWVcbiAgdmFyIHN0YXJ0ID0gZy5ub2RlcygpWzBdO1xuICB2YXIgc2l6ZSA9IGcubm9kZUNvdW50KCk7XG4gIHQuc2V0Tm9kZShzdGFydCwge30pO1xuXG4gIHZhciBlZGdlLCBkZWx0YTtcbiAgd2hpbGUgKHRpZ2h0VHJlZSh0LCBnKSA8IHNpemUpIHtcbiAgICBlZGdlID0gZmluZE1pblNsYWNrRWRnZSh0LCBnKTtcbiAgICBkZWx0YSA9IHQuaGFzTm9kZShlZGdlLnYpID8gc2xhY2soZywgZWRnZSkgOiAtc2xhY2soZywgZWRnZSk7XG4gICAgc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSk7XG4gIH1cblxuICByZXR1cm4gdDtcbn1cblxuLypcbiAqIEZpbmRzIGEgbWF4aW1hbCB0cmVlIG9mIHRpZ2h0IGVkZ2VzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlXG4gKiB0cmVlLlxuICovXG5mdW5jdGlvbiB0aWdodFRyZWUodCwgZykge1xuICBmdW5jdGlvbiBkZnModikge1xuICAgIF8uZm9yRWFjaChnLm5vZGVFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIGVkZ2VWID0gZS52LFxuICAgICAgICB3ID0gKHYgPT09IGVkZ2VWKSA/IGUudyA6IGVkZ2VWO1xuICAgICAgaWYgKCF0Lmhhc05vZGUodykgJiYgIXNsYWNrKGcsIGUpKSB7XG4gICAgICAgIHQuc2V0Tm9kZSh3LCB7fSk7XG4gICAgICAgIHQuc2V0RWRnZSh2LCB3LCB7fSk7XG4gICAgICAgIGRmcyh3KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF8uZm9yRWFjaCh0Lm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiB0Lm5vZGVDb3VudCgpO1xufVxuXG4vKlxuICogRmluZHMgdGhlIGVkZ2Ugd2l0aCB0aGUgc21hbGxlc3Qgc2xhY2sgdGhhdCBpcyBpbmNpZGVudCBvbiB0cmVlIGFuZCByZXR1cm5zXG4gKiBpdC5cbiAqL1xuZnVuY3Rpb24gZmluZE1pblNsYWNrRWRnZSh0LCBnKSB7XG4gIHJldHVybiBfLm1pbkJ5KGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmICh0Lmhhc05vZGUoZS52KSAhPT0gdC5oYXNOb2RlKGUudykpIHtcbiAgICAgIHJldHVybiBzbGFjayhnLCBlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKSB7XG4gIF8uZm9yRWFjaCh0Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBnLm5vZGUodikucmFuayArPSBkZWx0YTtcbiAgfSk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBmZWFzaWJsZVRyZWUgPSByZXF1aXJlKFwiLi9mZWFzaWJsZS10cmVlXCIpO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcbnZhciBpbml0UmFuayA9IHJlcXVpcmUoXCIuL3V0aWxcIikubG9uZ2VzdFBhdGg7XG52YXIgcHJlb3JkZXIgPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuYWxnLnByZW9yZGVyO1xudmFyIHBvc3RvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucG9zdG9yZGVyO1xudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZShcIi4uL3V0aWxcIikuc2ltcGxpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV0d29ya1NpbXBsZXg7XG5cbi8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3Nlc1xubmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7XG5uZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTtcbm5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTtcbm5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzO1xuXG4vKlxuICogVGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0gYXNzaWducyByYW5rcyB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgaXRlcmF0aXZlbHkgaW1wcm92ZXMgdGhlIHJhbmtpbmcgdG8gcmVkdWNlIHRoZSBsZW5ndGggb2YgZWRnZXMuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgaW5wdXQgZ3JhcGggbXVzdCBiZSBhIERBRy5cbiAqICAgIDIuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIGFuIG9iamVjdCB2YWx1ZS5cbiAqICAgIDMuIEFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggbXVzdCBoYXZlIFwibWlubGVuXCIgYW5kIFwid2VpZ2h0XCIgYXR0cmlidXRlcy5cbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBBbGwgbm9kZXMgaW4gdGhlIGdyYXBoIHdpbGwgaGF2ZSBhbiBhc3NpZ25lZCBcInJhbmtcIiBhdHRyaWJ1dGUgdGhhdCBoYXNcbiAqICAgICAgIGJlZW4gb3B0aW1pemVkIGJ5IHRoZSBuZXR3b3JrIHNpbXBsZXggYWxnb3JpdGhtLiBSYW5rcyBzdGFydCBhdCAwLlxuICpcbiAqXG4gKiBBIHJvdWdoIHNrZXRjaCBvZiB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogICAgMS4gQXNzaWduIGluaXRpYWwgcmFua3MgdG8gZWFjaCBub2RlLiBXZSB1c2UgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0sXG4gKiAgICAgICB3aGljaCBhc3NpZ25zIHJhbmtzIHRvIHRoZSBsb3dlc3QgcG9zaXRpb24gcG9zc2libGUuIEluIGdlbmVyYWwgdGhpc1xuICogICAgICAgbGVhZHMgdG8gdmVyeSB3aWRlIGJvdHRvbSByYW5rcyBhbmQgdW5uZWNlc3NhcmlseSBsb25nIGVkZ2VzLlxuICogICAgMi4gQ29uc3RydWN0IGEgZmVhc2libGUgdGlnaHQgdHJlZS4gQSB0aWdodCB0cmVlIGlzIG9uZSBzdWNoIHRoYXQgYWxsXG4gKiAgICAgICBlZGdlcyBpbiB0aGUgdHJlZSBoYXZlIG5vIHNsYWNrIChkaWZmZXJlbmNlIGJldHdlZW4gbGVuZ3RoIG9mIGVkZ2VcbiAqICAgICAgIGFuZCBtaW5sZW4gZm9yIHRoZSBlZGdlKS4gVGhpcyBieSBpdHNlbGYgZ3JlYXRseSBpbXByb3ZlcyB0aGUgYXNzaWduZWRcbiAqICAgICAgIHJhbmtpbmdzIGJ5IHNob3J0aW5nIGVkZ2VzLlxuICogICAgMy4gSXRlcmF0aXZlbHkgZmluZCBlZGdlcyB0aGF0IGhhdmUgbmVnYXRpdmUgY3V0IHZhbHVlcy4gR2VuZXJhbGx5IGFcbiAqICAgICAgIG5lZ2F0aXZlIGN1dCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZWRnZSBjb3VsZCBiZSByZW1vdmVkIGFuZCBhIG5ld1xuICogICAgICAgdHJlZSBlZGdlIGNvdWxkIGJlIGFkZGVkIHRvIHByb2R1Y2UgYSBtb3JlIGNvbXBhY3QgZ3JhcGguXG4gKlxuICogTXVjaCBvZiB0aGUgYWxnb3JpdGhtcyBoZXJlIGFyZSBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlXG4gKiBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlXG4gKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7XG4gIGcgPSBzaW1wbGlmeShnKTtcbiAgaW5pdFJhbmsoZyk7XG4gIHZhciB0ID0gZmVhc2libGVUcmVlKGcpO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuXG4gIHZhciBlLCBmO1xuICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7XG4gICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTtcbiAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpO1xuICB9XG59XG5cbi8qXG4gKiBJbml0aWFsaXplcyBjdXQgdmFsdWVzIGZvciBhbGwgZWRnZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCwgZykge1xuICB2YXIgdnMgPSBwb3N0b3JkZXIodCwgdC5ub2RlcygpKTtcbiAgdnMgPSB2cy5zbGljZSgwLCB2cy5sZW5ndGggLSAxKTtcbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQ3V0VmFsdWUodCwgZywgdik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkge1xuICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpO1xuICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50O1xuICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpO1xufVxuXG4vKlxuICogR2l2ZW4gdGhlIHRpZ2h0IHRyZWUsIGl0cyBncmFwaCwgYW5kIGEgY2hpbGQgaW4gdGhlIGdyYXBoIGNhbGN1bGF0ZSBhbmRcbiAqIHJldHVybiB0aGUgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoZSBjaGlsZCBhbmQgaXRzIHBhcmVudC5cbiAqL1xuZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIC8vIFRydWUgaWYgdGhlIGNoaWxkIGlzIG9uIHRoZSB0YWlsIGVuZCBvZiB0aGUgZWRnZSBpbiB0aGUgZGlyZWN0ZWQgZ3JhcGhcbiAgdmFyIGNoaWxkSXNUYWlsID0gdHJ1ZTtcbiAgLy8gVGhlIGdyYXBoJ3MgdmlldyBvZiB0aGUgdHJlZSBlZGdlIHdlJ3JlIGluc3BlY3RpbmdcbiAgdmFyIGdyYXBoRWRnZSA9IGcuZWRnZShjaGlsZCwgcGFyZW50KTtcbiAgLy8gVGhlIGFjY3VtdWxhdGVkIGN1dCB2YWx1ZSBmb3IgdGhlIGVkZ2UgYmV0d2VlbiB0aGlzIG5vZGUgYW5kIGl0cyBwYXJlbnRcbiAgdmFyIGN1dFZhbHVlID0gMDtcblxuICBpZiAoIWdyYXBoRWRnZSkge1xuICAgIGNoaWxkSXNUYWlsID0gZmFsc2U7XG4gICAgZ3JhcGhFZGdlID0gZy5lZGdlKHBhcmVudCwgY2hpbGQpO1xuICB9XG5cbiAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0O1xuXG4gIF8uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaXNPdXRFZGdlID0gZS52ID09PSBjaGlsZCxcbiAgICAgIG90aGVyID0gaXNPdXRFZGdlID8gZS53IDogZS52O1xuXG4gICAgaWYgKG90aGVyICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciBwb2ludHNUb0hlYWQgPSBpc091dEVkZ2UgPT09IGNoaWxkSXNUYWlsLFxuICAgICAgICBvdGhlcldlaWdodCA9IGcuZWRnZShlKS53ZWlnaHQ7XG5cbiAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0O1xuICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkge1xuICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlO1xuICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY3V0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSwgcm9vdCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICByb290ID0gdHJlZS5ub2RlcygpWzBdO1xuICB9XG4gIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB7fSwgMSwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHtcbiAgdmFyIGxvdyA9IG5leHRMaW07XG4gIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTtcblxuICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgXy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLCBmdW5jdGlvbih3KSB7XG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCB3KSkge1xuICAgICAgbmV4dExpbSA9IGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB3LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxhYmVsLmxvdyA9IGxvdztcbiAgbGFiZWwubGltID0gbmV4dExpbSsrO1xuICBpZiAocGFyZW50KSB7XG4gICAgbGFiZWwucGFyZW50ID0gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgd2hlbiB3ZSBpbmNyZW1lbnRhbGx5IHVwZGF0ZSBsb3cgbGltXG4gICAgZGVsZXRlIGxhYmVsLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBuZXh0TGltO1xufVxuXG5mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSkge1xuICByZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHJldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWUgPCAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZW50ZXJFZGdlKHQsIGcsIGVkZ2UpIHtcbiAgdmFyIHYgPSBlZGdlLnY7XG4gIHZhciB3ID0gZWRnZS53O1xuXG4gIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlXG4gIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0b1xuICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi5cbiAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHtcbiAgICB2ID0gZWRnZS53O1xuICAgIHcgPSBlZGdlLnY7XG4gIH1cblxuICB2YXIgdkxhYmVsID0gdC5ub2RlKHYpO1xuICB2YXIgd0xhYmVsID0gdC5ub2RlKHcpO1xuICB2YXIgdGFpbExhYmVsID0gdkxhYmVsO1xuICB2YXIgZmxpcCA9IGZhbHNlO1xuXG4gIC8vIElmIHRoZSByb290IGlzIGluIHRoZSB0YWlsIG9mIHRoZSBlZGdlIHRoZW4gd2UgbmVlZCB0byBmbGlwIHRoZSBsb2dpYyB0aGF0XG4gIC8vIGNoZWNrcyBmb3IgdGhlIGhlYWQgYW5kIHRhaWwgbm9kZXMgaW4gdGhlIGNhbmRpZGF0ZXMgZnVuY3Rpb24gYmVsb3cuXG4gIGlmICh2TGFiZWwubGltID4gd0xhYmVsLmxpbSkge1xuICAgIHRhaWxMYWJlbCA9IHdMYWJlbDtcbiAgICBmbGlwID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjYW5kaWRhdGVzID0gXy5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7XG4gICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS52KSwgdGFpbExhYmVsKSAmJlxuICAgICAgICAgICBmbGlwICE9PSBpc0Rlc2NlbmRhbnQodCwgdC5ub2RlKGVkZ2UudyksIHRhaWxMYWJlbCk7XG4gIH0pO1xuXG4gIHJldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LCBnLCBlLCBmKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdyA9IGUudztcbiAgdC5yZW1vdmVFZGdlKHYsIHcpO1xuICB0LnNldEVkZ2UoZi52LCBmLncsIHt9KTtcbiAgaW5pdExvd0xpbVZhbHVlcyh0KTtcbiAgaW5pdEN1dFZhbHVlcyh0LCBnKTtcbiAgdXBkYXRlUmFua3ModCwgZyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHtcbiAgdmFyIHJvb3QgPSBfLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7XG4gIHZhciB2cyA9IHByZW9yZGVyKHQsIHJvb3QpO1xuICB2cyA9IHZzLnNsaWNlKDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcGFyZW50ID0gdC5ub2RlKHYpLnBhcmVudCxcbiAgICAgIGVkZ2UgPSBnLmVkZ2UodiwgcGFyZW50KSxcbiAgICAgIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmICghZWRnZSkge1xuICAgICAgZWRnZSA9IGcuZWRnZShwYXJlbnQsIHYpO1xuICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7XG4gIH0pO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIGlzIGluIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsIHUsIHYpIHtcbiAgcmV0dXJuIHRyZWUuaGFzRWRnZSh1LCB2KTtcbn1cblxuLypcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBub2RlIHBlciB0aGVcbiAqIGFzc2lnbmVkIGxvdyBhbmQgbGltIGF0dHJpYnV0ZXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkge1xuICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIHJhbmtVdGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbnZhciBsb25nZXN0UGF0aCA9IHJhbmtVdGlsLmxvbmdlc3RQYXRoO1xudmFyIGZlYXNpYmxlVHJlZSA9IHJlcXVpcmUoXCIuL2ZlYXNpYmxlLXRyZWVcIik7XG52YXIgbmV0d29ya1NpbXBsZXggPSByZXF1aXJlKFwiLi9uZXR3b3JrLXNpbXBsZXhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuaztcblxuLypcbiAqIEFzc2lnbnMgYSByYW5rIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGggdGhhdCByZXNwZWN0cyB0aGUgXCJtaW5sZW5cIlxuICogY29uc3RyYWludCBzcGVjaWZpZWQgb24gZWRnZXMgYmV0d2VlbiBub2Rlcy5cbiAqXG4gKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvclxuICogRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgY29ubmVjdGVkIERBR1xuICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzXG4gKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgXCJ3ZWlnaHRcIiBhbmQgXCJtaW5sZW5cIiBhdHRyaWJ1dGVzXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSBhIFwicmFua1wiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS4gUmFua3MgY2FuIHN0YXJ0IGF0IGFueSBpbmRleCAoaW5jbHVkaW5nIG5lZ2F0aXZlKSwgd2UnbGxcbiAqICAgICAgIGZpeCB0aGVtIHVwIGxhdGVyLlxuICovXG5mdW5jdGlvbiByYW5rKGcpIHtcbiAgc3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpIHtcbiAgY2FzZSBcIm5ldHdvcmstc2ltcGxleFwiOiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJ0aWdodC10cmVlXCI6IHRpZ2h0VHJlZVJhbmtlcihnKTsgYnJlYWs7XG4gIGNhc2UgXCJsb25nZXN0LXBhdGhcIjogbG9uZ2VzdFBhdGhSYW5rZXIoZyk7IGJyZWFrO1xuICBkZWZhdWx0OiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTtcbiAgfVxufVxuXG4vLyBBIGZhc3QgYW5kIHNpbXBsZSByYW5rZXIsIGJ1dCByZXN1bHRzIGFyZSBmYXIgZnJvbSBvcHRpbWFsLlxudmFyIGxvbmdlc3RQYXRoUmFua2VyID0gbG9uZ2VzdFBhdGg7XG5cbmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKSB7XG4gIGxvbmdlc3RQYXRoKGcpO1xuICBmZWFzaWJsZVRyZWUoZyk7XG59XG5cbmZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpIHtcbiAgbmV0d29ya1NpbXBsZXgoZyk7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyZW50RHVtbXlDaGFpbnM7XG5cbmZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHtcbiAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIoZyk7XG5cbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBlZGdlT2JqID0gbm9kZS5lZGdlT2JqO1xuICAgIHZhciBwYXRoRGF0YSA9IGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIGVkZ2VPYmoudiwgZWRnZU9iai53KTtcbiAgICB2YXIgcGF0aCA9IHBhdGhEYXRhLnBhdGg7XG4gICAgdmFyIGxjYSA9IHBhdGhEYXRhLmxjYTtcbiAgICB2YXIgcGF0aElkeCA9IDA7XG4gICAgdmFyIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICB2YXIgYXNjZW5kaW5nID0gdHJ1ZTtcblxuICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHtcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG5cbiAgICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKChwYXRoViA9IHBhdGhbcGF0aElkeF0pICE9PSBsY2EgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoVikubWF4UmFuayA8IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoViA9PT0gbGNhKSB7XG4gICAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhc2NlbmRpbmcpIHtcbiAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykge1xuICAgICAgICAgIHBhdGhJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07XG4gICAgICB9XG5cbiAgICAgIGcuc2V0UGFyZW50KHYsIHBhdGhWKTtcbiAgICAgIHYgPSBnLnN1Y2Nlc3NvcnModilbMF07XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRmluZCBhIHBhdGggZnJvbSB2IHRvIHcgdGhyb3VnaCB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciAoTENBKS4gUmV0dXJuIHRoZVxuLy8gZnVsbCBwYXRoIGFuZCB0aGUgTENBLlxuZnVuY3Rpb24gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgdiwgdykge1xuICB2YXIgdlBhdGggPSBbXTtcbiAgdmFyIHdQYXRoID0gW107XG4gIHZhciBsb3cgPSBNYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdywgcG9zdG9yZGVyTnVtc1t3XS5sb3cpO1xuICB2YXIgbGltID0gTWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0sIHBvc3RvcmRlck51bXNbd10ubGltKTtcbiAgdmFyIHBhcmVudDtcbiAgdmFyIGxjYTtcblxuICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBXG4gIHBhcmVudCA9IHY7XG4gIGRvIHtcbiAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpO1xuICAgIHZQYXRoLnB1c2gocGFyZW50KTtcbiAgfSB3aGlsZSAocGFyZW50ICYmXG4gICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtcbiAgbGNhID0gcGFyZW50O1xuXG4gIC8vIFRyYXZlcnNlIGZyb20gdyB0byBMQ0FcbiAgcGFyZW50ID0gdztcbiAgd2hpbGUgKChwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpKSAhPT0gbGNhKSB7XG4gICAgd1BhdGgucHVzaChwYXJlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aDogdlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksIGxjYTogbGNhIH07XG59XG5cbmZ1bmN0aW9uIHBvc3RvcmRlcihnKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIGxpbSA9IDA7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbG93ID0gbGltO1xuICAgIF8uZm9yRWFjaChnLmNoaWxkcmVuKHYpLCBkZnMpO1xuICAgIHJlc3VsdFt2XSA9IHsgbG93OiBsb3csIGxpbTogbGltKysgfTtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgY2xlYW51cDogY2xlYW51cFxufTtcblxuLypcbiAqIEEgbmVzdGluZyBncmFwaCBjcmVhdGVzIGR1bW15IG5vZGVzIGZvciB0aGUgdG9wcyBhbmQgYm90dG9tcyBvZiBzdWJncmFwaHMsXG4gKiBhZGRzIGFwcHJvcHJpYXRlIGVkZ2VzIHRvIGVuc3VyZSB0aGF0IGFsbCBjbHVzdGVyIG5vZGVzIGFyZSBwbGFjZWQgYmV0d2VlblxuICogdGhlc2UgYm91bmRyaWVzLCBhbmQgZW5zdXJlcyB0aGF0IHRoZSBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gd2UgZW5zdXJlLCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIG1pbmxlbiBwcm9wZXJ0eSwgdGhhdCBub2Rlc1xuICogYW5kIHN1YmdyYXBoIGJvcmRlciBub2RlcyB0byBub3QgZW5kIHVwIG9uIHRoZSBzYW1lIHJhbmsuXG4gKlxuICogUHJlY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gTm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhcyBhIG1pbmxlbiBhdHRyaWJ1dGVcbiAqXG4gKiBQb3N0Y29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBjb25uZWN0ZWQuXG4gKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocy5cbiAqICAgIDMuIFRoZSBtaW5sZW4gYXR0cmlidXRlIGZvciBub2RlcyBpcyBhZGp1c3RlZCB0byBlbnN1cmUgbm9kZXMgZG8gbm90XG4gKiAgICAgICBnZXQgcGxhY2VkIG9uIHRoZSBzYW1lIHJhbmsgYXMgc3ViZ3JhcGggYm9yZGVyIG5vZGVzLlxuICpcbiAqIFRoZSBuZXN0aW5nIGdyYXBoIGlkZWEgY29tZXMgZnJvbSBTYW5kZXIsIFwiTGF5b3V0IG9mIENvbXBvdW5kIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqL1xuZnVuY3Rpb24gcnVuKGcpIHtcbiAgdmFyIHJvb3QgPSB1dGlsLmFkZER1bW15Tm9kZShnLCBcInJvb3RcIiwge30sIFwiX3Jvb3RcIik7XG4gIHZhciBkZXB0aHMgPSB0cmVlRGVwdGhzKGcpO1xuICB2YXIgaGVpZ2h0ID0gXy5tYXgoXy52YWx1ZXMoZGVwdGhzKSkgLSAxOyAvLyBOb3RlOiBkZXB0aHMgaXMgYW4gT2JqZWN0IG5vdCBhbiBhcnJheVxuICB2YXIgbm9kZVNlcCA9IDIgKiBoZWlnaHQgKyAxO1xuXG4gIGcuZ3JhcGgoKS5uZXN0aW5nUm9vdCA9IHJvb3Q7XG5cbiAgLy8gTXVsdGlwbHkgbWlubGVuIGJ5IG5vZGVTZXAgdG8gYWxpZ24gbm9kZXMgb24gbm9uLWJvcmRlciByYW5rcy5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBnLmVkZ2UoZSkubWlubGVuICo9IG5vZGVTZXA7IH0pO1xuXG4gIC8vIENhbGN1bGF0ZSBhIHdlaWdodCB0aGF0IGlzIHN1ZmZpY2llbnQgdG8ga2VlcCBzdWJncmFwaHMgdmVydGljYWxseSBjb21wYWN0XG4gIHZhciB3ZWlnaHQgPSBzdW1XZWlnaHRzKGcpICsgMTtcblxuICAvLyBDcmVhdGUgYm9yZGVyIG5vZGVzIGFuZCBsaW5rIHRoZW0gdXBcbiAgXy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuICB9KTtcblxuICAvLyBTYXZlIHRoZSBtdWx0aXBsaWVyIGZvciBub2RlIGxheWVycyBmb3IgbGF0ZXIgcmVtb3ZhbCBvZiBlbXB0eSBib3JkZXJcbiAgLy8gbGF5ZXJzLlxuICBnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3IgPSBub2RlU2VwO1xufVxuXG5mdW5jdGlvbiBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgdikge1xuICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICBpZiAoIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmICh2ICE9PSByb290KSB7XG4gICAgICBnLnNldEVkZ2Uocm9vdCwgdiwgeyB3ZWlnaHQ6IDAsIG1pbmxlbjogbm9kZVNlcCB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRvcCA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9idFwiKTtcbiAgdmFyIGJvdHRvbSA9IHV0aWwuYWRkQm9yZGVyTm9kZShnLCBcIl9iYlwiKTtcbiAgdmFyIGxhYmVsID0gZy5ub2RlKHYpO1xuXG4gIGcuc2V0UGFyZW50KHRvcCwgdik7XG4gIGxhYmVsLmJvcmRlclRvcCA9IHRvcDtcbiAgZy5zZXRQYXJlbnQoYm90dG9tLCB2KTtcbiAgbGFiZWwuYm9yZGVyQm90dG9tID0gYm90dG9tO1xuXG4gIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICBkZnMoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpO1xuXG4gICAgdmFyIGNoaWxkTm9kZSA9IGcubm9kZShjaGlsZCk7XG4gICAgdmFyIGNoaWxkVG9wID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IGNoaWxkTm9kZS5ib3JkZXJUb3AgOiBjaGlsZDtcbiAgICB2YXIgY2hpbGRCb3R0b20gPSBjaGlsZE5vZGUuYm9yZGVyQm90dG9tID8gY2hpbGROb2RlLmJvcmRlckJvdHRvbSA6IGNoaWxkO1xuICAgIHZhciB0aGlzV2VpZ2h0ID0gY2hpbGROb2RlLmJvcmRlclRvcCA/IHdlaWdodCA6IDIgKiB3ZWlnaHQ7XG4gICAgdmFyIG1pbmxlbiA9IGNoaWxkVG9wICE9PSBjaGlsZEJvdHRvbSA/IDEgOiBoZWlnaHQgLSBkZXB0aHNbdl0gKyAxO1xuXG4gICAgZy5zZXRFZGdlKHRvcCwgY2hpbGRUb3AsIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcblxuICAgIGcuc2V0RWRnZShjaGlsZEJvdHRvbSwgYm90dG9tLCB7XG4gICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsXG4gICAgICBtaW5sZW46IG1pbmxlbixcbiAgICAgIG5lc3RpbmdFZGdlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmICghZy5wYXJlbnQodikpIHtcbiAgICBnLnNldEVkZ2Uocm9vdCwgdG9wLCB7IHdlaWdodDogMCwgbWlubGVuOiBoZWlnaHQgKyBkZXB0aHNbdl0gfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJlZURlcHRocyhnKSB7XG4gIHZhciBkZXB0aHMgPSB7fTtcbiAgZnVuY3Rpb24gZGZzKHYsIGRlcHRoKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIGRmcyhjaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZXB0aHNbdl0gPSBkZXB0aDtcbiAgfVxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbih2KSB7IGRmcyh2LCAxKTsgfSk7XG4gIHJldHVybiBkZXB0aHM7XG59XG5cbmZ1bmN0aW9uIHN1bVdlaWdodHMoZykge1xuICByZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLCBmdW5jdGlvbihhY2MsIGUpIHtcbiAgICByZXR1cm4gYWNjICsgZy5lZGdlKGUpLndlaWdodDtcbiAgfSwgMCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXAoZykge1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgZy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO1xuICBkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLm5lc3RpbmdFZGdlKSB7XG4gICAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgfVxuICB9KTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhZGRCb3JkZXJTZWdtZW50cztcblxuZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZykge1xuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgXy5mb3JFYWNoKGNoaWxkcmVuLCBkZnMpO1xuICAgIH1cblxuICAgIGlmIChfLmhhcyhub2RlLCBcIm1pblJhbmtcIikpIHtcbiAgICAgIG5vZGUuYm9yZGVyTGVmdCA9IFtdO1xuICAgICAgbm9kZS5ib3JkZXJSaWdodCA9IFtdO1xuICAgICAgZm9yICh2YXIgcmFuayA9IG5vZGUubWluUmFuaywgbWF4UmFuayA9IG5vZGUubWF4UmFuayArIDE7XG4gICAgICAgIHJhbmsgPCBtYXhSYW5rO1xuICAgICAgICArK3JhbmspIHtcbiAgICAgICAgYWRkQm9yZGVyTm9kZShnLCBcImJvcmRlckxlZnRcIiwgXCJfYmxcIiwgdiwgbm9kZSwgcmFuayk7XG4gICAgICAgIGFkZEJvcmRlck5vZGUoZywgXCJib3JkZXJSaWdodFwiLCBcIl9iclwiLCB2LCBub2RlLCByYW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBkZnMpO1xufVxuXG5mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByb3AsIHByZWZpeCwgc2csIHNnTm9kZSwgcmFuaykge1xuICB2YXIgbGFiZWwgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHJhbms6IHJhbmssIGJvcmRlclR5cGU6IHByb3AgfTtcbiAgdmFyIHByZXYgPSBzZ05vZGVbcHJvcF1bcmFuayAtIDFdO1xuICB2YXIgY3VyciA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiYm9yZGVyXCIsIGxhYmVsLCBwcmVmaXgpO1xuICBzZ05vZGVbcHJvcF1bcmFua10gPSBjdXJyO1xuICBnLnNldFBhcmVudChjdXJyLCBzZyk7XG4gIGlmIChwcmV2KSB7XG4gICAgZy5zZXRFZGdlKHByZXYsIGN1cnIsIHsgd2VpZ2h0OiAxIH0pO1xuICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRqdXN0OiBhZGp1c3QsXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIGFkanVzdChnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwV2lkdGhIZWlnaHQoZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kbyhnKSB7XG4gIHZhciByYW5rRGlyID0gZy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhbmtEaXIgPT09IFwiYnRcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICByZXZlcnNlWShnKTtcbiAgfVxuXG4gIGlmIChyYW5rRGlyID09PSBcImxyXCIgfHwgcmFua0RpciA9PT0gXCJybFwiKSB7XG4gICAgc3dhcFhZKGcpO1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpOyB9KTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKTsgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykge1xuICB2YXIgdyA9IGF0dHJzLndpZHRoO1xuICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDtcbiAgYXR0cnMuaGVpZ2h0ID0gdztcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVkoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldmVyc2VZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHJldmVyc2VZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ5XCIpKSB7XG4gICAgICByZXZlcnNlWU9uZShlZGdlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycykge1xuICBhdHRycy55ID0gLWF0dHJzLnk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIHN3YXBYWU9uZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgc3dhcFhZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycykge1xuICB2YXIgeCA9IGF0dHJzLng7XG4gIGF0dHJzLnggPSBhdHRycy55O1xuICBhdHRycy55ID0geDtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluaXRPcmRlcjtcblxuLypcbiAqIEFzc2lnbnMgYW4gaW5pdGlhbCBvcmRlciB2YWx1ZSBmb3IgZWFjaCBub2RlIGJ5IHBlcmZvcm1pbmcgYSBERlMgc2VhcmNoXG4gKiBzdGFydGluZyBmcm9tIG5vZGVzIGluIHRoZSBmaXJzdCByYW5rLiBOb2RlcyBhcmUgYXNzaWduZWQgYW4gb3JkZXIgaW4gdGhlaXJcbiAqIHJhbmsgYXMgdGhleSBhcmUgZmlyc3QgdmlzaXRlZC5cbiAqXG4gKiBUaGlzIGFwcHJvYWNoIGNvbWVzIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkEgVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkXG4gKiBHcmFwaHMuXCJcbiAqXG4gKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieVxuICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcbiAgdmFyIHNpbXBsZU5vZGVzID0gXy5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDtcbiAgfSk7XG4gIHZhciBtYXhSYW5rID0gXy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG4gIHZhciBsYXllcnMgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICBpZiAoXy5oYXModmlzaXRlZCwgdikpIHJldHVybjtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO1xuICAgIF8uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7XG4gIH1cblxuICB2YXIgb3JkZXJlZFZzID0gXy5zb3J0Qnkoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KTtcbiAgXy5mb3JFYWNoKG9yZGVyZWRWcywgZGZzKTtcblxuICByZXR1cm4gbGF5ZXJzO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY3Jvc3NDb3VudDtcblxuLypcbiAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGxheWVyaW5nIChhbiBhcnJheSBvZiBsYXllcnMsIGVhY2ggd2l0aCBhbiBhcnJheSBvZlxuICogb3JkZXJlcmQgbm9kZXMpIGFuZCBhIGdyYXBoIGFuZCByZXR1cm5zIGEgd2VpZ2h0ZWQgY3Jvc3NpbmcgY291bnQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggbXVzdCBiZSBzaW1wbGUgKG5vdCBhIG11bHRpZ3JhcGgpLCBkaXJlY3RlZCwgYW5kIGluY2x1ZGVcbiAqICAgICAgIG9ubHkgc2ltcGxlIGVkZ2VzLlxuICogICAgMi4gRWRnZXMgaW4gdGhlIGlucHV0IGdyYXBoIG11c3QgaGF2ZSBhc3NpZ25lZCB3ZWlnaHRzLlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBUaGUgZ3JhcGggYW5kIGxheWVyaW5nIG1hdHJpeCBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIEJhcnRoLCBldCBhbC4sIFwiQmlsYXllciBDcm9zcyBDb3VudGluZy5cIlxuICovXG5mdW5jdGlvbiBjcm9zc0NvdW50KGcsIGxheWVyaW5nKSB7XG4gIHZhciBjYyA9IDA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGF5ZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICBjYyArPSB0d29MYXllckNyb3NzQ291bnQoZywgbGF5ZXJpbmdbaS0xXSwgbGF5ZXJpbmdbaV0pO1xuICB9XG4gIHJldHVybiBjYztcbn1cblxuZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsIG5vcnRoTGF5ZXIsIHNvdXRoTGF5ZXIpIHtcbiAgLy8gU29ydCBhbGwgb2YgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIG5vcnRoIGFuZCBzb3V0aCBsYXllcnMgYnkgdGhlaXIgcG9zaXRpb25cbiAgLy8gaW4gdGhlIG5vcnRoIGxheWVyIGFuZCB0aGVuIHRoZSBzb3V0aC4gTWFwIHRoZXNlIGVkZ2VzIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAvLyB0aGVpciBoZWFkIGluIHRoZSBzb3V0aCBsYXllci5cbiAgdmFyIHNvdXRoUG9zID0gXy56aXBPYmplY3Qoc291dGhMYXllcixcbiAgICBfLm1hcChzb3V0aExheWVyLCBmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gaTsgfSkpO1xuICB2YXIgc291dGhFbnRyaWVzID0gXy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5zb3J0QnkoXy5tYXAoZy5vdXRFZGdlcyh2KSwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuIHsgcG9zOiBzb3V0aFBvc1tlLnddLCB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgfTtcbiAgICB9KSwgXCJwb3NcIik7XG4gIH0pLCB0cnVlKTtcblxuICAvLyBCdWlsZCB0aGUgYWNjdW11bGF0b3IgdHJlZVxuICB2YXIgZmlyc3RJbmRleCA9IDE7XG4gIHdoaWxlIChmaXJzdEluZGV4IDwgc291dGhMYXllci5sZW5ndGgpIGZpcnN0SW5kZXggPDw9IDE7XG4gIHZhciB0cmVlU2l6ZSA9IDIgKiBmaXJzdEluZGV4IC0gMTtcbiAgZmlyc3RJbmRleCAtPSAxO1xuICB2YXIgdHJlZSA9IF8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksIGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3NcbiAgdmFyIGNjID0gMDtcbiAgXy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDtcbiAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdmFyIHdlaWdodFN1bSA9IDA7XG4gICAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxO1xuICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0O1xuICAgIH1cbiAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07XG4gIH0pKTtcblxuICByZXR1cm4gY2M7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhcnljZW50ZXI7XG5cbmZ1bmN0aW9uIGJhcnljZW50ZXIoZywgbW92YWJsZSkge1xuICByZXR1cm4gXy5tYXAobW92YWJsZSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpblYgPSBnLmluRWRnZXModik7XG4gICAgaWYgKCFpblYubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2OiB2IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSBfLnJlZHVjZShpblYsIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKSxcbiAgICAgICAgICBub2RlVSA9IGcubm9kZShlLnYpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1bTogYWNjLnN1bSArIChlZGdlLndlaWdodCAqIG5vZGVVLm9yZGVyKSxcbiAgICAgICAgICB3ZWlnaHQ6IGFjYy53ZWlnaHQgKyBlZGdlLndlaWdodFxuICAgICAgICB9O1xuICAgICAgfSwgeyBzdW06IDAsIHdlaWdodDogMCB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdjogdixcbiAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsXG4gICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXNvbHZlQ29uZmxpY3RzO1xuXG4vKlxuICogR2l2ZW4gYSBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0gYW5kIGFcbiAqIGNvbnN0cmFpbnQgZ3JhcGggdGhpcyBmdW5jdGlvbiB3aWxsIHJlc29sdmUgYW55IGNvbmZsaWN0cyBiZXR3ZWVuIHRoZVxuICogY29uc3RyYWludCBncmFwaCBhbmQgdGhlIGJhcnljZW50ZXJzIGZvciB0aGUgZW50cmllcy4gSWYgdGhlIGJhcnljZW50ZXJzIGZvclxuICogYW4gZW50cnkgd291bGQgdmlvbGF0ZSBhIGNvbnN0cmFpbnQgaW4gdGhlIGNvbnN0cmFpbnQgZ3JhcGggdGhlbiB3ZSBjb2FsZXNjZVxuICogdGhlIG5vZGVzIGluIHRoZSBjb25mbGljdCBpbnRvIGEgbmV3IG5vZGUgdGhhdCByZXNwZWN0cyB0aGUgY29udHJhaW50IGFuZFxuICogYWdncmVnYXRlcyBiYXJ5Y2VudGVyIGFuZCB3ZWlnaHQgaW5mb3JtYXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZGVzY3JpcHRpb24gaW4gRm9yc3RlciwgXCJBIEZhc3QgYW5kXG4gKiBTaW1wbGUgSHVlcmlzdGljIGZvciBDb25zdHJhaW5lZCBUd28tTGV2ZWwgQ3Jvc3NpbmcgUmVkdWN0aW9uLFwiIHRob3VnaHQgaXRcbiAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXNcbiAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LlxuICpcbiAqIFJldHVybnM6XG4gKlxuICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3RcbiAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXNcbiAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludFxuICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlXG4gKiAgICBlbGVtZW50cyBpbiBgdnNgLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7XG4gIHZhciBtYXBwZWRFbnRyaWVzID0ge307XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0ge1xuICAgICAgaW5kZWdyZWU6IDAsXG4gICAgICBcImluXCI6IFtdLFxuICAgICAgb3V0OiBbXSxcbiAgICAgIHZzOiBbZW50cnkudl0sXG4gICAgICBpOiBpXG4gICAgfTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpIHtcbiAgICAgIHRtcC5iYXJ5Y2VudGVyID0gZW50cnkuYmFyeWNlbnRlcjtcbiAgICAgIHRtcC53ZWlnaHQgPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07XG4gICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhXy5pc1VuZGVmaW5lZChlbnRyeVcpKSB7XG4gICAgICBlbnRyeVcuaW5kZWdyZWUrKztcbiAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIHNvdXJjZVNldCA9IF8uZmlsdGVyKG1hcHBlZEVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgcmV0dXJuICFlbnRyeS5pbmRlZ3JlZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpO1xufVxuXG5mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7XG4gIHZhciBlbnRyaWVzID0gW107XG5cbiAgZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSkge1xuICAgICAgaWYgKHVFbnRyeS5tZXJnZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpIHx8XG4gICAgICAgICAgXy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICB1RW50cnkuYmFyeWNlbnRlciA+PSB2RW50cnkuYmFyeWNlbnRlcikge1xuICAgICAgICBtZXJnZUVudHJpZXModkVudHJ5LCB1RW50cnkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSkge1xuICAgICAgd0VudHJ5W1wiaW5cIl0ucHVzaCh2RW50cnkpO1xuICAgICAgaWYgKC0td0VudHJ5LmluZGVncmVlID09PSAwKSB7XG4gICAgICAgIHNvdXJjZVNldC5wdXNoKHdFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHdoaWxlIChzb3VyY2VTZXQubGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gc291cmNlU2V0LnBvcCgpO1xuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5W1wiaW5cIl0ucmV2ZXJzZSgpLCBoYW5kbGVJbihlbnRyeSkpO1xuICAgIF8uZm9yRWFjaChlbnRyeS5vdXQsIGhhbmRsZU91dChlbnRyeSkpO1xuICB9XG5cbiAgcmV0dXJuIF8ubWFwKF8uZmlsdGVyKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAhZW50cnkubWVyZ2VkOyB9KSxcbiAgICBmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIF8ucGljayhlbnRyeSwgW1widnNcIiwgXCJpXCIsIFwiYmFyeWNlbnRlclwiLCBcIndlaWdodFwiXSk7XG4gICAgfSk7XG5cbn1cblxuZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBzdW0gPSAwO1xuICB2YXIgd2VpZ2h0ID0gMDtcblxuICBpZiAodGFyZ2V0LndlaWdodCkge1xuICAgIHN1bSArPSB0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHRhcmdldC53ZWlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlLndlaWdodCkge1xuICAgIHN1bSArPSBzb3VyY2UuYmFyeWNlbnRlciAqIHNvdXJjZS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IHNvdXJjZS53ZWlnaHQ7XG4gIH1cblxuICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7XG4gIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0O1xuICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7XG4gIHNvdXJjZS5tZXJnZWQgPSB0cnVlO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydDtcblxuZnVuY3Rpb24gc29ydChlbnRyaWVzLCBiaWFzUmlnaHQpIHtcbiAgdmFyIHBhcnRzID0gdXRpbC5wYXJ0aXRpb24oZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICByZXR1cm4gXy5oYXMoZW50cnksIFwiYmFyeWNlbnRlclwiKTtcbiAgfSk7XG4gIHZhciBzb3J0YWJsZSA9IHBhcnRzLmxocyxcbiAgICB1bnNvcnRhYmxlID0gXy5zb3J0QnkocGFydHMucmhzLCBmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gLWVudHJ5Lmk7IH0pLFxuICAgIHZzID0gW10sXG4gICAgc3VtID0gMCxcbiAgICB3ZWlnaHQgPSAwLFxuICAgIHZzSW5kZXggPSAwO1xuXG4gIHNvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7XG5cbiAgdnNJbmRleCA9IGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCB2c0luZGV4KTtcblxuICBfLmZvckVhY2goc29ydGFibGUsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgIHZzSW5kZXggKz0gZW50cnkudnMubGVuZ3RoO1xuICAgIHZzLnB1c2goZW50cnkudnMpO1xuICAgIHN1bSArPSBlbnRyeS5iYXJ5Y2VudGVyICogZW50cnkud2VpZ2h0O1xuICAgIHdlaWdodCArPSBlbnRyeS53ZWlnaHQ7XG4gICAgdnNJbmRleCA9IGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCB2c0luZGV4KTtcbiAgfSk7XG5cbiAgdmFyIHJlc3VsdCA9IHsgdnM6IF8uZmxhdHRlbih2cywgdHJ1ZSkgfTtcbiAgaWYgKHdlaWdodCkge1xuICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0O1xuICAgIHJlc3VsdC53ZWlnaHQgPSB3ZWlnaHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIGluZGV4KSB7XG4gIHZhciBsYXN0O1xuICB3aGlsZSAodW5zb3J0YWJsZS5sZW5ndGggJiYgKGxhc3QgPSBfLmxhc3QodW5zb3J0YWJsZSkpLmkgPD0gaW5kZXgpIHtcbiAgICB1bnNvcnRhYmxlLnBvcCgpO1xuICAgIHZzLnB1c2gobGFzdC52cyk7XG4gICAgaW5kZXgrKztcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVXaXRoQmlhcyhiaWFzKSB7XG4gIHJldHVybiBmdW5jdGlvbihlbnRyeVYsIGVudHJ5Vykge1xuICAgIGlmIChlbnRyeVYuYmFyeWNlbnRlciA8IGVudHJ5Vy5iYXJ5Y2VudGVyKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChlbnRyeVYuYmFyeWNlbnRlciA+IGVudHJ5Vy5iYXJ5Y2VudGVyKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWJpYXMgPyBlbnRyeVYuaSAtIGVudHJ5Vy5pIDogZW50cnlXLmkgLSBlbnRyeVYuaTtcbiAgfTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgYmFyeWNlbnRlciA9IHJlcXVpcmUoXCIuL2JhcnljZW50ZXJcIik7XG52YXIgcmVzb2x2ZUNvbmZsaWN0cyA9IHJlcXVpcmUoXCIuL3Jlc29sdmUtY29uZmxpY3RzXCIpO1xudmFyIHNvcnQgPSByZXF1aXJlKFwiLi9zb3J0XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRTdWJncmFwaDtcblxuZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsIHYsIGNnLCBiaWFzUmlnaHQpIHtcbiAgdmFyIG1vdmFibGUgPSBnLmNoaWxkcmVuKHYpO1xuICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgdmFyIGJsID0gbm9kZSA/IG5vZGUuYm9yZGVyTGVmdCA6IHVuZGVmaW5lZDtcbiAgdmFyIGJyID0gbm9kZSA/IG5vZGUuYm9yZGVyUmlnaHQ6IHVuZGVmaW5lZDtcbiAgdmFyIHN1YmdyYXBocyA9IHt9O1xuXG4gIGlmIChibCkge1xuICAgIG1vdmFibGUgPSBfLmZpbHRlcihtb3ZhYmxlLCBmdW5jdGlvbih3KSB7XG4gICAgICByZXR1cm4gdyAhPT0gYmwgJiYgdyAhPT0gYnI7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgYmFyeWNlbnRlcnMgPSBiYXJ5Y2VudGVyKGcsIG1vdmFibGUpO1xuICBfLmZvckVhY2goYmFyeWNlbnRlcnMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgaWYgKGcuY2hpbGRyZW4oZW50cnkudikubGVuZ3RoKSB7XG4gICAgICB2YXIgc3ViZ3JhcGhSZXN1bHQgPSBzb3J0U3ViZ3JhcGgoZywgZW50cnkudiwgY2csIGJpYXNSaWdodCk7XG4gICAgICBzdWJncmFwaHNbZW50cnkudl0gPSBzdWJncmFwaFJlc3VsdDtcbiAgICAgIGlmIChfLmhhcyhzdWJncmFwaFJlc3VsdCwgXCJiYXJ5Y2VudGVyXCIpKSB7XG4gICAgICAgIG1lcmdlQmFyeWNlbnRlcnMoZW50cnksIHN1YmdyYXBoUmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHZhciBlbnRyaWVzID0gcmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycywgY2cpO1xuICBleHBhbmRTdWJncmFwaHMoZW50cmllcywgc3ViZ3JhcGhzKTtcblxuICB2YXIgcmVzdWx0ID0gc29ydChlbnRyaWVzLCBiaWFzUmlnaHQpO1xuXG4gIGlmIChibCkge1xuICAgIHJlc3VsdC52cyA9IF8uZmxhdHRlbihbYmwsIHJlc3VsdC52cywgYnJdLCB0cnVlKTtcbiAgICBpZiAoZy5wcmVkZWNlc3NvcnMoYmwpLmxlbmd0aCkge1xuICAgICAgdmFyIGJsUHJlZCA9IGcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLFxuICAgICAgICBiclByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtcbiAgICAgIGlmICghXy5oYXMocmVzdWx0LCBcImJhcnljZW50ZXJcIikpIHtcbiAgICAgICAgcmVzdWx0LmJhcnljZW50ZXIgPSAwO1xuICAgICAgICByZXN1bHQud2VpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gKHJlc3VsdC5iYXJ5Y2VudGVyICogcmVzdWx0LndlaWdodCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBibFByZWQub3JkZXIgKyBiclByZWQub3JkZXIpIC8gKHJlc3VsdC53ZWlnaHQgKyAyKTtcbiAgICAgIHJlc3VsdC53ZWlnaHQgKz0gMjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywgc3ViZ3JhcGhzKSB7XG4gIF8uZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIGVudHJ5LnZzID0gXy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoc3ViZ3JhcGhzW3ZdKSB7XG4gICAgICAgIHJldHVybiBzdWJncmFwaHNbdl0udnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9KSwgdHJ1ZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZUJhcnljZW50ZXJzKHRhcmdldCwgb3RoZXIpIHtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSkge1xuICAgIHRhcmdldC5iYXJ5Y2VudGVyID0gKHRhcmdldC5iYXJ5Y2VudGVyICogdGFyZ2V0LndlaWdodCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuYmFyeWNlbnRlciAqIG90aGVyLndlaWdodCkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldC53ZWlnaHQgKyBvdGhlci53ZWlnaHQpO1xuICAgIHRhcmdldC53ZWlnaHQgKz0gb3RoZXIud2VpZ2h0O1xuICB9IGVsc2Uge1xuICAgIHRhcmdldC5iYXJ5Y2VudGVyID0gb3RoZXIuYmFyeWNlbnRlcjtcbiAgICB0YXJnZXQud2VpZ2h0ID0gb3RoZXIud2VpZ2h0O1xuICB9XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkTGF5ZXJHcmFwaDtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBncmFwaCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNvcnQgYSBsYXllciBvZiBub2Rlcy4gVGhlIGdyYXBoIHdpbGxcbiAqIGNvbnRhaW4gYWxsIGJhc2UgYW5kIHN1YmdyYXBoIG5vZGVzIGZyb20gdGhlIHJlcXVlc3QgbGF5ZXIgaW4gdGhlaXIgb3JpZ2luYWxcbiAqIGhpZXJhcmNoeSBhbmQgYW55IGVkZ2VzIHRoYXQgYXJlIGluY2lkZW50IG9uIHRoZXNlIG5vZGVzIGFuZCBhcmUgb2YgdGhlIHR5cGVcbiAqIHJlcXVlc3RlZCBieSB0aGUgXCJyZWxhdGlvbnNoaXBcIiBwYXJhbWV0ZXIuXG4gKlxuICogTm9kZXMgZnJvbSB0aGUgcmVxdWVzdGVkIHJhbmsgdGhhdCBkbyBub3QgaGF2ZSBwYXJlbnRzIGFyZSBhc3NpZ25lZCBhIHJvb3RcbiAqIG5vZGUgaW4gdGhlIG91dHB1dCBncmFwaCwgd2hpY2ggaXMgc2V0IGluIHRoZSByb290IGdyYXBoIGF0dHJpYnV0ZS4gVGhpc1xuICogbWFrZXMgaXQgZWFzeSB0byB3YWxrIHRoZSBoaWVyYXJjaHkgb2YgbW92YWJsZSBub2RlcyBkdXJpbmcgb3JkZXJpbmcuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgYSBEQUdcbiAqICAgIDIuIEJhc2Ugbm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhdmUgYSByYW5rIGF0dHJpYnV0ZVxuICogICAgMy4gU3ViZ3JhcGggbm9kZXMgaW4gdGhlIGlucHV0IGdyYXBoIGhhcyBtaW5SYW5rIGFuZCBtYXhSYW5rIGF0dHJpYnV0ZXNcbiAqICAgIDQuIEVkZ2VzIGhhdmUgYW4gYXNzaWduZWQgd2VpZ2h0XG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIE91dHB1dCBncmFwaCBoYXMgYWxsIG5vZGVzIGluIHRoZSBtb3ZhYmxlIHJhbmsgd2l0aCBwcmVzZXJ2ZWRcbiAqICAgICAgIGhpZXJhcmNoeS5cbiAqICAgIDIuIFJvb3Qgbm9kZXMgaW4gdGhlIG1vdmFibGUgbGF5ZXIgYXJlIG1hZGUgY2hpbGRyZW4gb2YgdGhlIG5vZGVcbiAqICAgICAgIGluZGljYXRlZCBieSB0aGUgcm9vdCBhdHRyaWJ1dGUgb2YgdGhlIGdyYXBoLlxuICogICAgMy4gTm9uLW1vdmFibGUgbm9kZXMgaW5jaWRlbnQgb24gbW92YWJsZSBub2Rlcywgc2VsZWN0ZWQgYnkgdGhlXG4gKiAgICAgICByZWxhdGlvbnNoaXAgcGFyYW1ldGVyLCBhcmUgaW5jbHVkZWQgaW4gdGhlIGdyYXBoICh3aXRob3V0IGhpZXJhcmNoeSkuXG4gKiAgICA0LiBFZGdlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGUgcmVsYXRpb25zaGlwXG4gKiAgICAgICBwYXJhbWV0ZXIsIGFyZSBhZGRlZCB0byB0aGUgb3V0cHV0IGdyYXBoLlxuICogICAgNS4gVGhlIHdlaWdodHMgZm9yIGNvcGllZCBlZGdlcyBhcmUgYWdncmVnYXRlZCBhcyBuZWVkLCBzaW5jZSB0aGUgb3V0cHV0XG4gKiAgICAgICBncmFwaCBpcyBub3QgYSBtdWx0aS1ncmFwaC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBoKGcsIHJhbmssIHJlbGF0aW9uc2hpcCkge1xuICB2YXIgcm9vdCA9IGNyZWF0ZVJvb3ROb2RlKGcpLFxuICAgIHJlc3VsdCA9IG5ldyBHcmFwaCh7IGNvbXBvdW5kOiB0cnVlIH0pLnNldEdyYXBoKHsgcm9vdDogcm9vdCB9KVxuICAgICAgLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpOyB9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodiksXG4gICAgICBwYXJlbnQgPSBnLnBhcmVudCh2KTtcblxuICAgIGlmIChub2RlLnJhbmsgPT09IHJhbmsgfHwgbm9kZS5taW5SYW5rIDw9IHJhbmsgJiYgcmFuayA8PSBub2RlLm1heFJhbmspIHtcbiAgICAgIHJlc3VsdC5zZXROb2RlKHYpO1xuICAgICAgcmVzdWx0LnNldFBhcmVudCh2LCBwYXJlbnQgfHwgcm9vdCk7XG5cbiAgICAgIC8vIFRoaXMgYXNzdW1lcyB3ZSBoYXZlIG9ubHkgc2hvcnQgZWRnZXMhXG4gICAgICBfLmZvckVhY2goZ1tyZWxhdGlvbnNoaXBdKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciB1ID0gZS52ID09PSB2ID8gZS53IDogZS52LFxuICAgICAgICAgIGVkZ2UgPSByZXN1bHQuZWRnZSh1LCB2KSxcbiAgICAgICAgICB3ZWlnaHQgPSAhXy5pc1VuZGVmaW5lZChlZGdlKSA/IGVkZ2Uud2VpZ2h0IDogMDtcbiAgICAgICAgcmVzdWx0LnNldEVkZ2UodSwgdiwgeyB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgKyB3ZWlnaHQgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKF8uaGFzKG5vZGUsIFwibWluUmFua1wiKSkge1xuICAgICAgICByZXN1bHQuc2V0Tm9kZSh2LCB7XG4gICAgICAgICAgYm9yZGVyTGVmdDogbm9kZS5ib3JkZXJMZWZ0W3JhbmtdLFxuICAgICAgICAgIGJvcmRlclJpZ2h0OiBub2RlLmJvcmRlclJpZ2h0W3JhbmtdXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZykge1xuICB2YXIgdjtcbiAgd2hpbGUgKGcuaGFzTm9kZSgodiA9IF8udW5pcXVlSWQoXCJfcm9vdFwiKSkpKTtcbiAgcmV0dXJuIHY7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZFN1YmdyYXBoQ29uc3RyYWludHM7XG5cbmZ1bmN0aW9uIGFkZFN1YmdyYXBoQ29uc3RyYWludHMoZywgY2csIHZzKSB7XG4gIHZhciBwcmV2ID0ge30sXG4gICAgcm9vdFByZXY7XG5cbiAgXy5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGNoaWxkID0gZy5wYXJlbnQodiksXG4gICAgICBwYXJlbnQsXG4gICAgICBwcmV2Q2hpbGQ7XG4gICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICBwYXJlbnQgPSBnLnBhcmVudChjaGlsZCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZbcGFyZW50XTtcbiAgICAgICAgcHJldltwYXJlbnRdID0gY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2Q2hpbGQgPSByb290UHJldjtcbiAgICAgICAgcm9vdFByZXYgPSBjaGlsZDtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2Q2hpbGQgJiYgcHJldkNoaWxkICE9PSBjaGlsZCkge1xuICAgICAgICBjZy5zZXRFZGdlKHByZXZDaGlsZCwgY2hpbGQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZCA9IHBhcmVudDtcbiAgICB9XG4gIH0pO1xuXG4gIC8qXG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdiA/IGcuY2hpbGRyZW4odikgOiBnLmNoaWxkcmVuKCk7XG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgdmFyIG1pbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICAgICAgICBzdWJncmFwaHMgPSBbXTtcbiAgICAgIF8uZWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkTWluID0gZGZzKGNoaWxkKTtcbiAgICAgICAgaWYgKGcuY2hpbGRyZW4oY2hpbGQpLmxlbmd0aCkge1xuICAgICAgICAgIHN1YmdyYXBocy5wdXNoKHsgdjogY2hpbGQsIG9yZGVyOiBjaGlsZE1pbiB9KTtcbiAgICAgICAgfVxuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGNoaWxkTWluKTtcbiAgICAgIH0pO1xuICAgICAgXy5yZWR1Y2UoXy5zb3J0Qnkoc3ViZ3JhcGhzLCBcIm9yZGVyXCIpLCBmdW5jdGlvbihwcmV2LCBjdXJyKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldi52LCBjdXJyLnYpO1xuICAgICAgICByZXR1cm4gY3VycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgcmV0dXJuIGcubm9kZSh2KS5vcmRlcjtcbiAgfVxuICBkZnModW5kZWZpbmVkKTtcbiAgKi9cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGluaXRPcmRlciA9IHJlcXVpcmUoXCIuL2luaXQtb3JkZXJcIik7XG52YXIgY3Jvc3NDb3VudCA9IHJlcXVpcmUoXCIuL2Nyb3NzLWNvdW50XCIpO1xudmFyIHNvcnRTdWJncmFwaCA9IHJlcXVpcmUoXCIuL3NvcnQtc3ViZ3JhcGhcIik7XG52YXIgYnVpbGRMYXllckdyYXBoID0gcmVxdWlyZShcIi4vYnVpbGQtbGF5ZXItZ3JhcGhcIik7XG52YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyA9IHJlcXVpcmUoXCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50c1wiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gb3JkZXI7XG5cbi8qXG4gKiBBcHBsaWVzIGhldXJpc3RpY3MgdG8gbWluaW1pemUgZWRnZSBjcm9zc2luZ3MgaW4gdGhlIGdyYXBoIGFuZCBzZXRzIHRoZSBiZXN0XG4gKiBvcmRlciBzb2x1dGlvbiBhcyBhbiBvcmRlciBhdHRyaWJ1dGUgb24gZWFjaCBub2RlLlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHMgd2l0aCBhIFwicmFua1wiIGF0dHJpYnV0ZVxuICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSBcIndlaWdodFwiIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBub2RlcyB3aWxsIGhhdmUgYW4gXCJvcmRlclwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGVcbiAqICAgICAgIGFsZ29yaXRobS5cbiAqL1xuZnVuY3Rpb24gb3JkZXIoZykge1xuICB2YXIgbWF4UmFuayA9IHV0aWwubWF4UmFuayhnKSxcbiAgICBkb3duTGF5ZXJHcmFwaHMgPSBidWlsZExheWVyR3JhcGhzKGcsIF8ucmFuZ2UoMSwgbWF4UmFuayArIDEpLCBcImluRWRnZXNcIiksXG4gICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgXCJvdXRFZGdlc1wiKTtcblxuICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXIoZyk7XG4gIGFzc2lnbk9yZGVyKGcsIGxheWVyaW5nKTtcblxuICB2YXIgYmVzdENDID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIGJlc3Q7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHtcbiAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7XG5cbiAgICBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgICB2YXIgY2MgPSBjcm9zc0NvdW50KGcsIGxheWVyaW5nKTtcbiAgICBpZiAoY2MgPCBiZXN0Q0MpIHtcbiAgICAgIGxhc3RCZXN0ID0gMDtcbiAgICAgIGJlc3QgPSBfLmNsb25lRGVlcChsYXllcmluZyk7XG4gICAgICBiZXN0Q0MgPSBjYztcbiAgICB9XG4gIH1cblxuICBhc3NpZ25PcmRlcihnLCBiZXN0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLCByYW5rcywgcmVsYXRpb25zaGlwKSB7XG4gIHJldHVybiBfLm1hcChyYW5rcywgZnVuY3Rpb24ocmFuaykge1xuICAgIHJldHVybiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkge1xuICB2YXIgY2cgPSBuZXcgR3JhcGgoKTtcbiAgXy5mb3JFYWNoKGxheWVyR3JhcGhzLCBmdW5jdGlvbihsZykge1xuICAgIHZhciByb290ID0gbGcuZ3JhcGgoKS5yb290O1xuICAgIHZhciBzb3J0ZWQgPSBzb3J0U3ViZ3JhcGgobGcsIHJvb3QsIGNnLCBiaWFzUmlnaHQpO1xuICAgIF8uZm9yRWFjaChzb3J0ZWQudnMsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIGxnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICAgIGFkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsIGNnLCBzb3J0ZWQudnMpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpIHtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgZy5ub2RlKHYpLm9yZGVyID0gaTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5HcmFwaDtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5cbi8qXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb29yZGluYXRlIGFzc2lnbm1lbnQgYmFzZWQgb24gQnJhbmRlcyBhbmQgS1x1MDBGNnBmLCBcIkZhc3RcbiAqIGFuZCBTaW1wbGUgSG9yaXpvbnRhbCBDb29yZGluYXRlIEFzc2lnbm1lbnQuXCJcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcG9zaXRpb25YOiBwb3NpdGlvblgsXG4gIGZpbmRUeXBlMUNvbmZsaWN0czogZmluZFR5cGUxQ29uZmxpY3RzLFxuICBmaW5kVHlwZTJDb25mbGljdHM6IGZpbmRUeXBlMkNvbmZsaWN0cyxcbiAgYWRkQ29uZmxpY3Q6IGFkZENvbmZsaWN0LFxuICBoYXNDb25mbGljdDogaGFzQ29uZmxpY3QsXG4gIHZlcnRpY2FsQWxpZ25tZW50OiB2ZXJ0aWNhbEFsaWdubWVudCxcbiAgaG9yaXpvbnRhbENvbXBhY3Rpb246IGhvcml6b250YWxDb21wYWN0aW9uLFxuICBhbGlnbkNvb3JkaW5hdGVzOiBhbGlnbkNvb3JkaW5hdGVzLFxuICBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDogZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsXG4gIGJhbGFuY2U6IGJhbGFuY2Vcbn07XG5cbi8qXG4gKiBNYXJrcyBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoIHdpdGggYSB0eXBlLTEgY29uZmxpY3Qgd2l0aCB0aGUgXCJ0eXBlMUNvbmZsaWN0XCJcbiAqIHByb3BlcnR5LiBBIHR5cGUtMSBjb25mbGljdCBpcyBvbmUgd2hlcmUgYSBub24taW5uZXIgc2VnbWVudCBjcm9zc2VzIGFuXG4gKiBpbm5lciBzZWdtZW50LiBBbiBpbm5lciBzZWdtZW50IGlzIGFuIGVkZ2Ugd2l0aCBib3RoIGluY2lkZW50IG5vZGVzIG1hcmtlZFxuICogd2l0aCB0aGUgXCJkdW1teVwiIHByb3BlcnR5LlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIHNjYW5zIGxheWVyIGJ5IGxheWVyLCBzdGFydGluZyB3aXRoIHRoZSBzZWNvbmQsIGZvciB0eXBlLTFcbiAqIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBjdXJyZW50IGxheWVyIGFuZCB0aGUgcHJldmlvdXMgbGF5ZXIuIEZvciBlYWNoIGxheWVyXG4gKiBpdCBzY2FucyB0aGUgbm9kZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0IHVudGlsIGl0IHJlYWNoZXMgb25lIHRoYXQgaXMgaW5jaWRlbnRcbiAqIG9uIGFuIGlubmVyIHNlZ21lbnQuIEl0IHRoZW4gc2NhbnMgcHJlZGVjZXNzb3JzIHRvIGRldGVybWluZSBpZiB0aGV5IGhhdmVcbiAqIGVkZ2VzIHRoYXQgY3Jvc3MgdGhhdCBpbm5lciBzZWdtZW50LiBBdCB0aGUgZW5kIGEgZmluYWwgc2NhbiBpcyBkb25lIGZvciBhbGxcbiAqIG5vZGVzIG9uIHRoZSBjdXJyZW50IHJhbmsgdG8gc2VlIGlmIHRoZXkgY3Jvc3MgdGhlIGxhc3QgdmlzaXRlZCBpbm5lclxuICogc2VnbWVudC5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSAoc2FmZWx5KSBhc3N1bWVzIHRoYXQgYSBkdW1teSBub2RlIHdpbGwgb25seSBiZSBpbmNpZGVudCBvbiBhXG4gKiBzaW5nbGUgbm9kZSBpbiB0aGUgbGF5ZXJzIGJlaW5nIHNjYW5uZWQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLCBsYXllcmluZykge1xuICB2YXIgY29uZmxpY3RzID0ge307XG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsIGxheWVyKSB7XG4gICAgdmFyXG4gICAgICAvLyBsYXN0IHZpc2l0ZWQgbm9kZSBpbiB0aGUgcHJldmlvdXMgbGF5ZXIgdGhhdCBpcyBpbmNpZGVudCBvbiBhbiBpbm5lclxuICAgICAgLy8gc2VnbWVudC5cbiAgICAgIGswID0gMCxcbiAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub2RlIGluIHRoaXMgbGF5ZXIgc2Nhbm5lZCBmb3IgY3Jvc3NpbmdzIHdpdGggYSB0eXBlLTFcbiAgICAgIC8vIHNlZ21lbnQuXG4gICAgICBzY2FuUG9zID0gMCxcbiAgICAgIHByZXZMYXllckxlbmd0aCA9IHByZXZMYXllci5sZW5ndGgsXG4gICAgICBsYXN0Tm9kZSA9IF8ubGFzdChsYXllcik7XG5cbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIHZhciB3ID0gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSxcbiAgICAgICAgazEgPSB3ID8gZy5ub2RlKHcpLm9yZGVyIDogcHJldkxheWVyTGVuZ3RoO1xuXG4gICAgICBpZiAodyB8fCB2ID09PSBsYXN0Tm9kZSkge1xuICAgICAgICBfLmZvckVhY2gobGF5ZXIuc2xpY2Uoc2NhblBvcywgaSArMSksIGZ1bmN0aW9uKHNjYW5Ob2RlKSB7XG4gICAgICAgICAgXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSwgZnVuY3Rpb24odSkge1xuICAgICAgICAgICAgdmFyIHVMYWJlbCA9IGcubm9kZSh1KSxcbiAgICAgICAgICAgICAgdVBvcyA9IHVMYWJlbC5vcmRlcjtcbiAgICAgICAgICAgIGlmICgodVBvcyA8IGswIHx8IGsxIDwgdVBvcykgJiZcbiAgICAgICAgICAgICAgICAhKHVMYWJlbC5kdW1teSAmJiBnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSkge1xuICAgICAgICAgICAgICBhZGRDb25mbGljdChjb25mbGljdHMsIHUsIHNjYW5Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNjYW5Qb3MgPSBpICsgMTtcbiAgICAgICAgazAgPSBrMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIF8ucmVkdWNlKGxheWVyaW5nLCB2aXNpdExheWVyKTtcbiAgcmV0dXJuIGNvbmZsaWN0cztcbn1cblxuZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsIGxheWVyaW5nKSB7XG4gIHZhciBjb25mbGljdHMgPSB7fTtcblxuICBmdW5jdGlvbiBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhFbmQsIHByZXZOb3J0aEJvcmRlciwgbmV4dE5vcnRoQm9yZGVyKSB7XG4gICAgdmFyIHY7XG4gICAgXy5mb3JFYWNoKF8ucmFuZ2Uoc291dGhQb3MsIHNvdXRoRW5kKSwgZnVuY3Rpb24oaSkge1xuICAgICAgdiA9IHNvdXRoW2ldO1xuICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgICAgICBfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgICAgICB2YXIgdU5vZGUgPSBnLm5vZGUodSk7XG4gICAgICAgICAgaWYgKHVOb2RlLmR1bW15ICYmXG4gICAgICAgICAgICAgICh1Tm9kZS5vcmRlciA8IHByZXZOb3J0aEJvcmRlciB8fCB1Tm9kZS5vcmRlciA+IG5leHROb3J0aEJvcmRlcikpIHtcbiAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCwgc291dGgpIHtcbiAgICB2YXIgcHJldk5vcnRoUG9zID0gLTEsXG4gICAgICBuZXh0Tm9ydGhQb3MsXG4gICAgICBzb3V0aFBvcyA9IDA7XG5cbiAgICBfLmZvckVhY2goc291dGgsIGZ1bmN0aW9uKHYsIHNvdXRoTG9va2FoZWFkKSB7XG4gICAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICAgIHZhciBwcmVkZWNlc3NvcnMgPSBnLnByZWRlY2Vzc29ycyh2KTtcbiAgICAgICAgaWYgKHByZWRlY2Vzc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICBuZXh0Tm9ydGhQb3MgPSBnLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtcbiAgICAgICAgICBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhMb29rYWhlYWQsIHByZXZOb3J0aFBvcywgbmV4dE5vcnRoUG9zKTtcbiAgICAgICAgICBzb3V0aFBvcyA9IHNvdXRoTG9va2FoZWFkO1xuICAgICAgICAgIHByZXZOb3J0aFBvcyA9IG5leHROb3J0aFBvcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoLmxlbmd0aCwgbmV4dE5vcnRoUG9zLCBub3J0aC5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvdXRoO1xuICB9XG5cbiAgXy5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpO1xuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpIHtcbiAgaWYgKGcubm9kZSh2KS5kdW1teSkge1xuICAgIHJldHVybiBfLmZpbmQoZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHtcbiAgICAgIHJldHVybiBnLm5vZGUodSkuZHVtbXk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7XG4gIGlmICh2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cblxuICB2YXIgY29uZmxpY3RzViA9IGNvbmZsaWN0c1t2XTtcbiAgaWYgKCFjb25mbGljdHNWKSB7XG4gICAgY29uZmxpY3RzW3ZdID0gY29uZmxpY3RzViA9IHt9O1xuICB9XG4gIGNvbmZsaWN0c1Zbd10gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNDb25mbGljdChjb25mbGljdHMsIHYsIHcpIHtcbiAgaWYgKHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuICByZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLCB3KTtcbn1cblxuLypcbiAqIFRyeSB0byBhbGlnbiBub2RlcyBpbnRvIHZlcnRpY2FsIFwiYmxvY2tzXCIgd2hlcmUgcG9zc2libGUuIFRoaXMgYWxnb3JpdGhtXG4gKiBhdHRlbXB0cyB0byBhbGlnbiBhIG5vZGUgd2l0aCBvbmUgb2YgaXRzIG1lZGlhbiBuZWlnaGJvcnMuIElmIHRoZSBlZGdlXG4gKiBjb25uZWN0aW5nIGEgbmVpZ2hib3IgaXMgYSB0eXBlLTEgY29uZmxpY3QgdGhlbiB3ZSBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eS5cbiAqIElmIGEgcHJldmlvdXMgbm9kZSBoYXMgYWxyZWFkeSBmb3JtZWQgYSBibG9jayB3aXRoIGEgbm9kZSBhZnRlciB0aGUgbm9kZVxuICogd2UncmUgdHJ5aW5nIHRvIGZvcm0gYSBibG9jayB3aXRoLCB3ZSBhbHNvIGlnbm9yZSB0aGF0IHBvc3NpYmlsaXR5IC0gb3VyXG4gKiBibG9ja3Mgd291bGQgYmUgc3BsaXQgaW4gdGhhdCBzY2VuYXJpby5cbiAqL1xuZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZywgbGF5ZXJpbmcsIGNvbmZsaWN0cywgbmVpZ2hib3JGbikge1xuICB2YXIgcm9vdCA9IHt9LFxuICAgIGFsaWduID0ge30sXG4gICAgcG9zID0ge307XG5cbiAgLy8gV2UgY2FjaGUgdGhlIHBvc2l0aW9uIGhlcmUgYmFzZWQgb24gdGhlIGxheWVyaW5nIGJlY2F1c2UgdGhlIGdyYXBoIGFuZFxuICAvLyBsYXllcmluZyBtYXkgYmUgb3V0IG9mIHN5bmMuIFRoZSBsYXllcmluZyBtYXRyaXggaXMgbWFuaXB1bGF0ZWQgdG9cbiAgLy8gZ2VuZXJhdGUgZGlmZmVyZW50IGV4dHJlbWUgYWxpZ25tZW50cy5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgb3JkZXIpIHtcbiAgICAgIHJvb3Rbdl0gPSB2O1xuICAgICAgYWxpZ25bdl0gPSB2O1xuICAgICAgcG9zW3ZdID0gb3JkZXI7XG4gICAgfSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgcHJldklkeCA9IC0xO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgdmFyIHdzID0gbmVpZ2hib3JGbih2KTtcbiAgICAgIGlmICh3cy5sZW5ndGgpIHtcbiAgICAgICAgd3MgPSBfLnNvcnRCeSh3cywgZnVuY3Rpb24odykgeyByZXR1cm4gcG9zW3ddOyB9KTtcbiAgICAgICAgdmFyIG1wID0gKHdzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IobXApLCBpbCA9IE1hdGguY2VpbChtcCk7IGkgPD0gaWw7ICsraSkge1xuICAgICAgICAgIHZhciB3ID0gd3NbaV07XG4gICAgICAgICAgaWYgKGFsaWduW3ZdID09PSB2ICYmXG4gICAgICAgICAgICAgIHByZXZJZHggPCBwb3Nbd10gJiZcbiAgICAgICAgICAgICAgIWhhc0NvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykpIHtcbiAgICAgICAgICAgIGFsaWduW3ddID0gdjtcbiAgICAgICAgICAgIGFsaWduW3ZdID0gcm9vdFt2XSA9IHJvb3Rbd107XG4gICAgICAgICAgICBwcmV2SWR4ID0gcG9zW3ddO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4geyByb290OiByb290LCBhbGlnbjogYWxpZ24gfTtcbn1cblxuZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgbGF5ZXJpbmcsIHJvb3QsIGFsaWduLCByZXZlcnNlU2VwKSB7XG4gIC8vIFRoaXMgcG9ydGlvbiBvZiB0aGUgYWxnb3JpdGhtIGRpZmZlcnMgZnJvbSBCSyBkdWUgdG8gYSBudW1iZXIgb2YgcHJvYmxlbXMuXG4gIC8vIEluc3RlYWQgb2YgdGhlaXIgYWxnb3JpdGhtIHdlIGNvbnN0cnVjdCBhIG5ldyBibG9jayBncmFwaCBhbmQgZG8gdHdvXG4gIC8vIHN3ZWVwcy4gVGhlIGZpcnN0IHN3ZWVwIHBsYWNlcyBibG9ja3Mgd2l0aCB0aGUgc21hbGxlc3QgcG9zc2libGVcbiAgLy8gY29vcmRpbmF0ZXMuIFRoZSBzZWNvbmQgc3dlZXAgcmVtb3ZlcyB1bnVzZWQgc3BhY2UgYnkgbW92aW5nIGJsb2NrcyB0byB0aGVcbiAgLy8gZ3JlYXRlc3QgY29vcmRpbmF0ZXMgd2l0aG91dCB2aW9sYXRpbmcgc2VwYXJhdGlvbi5cbiAgdmFyIHhzID0ge30sXG4gICAgYmxvY2tHID0gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSxcbiAgICBib3JkZXJUeXBlID0gcmV2ZXJzZVNlcCA/IFwiYm9yZGVyTGVmdFwiIDogXCJib3JkZXJSaWdodFwiO1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGUoc2V0WHNGdW5jLCBuZXh0Tm9kZXNGdW5jKSB7XG4gICAgdmFyIHN0YWNrID0gYmxvY2tHLm5vZGVzKCk7XG4gICAgdmFyIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdmlzaXRlZCA9IHt9O1xuICAgIHdoaWxlIChlbGVtKSB7XG4gICAgICBpZiAodmlzaXRlZFtlbGVtXSkge1xuICAgICAgICBzZXRYc0Z1bmMoZWxlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2aXNpdGVkW2VsZW1dID0gdHJ1ZTtcbiAgICAgICAgc3RhY2sucHVzaChlbGVtKTtcbiAgICAgICAgc3RhY2sgPSBzdGFjay5jb25jYXQobmV4dE5vZGVzRnVuYyhlbGVtKSk7XG4gICAgICB9XG5cbiAgICAgIGVsZW0gPSBzdGFjay5wb3AoKTtcbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzLCBhc3NpZ24gc21hbGxlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczEoZWxlbSkge1xuICAgIHhzW2VsZW1dID0gYmxvY2tHLmluRWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KGFjYywgeHNbZS52XSArIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFNlY29uZCBwYXNzLCBhc3NpZ24gZ3JlYXRlc3QgY29vcmRpbmF0ZXNcbiAgZnVuY3Rpb24gcGFzczIoZWxlbSkge1xuICAgIHZhciBtaW4gPSBibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYywgZSkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKGFjYywgeHNbZS53XSAtIGJsb2NrRy5lZGdlKGUpKTtcbiAgICB9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gICAgdmFyIG5vZGUgPSBnLm5vZGUoZWxlbSk7XG4gICAgaWYgKG1pbiAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIG5vZGUuYm9yZGVyVHlwZSAhPT0gYm9yZGVyVHlwZSkge1xuICAgICAgeHNbZWxlbV0gPSBNYXRoLm1heCh4c1tlbGVtXSwgbWluKTtcbiAgICB9XG4gIH1cblxuICBpdGVyYXRlKHBhc3MxLCBibG9ja0cucHJlZGVjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG4gIGl0ZXJhdGUocGFzczIsIGJsb2NrRy5zdWNjZXNzb3JzLmJpbmQoYmxvY2tHKSk7XG5cbiAgLy8gQXNzaWduIHggY29vcmRpbmF0ZXMgdG8gYWxsIG5vZGVzXG4gIF8uZm9yRWFjaChhbGlnbiwgZnVuY3Rpb24odikge1xuICAgIHhzW3ZdID0geHNbcm9vdFt2XV07XG4gIH0pO1xuXG4gIHJldHVybiB4cztcbn1cblxuXG5mdW5jdGlvbiBidWlsZEJsb2NrR3JhcGgoZywgbGF5ZXJpbmcsIHJvb3QsIHJldmVyc2VTZXApIHtcbiAgdmFyIGJsb2NrR3JhcGggPSBuZXcgR3JhcGgoKSxcbiAgICBncmFwaExhYmVsID0gZy5ncmFwaCgpLFxuICAgIHNlcEZuID0gc2VwKGdyYXBoTGFiZWwubm9kZXNlcCwgZ3JhcGhMYWJlbC5lZGdlc2VwLCByZXZlcnNlU2VwKTtcblxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIHU7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgdlJvb3QgPSByb290W3ZdO1xuICAgICAgYmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtcbiAgICAgIGlmICh1KSB7XG4gICAgICAgIHZhciB1Um9vdCA9IHJvb3RbdV0sXG4gICAgICAgICAgcHJldk1heCA9IGJsb2NrR3JhcGguZWRnZSh1Um9vdCwgdlJvb3QpO1xuICAgICAgICBibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsIHZSb290LCBNYXRoLm1heChzZXBGbihnLCB2LCB1KSwgcHJldk1heCB8fCAwKSk7XG4gICAgICB9XG4gICAgICB1ID0gdjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGJsb2NrR3JhcGg7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IHdpZHRoIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpIHtcbiAgcmV0dXJuIF8ubWluQnkoXy52YWx1ZXMoeHNzKSwgZnVuY3Rpb24gKHhzKSB7XG4gICAgdmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgXy5mb3JJbih4cywgZnVuY3Rpb24gKHgsIHYpIHtcbiAgICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aChnLCB2KSAvIDI7XG5cbiAgICAgIG1heCA9IE1hdGgubWF4KHggKyBoYWxmV2lkdGgsIG1heCk7XG4gICAgICBtaW4gPSBNYXRoLm1pbih4IC0gaGFsZldpZHRoLCBtaW4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1heCAtIG1pbjtcbiAgfSk7XG59XG5cbi8qXG4gKiBBbGlnbiB0aGUgY29vcmRpbmF0ZXMgb2YgZWFjaCBvZiB0aGUgbGF5b3V0IGFsaWdubWVudHMgc3VjaCB0aGF0XG4gKiBsZWZ0LWJpYXNlZCBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWluaW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzXG4gKiB0aGUgbWluaW11bSBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQgYW5kIHJpZ2h0LWJpYXNlZFxuICogYWxpZ25tZW50cyBoYXZlIHRoZWlyIG1heGltdW0gY29vcmRpbmF0ZSBhdCB0aGUgc2FtZSBwb2ludCBhcyB0aGUgbWF4aW11bVxuICogY29vcmRpbmF0ZSBvZiB0aGUgc21hbGxlc3Qgd2lkdGggYWxpZ25tZW50LlxuICovXG5mdW5jdGlvbiBhbGlnbkNvb3JkaW5hdGVzKHhzcywgYWxpZ25Ubykge1xuICB2YXIgYWxpZ25Ub1ZhbHMgPSBfLnZhbHVlcyhhbGlnblRvKSxcbiAgICBhbGlnblRvTWluID0gXy5taW4oYWxpZ25Ub1ZhbHMpLFxuICAgIGFsaWduVG9NYXggPSBfLm1heChhbGlnblRvVmFscyk7XG5cbiAgXy5mb3JFYWNoKFtcInVcIiwgXCJkXCJdLCBmdW5jdGlvbih2ZXJ0KSB7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgdmFyIGFsaWdubWVudCA9IHZlcnQgKyBob3JpeixcbiAgICAgICAgeHMgPSB4c3NbYWxpZ25tZW50XSxcbiAgICAgICAgZGVsdGE7XG4gICAgICBpZiAoeHMgPT09IGFsaWduVG8pIHJldHVybjtcblxuICAgICAgdmFyIHhzVmFscyA9IF8udmFsdWVzKHhzKTtcbiAgICAgIGRlbHRhID0gaG9yaXogPT09IFwibFwiID8gYWxpZ25Ub01pbiAtIF8ubWluKHhzVmFscykgOiBhbGlnblRvTWF4IC0gXy5tYXgoeHNWYWxzKTtcblxuICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgIHhzc1thbGlnbm1lbnRdID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyBkZWx0YTsgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBiYWxhbmNlKHhzcywgYWxpZ24pIHtcbiAgcmV0dXJuIF8ubWFwVmFsdWVzKHhzcy51bCwgZnVuY3Rpb24oaWdub3JlLCB2KSB7XG4gICAgaWYgKGFsaWduKSB7XG4gICAgICByZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgeHMgPSBfLnNvcnRCeShfLm1hcCh4c3MsIHYpKTtcbiAgICAgIHJldHVybiAoeHNbMV0gKyB4c1syXSkgLyAyO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWChnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIGNvbmZsaWN0cyA9IF8ubWVyZ2UoXG4gICAgZmluZFR5cGUxQ29uZmxpY3RzKGcsIGxheWVyaW5nKSxcbiAgICBmaW5kVHlwZTJDb25mbGljdHMoZywgbGF5ZXJpbmcpKTtcblxuICB2YXIgeHNzID0ge307XG4gIHZhciBhZGp1c3RlZExheWVyaW5nO1xuICBfLmZvckVhY2goW1widVwiLCBcImRcIl0sIGZ1bmN0aW9uKHZlcnQpIHtcbiAgICBhZGp1c3RlZExheWVyaW5nID0gdmVydCA9PT0gXCJ1XCIgPyBsYXllcmluZyA6IF8udmFsdWVzKGxheWVyaW5nKS5yZXZlcnNlKCk7XG4gICAgXy5mb3JFYWNoKFtcImxcIiwgXCJyXCJdLCBmdW5jdGlvbihob3Jpeikge1xuICAgICAgaWYgKGhvcml6ID09PSBcInJcIikge1xuICAgICAgICBhZGp1c3RlZExheWVyaW5nID0gXy5tYXAoYWRqdXN0ZWRMYXllcmluZywgZnVuY3Rpb24oaW5uZXIpIHtcbiAgICAgICAgICByZXR1cm4gXy52YWx1ZXMoaW5uZXIpLnJldmVyc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZWlnaGJvckZuID0gKHZlcnQgPT09IFwidVwiID8gZy5wcmVkZWNlc3NvcnMgOiBnLnN1Y2Nlc3NvcnMpLmJpbmQoZyk7XG4gICAgICB2YXIgYWxpZ24gPSB2ZXJ0aWNhbEFsaWdubWVudChnLCBhZGp1c3RlZExheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pO1xuICAgICAgdmFyIHhzID0gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgYWRqdXN0ZWRMYXllcmluZyxcbiAgICAgICAgYWxpZ24ucm9vdCwgYWxpZ24uYWxpZ24sIGhvcml6ID09PSBcInJcIik7XG4gICAgICBpZiAoaG9yaXogPT09IFwiclwiKSB7XG4gICAgICAgIHhzID0gXy5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIC14OyB9KTtcbiAgICAgIH1cbiAgICAgIHhzc1t2ZXJ0ICsgaG9yaXpdID0geHM7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHZhciBzbWFsbGVzdFdpZHRoID0gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZywgeHNzKTtcbiAgYWxpZ25Db29yZGluYXRlcyh4c3MsIHNtYWxsZXN0V2lkdGgpO1xuICByZXR1cm4gYmFsYW5jZSh4c3MsIGcuZ3JhcGgoKS5hbGlnbik7XG59XG5cbmZ1bmN0aW9uIHNlcChub2RlU2VwLCBlZGdlU2VwLCByZXZlcnNlU2VwKSB7XG4gIHJldHVybiBmdW5jdGlvbihnLCB2LCB3KSB7XG4gICAgdmFyIHZMYWJlbCA9IGcubm9kZSh2KTtcbiAgICB2YXIgd0xhYmVsID0gZy5ub2RlKHcpO1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBkZWx0YTtcblxuICAgIHN1bSArPSB2TGFiZWwud2lkdGggLyAyO1xuICAgIGlmIChfLmhhcyh2TGFiZWwsIFwibGFiZWxwb3NcIikpIHtcbiAgICAgIHN3aXRjaCAodkxhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGRlbHRhID0gLXZMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZGVsdGEgPSB2TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhO1xuICAgIH1cbiAgICBkZWx0YSA9IDA7XG5cbiAgICBzdW0gKz0gKHZMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7XG4gICAgc3VtICs9ICh3TGFiZWwuZHVtbXkgPyBlZGdlU2VwIDogbm9kZVNlcCkgLyAyO1xuXG4gICAgc3VtICs9IHdMYWJlbC53aWR0aCAvIDI7XG4gICAgaWYgKF8uaGFzKHdMYWJlbCwgXCJsYWJlbHBvc1wiKSkge1xuICAgICAgc3dpdGNoICh3TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImxcIjogZGVsdGEgPSB3TGFiZWwud2lkdGggLyAyOyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGRlbHRhID0gLXdMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHN1bSArPSByZXZlcnNlU2VwID8gZGVsdGEgOiAtZGVsdGE7XG4gICAgfVxuICAgIGRlbHRhID0gMDtcblxuICAgIHJldHVybiBzdW07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpZHRoKGcsIHYpIHtcbiAgcmV0dXJuIGcubm9kZSh2KS53aWR0aDtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbnZhciBwb3NpdGlvblggPSByZXF1aXJlKFwiLi9ia1wiKS5wb3NpdGlvblg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXRpb247XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKGcpIHtcbiAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO1xuXG4gIHBvc2l0aW9uWShnKTtcbiAgXy5mb3JFYWNoKHBvc2l0aW9uWChnKSwgZnVuY3Rpb24oeCwgdikge1xuICAgIGcubm9kZSh2KS54ID0geDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7XG4gIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcbiAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDtcbiAgdmFyIHByZXZZID0gMDtcbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBtYXhIZWlnaHQgPSBfLm1heChfLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikge1xuICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7XG4gICAgfSk7XG4gICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDtcbiAgfSk7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgYWN5Y2xpYyA9IHJlcXVpcmUoXCIuL2FjeWNsaWNcIik7XG52YXIgbm9ybWFsaXplID0gcmVxdWlyZShcIi4vbm9ybWFsaXplXCIpO1xudmFyIHJhbmsgPSByZXF1aXJlKFwiLi9yYW5rXCIpO1xudmFyIG5vcm1hbGl6ZVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5ub3JtYWxpemVSYW5rcztcbnZhciBwYXJlbnREdW1teUNoYWlucyA9IHJlcXVpcmUoXCIuL3BhcmVudC1kdW1teS1jaGFpbnNcIik7XG52YXIgcmVtb3ZlRW1wdHlSYW5rcyA9IHJlcXVpcmUoXCIuL3V0aWxcIikucmVtb3ZlRW1wdHlSYW5rcztcbnZhciBuZXN0aW5nR3JhcGggPSByZXF1aXJlKFwiLi9uZXN0aW5nLWdyYXBoXCIpO1xudmFyIGFkZEJvcmRlclNlZ21lbnRzID0gcmVxdWlyZShcIi4vYWRkLWJvcmRlci1zZWdtZW50c1wiKTtcbnZhciBjb29yZGluYXRlU3lzdGVtID0gcmVxdWlyZShcIi4vY29vcmRpbmF0ZS1zeXN0ZW1cIik7XG52YXIgb3JkZXIgPSByZXF1aXJlKFwiLi9vcmRlclwiKTtcbnZhciBwb3NpdGlvbiA9IHJlcXVpcmUoXCIuL3Bvc2l0aW9uXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gbGF5b3V0O1xuXG5mdW5jdGlvbiBsYXlvdXQoZywgb3B0cykge1xuICB2YXIgdGltZSA9IG9wdHMgJiYgb3B0cy5kZWJ1Z1RpbWluZyA/IHV0aWwudGltZSA6IHV0aWwubm90aW1lO1xuICB0aW1lKFwibGF5b3V0XCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsYXlvdXRHcmFwaCA9IFxuICAgICAgdGltZShcIiAgYnVpbGRMYXlvdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyk7IH0pO1xuICAgIHRpbWUoXCIgIHJ1bkxheW91dFwiLCAgICAgICAgZnVuY3Rpb24oKSB7IHJ1bkxheW91dChsYXlvdXRHcmFwaCwgdGltZSk7IH0pO1xuICAgIHRpbWUoXCIgIHVwZGF0ZUlucHV0R3JhcGhcIiwgZnVuY3Rpb24oKSB7IHVwZGF0ZUlucHV0R3JhcGgoZywgbGF5b3V0R3JhcGgpOyB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkxheW91dChnLCB0aW1lKSB7XG4gIHRpbWUoXCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVsc1wiLCBmdW5jdGlvbigpIHsgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlU2VsZkVkZ2VzXCIsICAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlU2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhY3ljbGljXCIsICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBhY3ljbGljLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLnJ1blwiLCAgICAgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmFua1wiLCAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSk7IH0pO1xuICB0aW1lKFwiICAgIGluamVjdEVkZ2VMYWJlbFByb3hpZXNcIiwgZnVuY3Rpb24oKSB7IGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUVtcHR5UmFua3NcIiwgICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUVtcHR5UmFua3MoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwXCIsICAgZnVuY3Rpb24oKSB7IG5lc3RpbmdHcmFwaC5jbGVhbnVwKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemVSYW5rc1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemVSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYXNzaWduUmFua01pbk1heFwiLCAgICAgICBmdW5jdGlvbigpIHsgYXNzaWduUmFua01pbk1heChnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplLnJ1blwiLCAgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplLnJ1bihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcGFyZW50RHVtbXlDaGFpbnNcIiwgICAgICBmdW5jdGlvbigpIHsgcGFyZW50RHVtbXlDaGFpbnMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkZEJvcmRlclNlZ21lbnRzXCIsICAgICAgZnVuY3Rpb24oKSB7IGFkZEJvcmRlclNlZ21lbnRzKGcpOyB9KTtcbiAgdGltZShcIiAgICBvcmRlclwiLCAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvcmRlcihnKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5zZXJ0U2VsZkVkZ2VzXCIsICAgICAgICBmdW5jdGlvbigpIHsgaW5zZXJ0U2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtXCIsIGZ1bmN0aW9uKCkgeyBjb29yZGluYXRlU3lzdGVtLmFkanVzdChnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25cIiwgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb24oZyk7IH0pO1xuICB0aW1lKFwiICAgIHBvc2l0aW9uU2VsZkVkZ2VzXCIsICAgICAgZnVuY3Rpb24oKSB7IHBvc2l0aW9uU2VsZkVkZ2VzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVCb3JkZXJOb2Rlc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVCb3JkZXJOb2RlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbm9ybWFsaXplLnVuZG9cIiwgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplLnVuZG8oZyk7IH0pO1xuICB0aW1lKFwiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzXCIsICAgZnVuY3Rpb24oKSB7IGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpOyB9KTtcbiAgdGltZShcIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbVwiLCAgIGZ1bmN0aW9uKCkgeyBjb29yZGluYXRlU3lzdGVtLnVuZG8oZyk7IH0pO1xuICB0aW1lKFwiICAgIHRyYW5zbGF0ZUdyYXBoXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IHRyYW5zbGF0ZUdyYXBoKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0c1wiLCAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmV2ZXJzZVBvaW50c1wiLCAgICAgICAgICBmdW5jdGlvbigpIHsgcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWMudW5kb1wiLCAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMudW5kbyhnKTsgfSk7XG59XG5cbi8qXG4gKiBDb3BpZXMgZmluYWwgbGF5b3V0IGluZm9ybWF0aW9uIGZyb20gdGhlIGxheW91dCBncmFwaCBiYWNrIHRvIHRoZSBpbnB1dFxuICogZ3JhcGguIFRoaXMgcHJvY2VzcyBvbmx5IGNvcGllcyB3aGl0ZWxpc3RlZCBhdHRyaWJ1dGVzIGZyb20gdGhlIGxheW91dCBncmFwaFxuICogdG8gdGhlIGlucHV0IGdyYXBoLCBzbyBpdCBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0XG4gKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsIGxheW91dEdyYXBoKSB7XG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGgubm9kZSh2KTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5ub2RlKHYpO1xuXG4gICAgaWYgKGlucHV0TGFiZWwpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuXG4gICAgICBpZiAobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICAgIGlucHV0TGFiZWwud2lkdGggPSBsYXlvdXRMYWJlbC53aWR0aDtcbiAgICAgICAgaW5wdXRMYWJlbC5oZWlnaHQgPSBsYXlvdXRMYWJlbC5oZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGlucHV0TGFiZWwgPSBpbnB1dEdyYXBoLmVkZ2UoZSk7XG4gICAgdmFyIGxheW91dExhYmVsID0gbGF5b3V0R3JhcGguZWRnZShlKTtcblxuICAgIGlucHV0TGFiZWwucG9pbnRzID0gbGF5b3V0TGFiZWwucG9pbnRzO1xuICAgIGlmIChfLmhhcyhsYXlvdXRMYWJlbCwgXCJ4XCIpKSB7XG4gICAgICBpbnB1dExhYmVsLnggPSBsYXlvdXRMYWJlbC54O1xuICAgICAgaW5wdXRMYWJlbC55ID0gbGF5b3V0TGFiZWwueTtcbiAgICB9XG4gIH0pO1xuXG4gIGlucHV0R3JhcGguZ3JhcGgoKS53aWR0aCA9IGxheW91dEdyYXBoLmdyYXBoKCkud2lkdGg7XG4gIGlucHV0R3JhcGguZ3JhcGgoKS5oZWlnaHQgPSBsYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodDtcbn1cblxudmFyIGdyYXBoTnVtQXR0cnMgPSBbXCJub2Rlc2VwXCIsIFwiZWRnZXNlcFwiLCBcInJhbmtzZXBcIiwgXCJtYXJnaW54XCIsIFwibWFyZ2lueVwiXTtcbnZhciBncmFwaERlZmF1bHRzID0geyByYW5rc2VwOiA1MCwgZWRnZXNlcDogMjAsIG5vZGVzZXA6IDUwLCByYW5rZGlyOiBcInRiXCIgfTtcbnZhciBncmFwaEF0dHJzID0gW1wiYWN5Y2xpY2VyXCIsIFwicmFua2VyXCIsIFwicmFua2RpclwiLCBcImFsaWduXCJdO1xudmFyIG5vZGVOdW1BdHRycyA9IFtcIndpZHRoXCIsIFwiaGVpZ2h0XCJdO1xudmFyIG5vZGVEZWZhdWx0cyA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xudmFyIGVkZ2VOdW1BdHRycyA9IFtcIm1pbmxlblwiLCBcIndlaWdodFwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwibGFiZWxvZmZzZXRcIl07XG52YXIgZWRnZURlZmF1bHRzID0ge1xuICBtaW5sZW46IDEsIHdlaWdodDogMSwgd2lkdGg6IDAsIGhlaWdodDogMCxcbiAgbGFiZWxvZmZzZXQ6IDEwLCBsYWJlbHBvczogXCJyXCJcbn07XG52YXIgZWRnZUF0dHJzID0gW1wibGFiZWxwb3NcIl07XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgbmV3IGdyYXBoIGZyb20gdGhlIGlucHV0IGdyYXBoLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbGF5b3V0LlxuICogVGhpcyBwcm9jZXNzIGNvcGllcyBvbmx5IHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW5wdXQgZ3JhcGggdG8gdGhlXG4gKiBsYXlvdXQgZ3JhcGguIFRodXMgdGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0XG4gKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LlxuICovXG5mdW5jdGlvbiBidWlsZExheW91dEdyYXBoKGlucHV0R3JhcGgpIHtcbiAgdmFyIGcgPSBuZXcgR3JhcGgoeyBtdWx0aWdyYXBoOiB0cnVlLCBjb21wb3VuZDogdHJ1ZSB9KTtcbiAgdmFyIGdyYXBoID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZ3JhcGgoKSk7XG5cbiAgZy5zZXRHcmFwaChfLm1lcmdlKHt9LFxuICAgIGdyYXBoRGVmYXVsdHMsXG4gICAgc2VsZWN0TnVtYmVyQXR0cnMoZ3JhcGgsIGdyYXBoTnVtQXR0cnMpLFxuICAgIF8ucGljayhncmFwaCwgZ3JhcGhBdHRycykpKTtcblxuICBfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ub2RlKHYpKTtcbiAgICBnLnNldE5vZGUodiwgXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLCBub2RlTnVtQXR0cnMpLCBub2RlRGVmYXVsdHMpKTtcbiAgICBnLnNldFBhcmVudCh2LCBpbnB1dEdyYXBoLnBhcmVudCh2KSk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO1xuICAgIGcuc2V0RWRnZShlLCBfLm1lcmdlKHt9LFxuICAgICAgZWRnZURlZmF1bHRzLFxuICAgICAgc2VsZWN0TnVtYmVyQXR0cnMoZWRnZSwgZWRnZU51bUF0dHJzKSxcbiAgICAgIF8ucGljayhlZGdlLCBlZGdlQXR0cnMpKSk7XG4gIH0pO1xuXG4gIHJldHVybiBnO1xufVxuXG4vKlxuICogVGhpcyBpZGVhIGNvbWVzIGZyb20gdGhlIEdhbnNuZXIgcGFwZXI6IHRvIGFjY291bnQgZm9yIGVkZ2UgbGFiZWxzIGluIG91clxuICogbGF5b3V0IHdlIHNwbGl0IGVhY2ggcmFuayBpbiBoYWxmIGJ5IGRvdWJsaW5nIG1pbmxlbiBhbmQgaGFsdmluZyByYW5rc2VwLlxuICogVGhlbiB3ZSBjYW4gcGxhY2UgbGFiZWxzIGF0IHRoZXNlIG1pZC1wb2ludHMgYmV0d2VlbiBub2Rlcy5cbiAqXG4gKiBXZSBhbHNvIGFkZCBzb21lIG1pbmltYWwgcGFkZGluZyB0byB0aGUgd2lkdGggdG8gcHVzaCB0aGUgbGFiZWwgZm9yIHRoZSBlZGdlXG4gKiBhd2F5IGZyb20gdGhlIGVkZ2UgaXRzZWxmIGEgYml0LlxuICovXG5mdW5jdGlvbiBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpIHtcbiAgdmFyIGdyYXBoID0gZy5ncmFwaCgpO1xuICBncmFwaC5yYW5rc2VwIC89IDI7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBlZGdlLm1pbmxlbiAqPSAyO1xuICAgIGlmIChlZGdlLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkgIT09IFwiY1wiKSB7XG4gICAgICBpZiAoZ3JhcGgucmFua2RpciA9PT0gXCJUQlwiIHx8IGdyYXBoLnJhbmtkaXIgPT09IFwiQlRcIikge1xuICAgICAgICBlZGdlLndpZHRoICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlZGdlLmhlaWdodCArPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qXG4gKiBDcmVhdGVzIHRlbXBvcmFyeSBkdW1teSBub2RlcyB0aGF0IGNhcHR1cmUgdGhlIHJhbmsgaW4gd2hpY2ggZWFjaCBlZGdlJ3NcbiAqIGxhYmVsIGlzIGdvaW5nIHRvLCBpZiBpdCBoYXMgb25lIG9mIG5vbi16ZXJvIHdpZHRoIGFuZCBoZWlnaHQuIFdlIGRvIHRoaXNcbiAqIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZW1vdmUgZW1wdHkgcmFua3Mgd2hpbGUgcHJlc2VydmluZyBiYWxhbmNlIGZvciB0aGVcbiAqIGxhYmVsJ3MgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2Uud2lkdGggJiYgZWRnZS5oZWlnaHQpIHtcbiAgICAgIHZhciB2ID0gZy5ub2RlKGUudik7XG4gICAgICB2YXIgdyA9IGcubm9kZShlLncpO1xuICAgICAgdmFyIGxhYmVsID0geyByYW5rOiAody5yYW5rIC0gdi5yYW5rKSAvIDIgKyB2LnJhbmssIGU6IGUgfTtcbiAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwiZWRnZS1wcm94eVwiLCBsYWJlbCwgXCJfZXBcIik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKSB7XG4gIHZhciBtYXhSYW5rID0gMDtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmJvcmRlclRvcCkge1xuICAgICAgbm9kZS5taW5SYW5rID0gZy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO1xuICAgICAgbm9kZS5tYXhSYW5rID0gZy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO1xuICAgICAgbWF4UmFuayA9IF8ubWF4KG1heFJhbmssIG5vZGUubWF4UmFuayk7XG4gICAgfVxuICB9KTtcbiAgZy5ncmFwaCgpLm1heFJhbmsgPSBtYXhSYW5rO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmR1bW15ID09PSBcImVkZ2UtcHJveHlcIikge1xuICAgICAgZy5lZGdlKG5vZGUuZSkubGFiZWxSYW5rID0gbm9kZS5yYW5rO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUdyYXBoKGcpIHtcbiAgdmFyIG1pblggPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHZhciBtYXhYID0gMDtcbiAgdmFyIG1pblkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIHZhciBtYXhZID0gMDtcbiAgdmFyIGdyYXBoTGFiZWwgPSBnLmdyYXBoKCk7XG4gIHZhciBtYXJnaW5YID0gZ3JhcGhMYWJlbC5tYXJnaW54IHx8IDA7XG4gIHZhciBtYXJnaW5ZID0gZ3JhcGhMYWJlbC5tYXJnaW55IHx8IDA7XG5cbiAgZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpIHtcbiAgICB2YXIgeCA9IGF0dHJzLng7XG4gICAgdmFyIHkgPSBhdHRycy55O1xuICAgIHZhciB3ID0gYXR0cnMud2lkdGg7XG4gICAgdmFyIGggPSBhdHRycy5oZWlnaHQ7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHggLSB3IC8gMik7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHggKyB3IC8gMik7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkgLSBoIC8gMik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkgKyBoIC8gMik7XG4gIH1cblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IGdldEV4dHJlbWVzKGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkge1xuICAgICAgZ2V0RXh0cmVtZXMoZWRnZSk7XG4gICAgfVxuICB9KTtcblxuICBtaW5YIC09IG1hcmdpblg7XG4gIG1pblkgLT0gbWFyZ2luWTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgbm9kZS54IC09IG1pblg7XG4gICAgbm9kZS55IC09IG1pblk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBfLmZvckVhY2goZWRnZS5wb2ludHMsIGZ1bmN0aW9uKHApIHtcbiAgICAgIHAueCAtPSBtaW5YO1xuICAgICAgcC55IC09IG1pblk7XG4gICAgfSk7XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieFwiKSkgeyBlZGdlLnggLT0gbWluWDsgfVxuICAgIGlmIChfLmhhcyhlZGdlLCBcInlcIikpIHsgZWRnZS55IC09IG1pblk7IH1cbiAgfSk7XG5cbiAgZ3JhcGhMYWJlbC53aWR0aCA9IG1heFggLSBtaW5YICsgbWFyZ2luWDtcbiAgZ3JhcGhMYWJlbC5oZWlnaHQgPSBtYXhZIC0gbWluWSArIG1hcmdpblk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIHZhciBub2RlViA9IGcubm9kZShlLnYpO1xuICAgIHZhciBub2RlVyA9IGcubm9kZShlLncpO1xuICAgIHZhciBwMSwgcDI7XG4gICAgaWYgKCFlZGdlLnBvaW50cykge1xuICAgICAgZWRnZS5wb2ludHMgPSBbXTtcbiAgICAgIHAxID0gbm9kZVc7XG4gICAgICBwMiA9IG5vZGVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBwMSA9IGVkZ2UucG9pbnRzWzBdO1xuICAgICAgcDIgPSBlZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYsIHAxKSk7XG4gICAgZWRnZS5wb2ludHMucHVzaCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVcsIHAyKSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBpZiAoZWRnZS5sYWJlbHBvcyA9PT0gXCJsXCIgfHwgZWRnZS5sYWJlbHBvcyA9PT0gXCJyXCIpIHtcbiAgICAgICAgZWRnZS53aWR0aCAtPSBlZGdlLmxhYmVsb2Zmc2V0O1xuICAgICAgfVxuICAgICAgc3dpdGNoIChlZGdlLmxhYmVscG9zKSB7XG4gICAgICBjYXNlIFwibFwiOiBlZGdlLnggLT0gZWRnZS53aWR0aCAvIDIgKyBlZGdlLmxhYmVsb2Zmc2V0OyBicmVhaztcbiAgICAgIGNhc2UgXCJyXCI6IGVkZ2UueCArPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChlZGdlLnJldmVyc2VkKSB7XG4gICAgICBlZGdlLnBvaW50cy5yZXZlcnNlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGcuY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICAgIHZhciB0ID0gZy5ub2RlKG5vZGUuYm9yZGVyVG9wKTtcbiAgICAgIHZhciBiID0gZy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKTtcbiAgICAgIHZhciBsID0gZy5ub2RlKF8ubGFzdChub2RlLmJvcmRlckxlZnQpKTtcbiAgICAgIHZhciByID0gZy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7XG5cbiAgICAgIG5vZGUud2lkdGggPSBNYXRoLmFicyhyLnggLSBsLngpO1xuICAgICAgbm9kZS5oZWlnaHQgPSBNYXRoLmFicyhiLnkgLSB0LnkpO1xuICAgICAgbm9kZS54ID0gbC54ICsgbm9kZS53aWR0aCAvIDI7XG4gICAgICBub2RlLnkgPSB0LnkgKyBub2RlLmhlaWdodCAvIDI7XG4gICAgfVxuICB9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaWYgKGcubm9kZSh2KS5kdW1teSA9PT0gXCJib3JkZXJcIikge1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS52ID09PSBlLncpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKGUudik7XG4gICAgICBpZiAoIW5vZGUuc2VsZkVkZ2VzKSB7XG4gICAgICAgIG5vZGUuc2VsZkVkZ2VzID0gW107XG4gICAgICB9XG4gICAgICBub2RlLnNlbGZFZGdlcy5wdXNoKHsgZTogZSwgbGFiZWw6IGcuZWRnZShlKSB9KTtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZykge1xuICB2YXIgbGF5ZXJzID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICBfLmZvckVhY2gobGF5ZXJzLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBvcmRlclNoaWZ0ID0gMDtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgbm9kZS5vcmRlciA9IGkgKyBvcmRlclNoaWZ0O1xuICAgICAgXy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLCBmdW5jdGlvbihzZWxmRWRnZSkge1xuICAgICAgICB1dGlsLmFkZER1bW15Tm9kZShnLCBcInNlbGZlZGdlXCIsIHtcbiAgICAgICAgICB3aWR0aDogc2VsZkVkZ2UubGFiZWwud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBzZWxmRWRnZS5sYWJlbC5oZWlnaHQsXG4gICAgICAgICAgcmFuazogbm9kZS5yYW5rLFxuICAgICAgICAgIG9yZGVyOiBpICsgKCsrb3JkZXJTaGlmdCksXG4gICAgICAgICAgZTogc2VsZkVkZ2UuZSxcbiAgICAgICAgICBsYWJlbDogc2VsZkVkZ2UubGFiZWxcbiAgICAgICAgfSwgXCJfc2VcIik7XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBub2RlLnNlbGZFZGdlcztcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGlmIChub2RlLmR1bW15ID09PSBcInNlbGZlZGdlXCIpIHtcbiAgICAgIHZhciBzZWxmTm9kZSA9IGcubm9kZShub2RlLmUudik7XG4gICAgICB2YXIgeCA9IHNlbGZOb2RlLnggKyBzZWxmTm9kZS53aWR0aCAvIDI7XG4gICAgICB2YXIgeSA9IHNlbGZOb2RlLnk7XG4gICAgICB2YXIgZHggPSBub2RlLnggLSB4O1xuICAgICAgdmFyIGR5ID0gc2VsZk5vZGUuaGVpZ2h0IC8gMjtcbiAgICAgIGcuc2V0RWRnZShub2RlLmUsIG5vZGUubGFiZWwpO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgICAgbm9kZS5sYWJlbC5wb2ludHMgPSBbXG4gICAgICAgIHsgeDogeCArIDIgKiBkeCAvIDMsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5IC0gZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgICAgIGR4ICAgICwgeTogeSB9LFxuICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5ICsgZHkgfSxcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSArIGR5IH1cbiAgICAgIF07XG4gICAgICBub2RlLmxhYmVsLnggPSBub2RlLng7XG4gICAgICBub2RlLmxhYmVsLnkgPSBub2RlLnk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TnVtYmVyQXR0cnMob2JqLCBhdHRycykge1xuICByZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaiwgYXR0cnMpLCBOdW1iZXIpO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpIHtcbiAgdmFyIG5ld0F0dHJzID0ge307XG4gIF8uZm9yRWFjaChhdHRycywgZnVuY3Rpb24odiwgaykge1xuICAgIG5ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV0gPSB2O1xuICB9KTtcbiAgcmV0dXJuIG5ld0F0dHJzO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZWJ1Z09yZGVyaW5nOiBkZWJ1Z09yZGVyaW5nXG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKSB7XG4gIHZhciBsYXllck1hdHJpeCA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtcblxuICB2YXIgaCA9IG5ldyBHcmFwaCh7IGNvbXBvdW5kOiB0cnVlLCBtdWx0aWdyYXBoOiB0cnVlIH0pLnNldEdyYXBoKHt9KTtcblxuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgaC5zZXROb2RlKHYsIHsgbGFiZWw6IHYgfSk7XG4gICAgaC5zZXRQYXJlbnQodiwgXCJsYXllclwiICsgZy5ub2RlKHYpLnJhbmspO1xuICB9KTtcblxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaC5zZXRFZGdlKGUudiwgZS53LCB7fSwgZS5uYW1lKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGxheWVyTWF0cml4LCBmdW5jdGlvbihsYXllciwgaSkge1xuICAgIHZhciBsYXllclYgPSBcImxheWVyXCIgKyBpO1xuICAgIGguc2V0Tm9kZShsYXllclYsIHsgcmFuazogXCJzYW1lXCIgfSk7XG4gICAgXy5yZWR1Y2UobGF5ZXIsIGZ1bmN0aW9uKHUsIHYpIHtcbiAgICAgIGguc2V0RWRnZSh1LCB2LCB7IHN0eWxlOiBcImludmlzXCIgfSk7XG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGg7XG59XG4iLCAibW9kdWxlLmV4cG9ydHMgPSBcIjAuOC41XCI7XG4iLCAiLypcbkNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHRcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLlxuKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdyYXBobGliOiByZXF1aXJlKFwiLi9saWIvZ3JhcGhsaWJcIiksXG5cbiAgbGF5b3V0OiByZXF1aXJlKFwiLi9saWIvbGF5b3V0XCIpLFxuICBkZWJ1ZzogcmVxdWlyZShcIi4vbGliL2RlYnVnXCIpLFxuICB1dGlsOiB7XG4gICAgdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikudGltZSxcbiAgICBub3RpbWU6IHJlcXVpcmUoXCIuL2xpYi91dGlsXCIpLm5vdGltZVxuICB9LFxuICB2ZXJzaW9uOiByZXF1aXJlKFwiLi9saWIvdmVyc2lvblwiKVxufTtcbiIsICJpbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIEl0ZW1WaWV3LCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gJy4vc3JjL3V0aWxzL0V2ZW50QnVzJztcclxuaW1wb3J0IHsgR3JhcGhWaWV3LCBHUkFQSF9WSUVXX1RZUEUgfSBmcm9tICcuL3NyYy92aWV3cy9HcmFwaFZpZXcnO1xyXG5pbXBvcnQgeyBDaGF0VmlldywgQ0hBVF9WSUVXX1RZUEUgfSBmcm9tICcuL3NyYy92aWV3cy9DaGF0Vmlldyc7XHJcbmltcG9ydCB7IFdlYlNvY2tldFNlcnZpY2UgfSBmcm9tICcuL3NyYy91dGlscy9XZWJTb2NrZXRTZXJ2aWNlJztcclxuXHJcbmltcG9ydCAnc3JjL2Nzcy9zdHlsZXMuY3NzJztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuaW50ZXJmYWNlIExMTUFnZW50U2V0dGluZ3Mge1xyXG5cdGFwaUJhc2VVcmw6IHN0cmluZztcclxuXHRzeXN0ZW1Qcm9tcHQ6IHN0cmluZztcclxuXHRkZWZhdWx0TW9kZWw6IHN0cmluZztcclxuXHRwcm9tcHRzRm9sZGVyOiBzdHJpbmc7XHJcblx0ZW5hYmxlRmlsZVJlZmVyZW5jZXM6IGJvb2xlYW47XHJcblx0ZW5hYmxlUHJvbXB0UmVmZXJlbmNlczogYm9vbGVhbjtcclxuXHRleGNsdWRlZEZvbGRlcnM6IHN0cmluZ1tdO1xyXG5cdHJlZkNhY2hlRm9sZGVyOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IExMTUFnZW50U2V0dGluZ3MgPSB7XHJcblx0YXBpQmFzZVVybDogJ2h0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGknLFxyXG5cdHN5c3RlbVByb21wdDogJ1x1MDQyMlx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzVcdTA0MzdcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDE4XHUwNDE4IFx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQ0Mi4nLFxyXG5cdGRlZmF1bHRNb2RlbDogJ2dlbWluaS0yLjUtZmxhc2gnLFxyXG5cdHByb21wdHNGb2xkZXI6ICdwcm9tcHRzJywgLy8gXHUwNDFGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDMwIFx1MDQ0MSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzQlx1MDQ0N1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RVxyXG5cdGVuYWJsZUZpbGVSZWZlcmVuY2VzOiB0cnVlLFxyXG5cdGVuYWJsZVByb21wdFJlZmVyZW5jZXM6IHRydWUsXHJcblx0ZXhjbHVkZWRGb2xkZXJzOiBbJ3RlbXBsYXRlcyddLCAvLyBcdTA0MUZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzAgXCJ0ZW1wbGF0ZXNcIiBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFIFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzMFxyXG5cdHJlZkNhY2hlRm9sZGVyOiAncmVmLWNhY2hlJyAvLyBcdTA0MUZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSB2YXVsdFxyXG59O1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBQbHVnaW4gQ2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMTE1BZ2VudFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IExMTUFnZW50U2V0dGluZ3M7XHJcblx0ZXZlbnRCdXM6IEV2ZW50QnVzO1xyXG5cdHdlYlNvY2tldFNlcnZpY2U6IFdlYlNvY2tldFNlcnZpY2U7XHJcblx0YWN0aXZlU3RyZWFtQ29udHJvbGxlcnM6IE1hcDxzdHJpbmcsIEFib3J0Q29udHJvbGxlcj47XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5ldmVudEJ1cyA9IG5ldyBFdmVudEJ1cygpO1xyXG5cclxuXHRcdHRoaXMud2ViU29ja2V0U2VydmljZSA9IG5ldyBXZWJTb2NrZXRTZXJ2aWNlKHRoaXMuZXZlbnRCdXMsIHRoaXMuc2V0dGluZ3MuYXBpQmFzZVVybCk7XHJcblx0XHR0aGlzLndlYlNvY2tldFNlcnZpY2UuY29ubmVjdCgpO1xyXG5cclxuXHRcdC8vIFx1MDQyMFx1MDQzNVx1MDQzM1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzUgdmlld3NcclxuXHRcdHRoaXMucmVnaXN0ZXJWaWV3KEdSQVBIX1ZJRVdfVFlQRSwgKGxlYWYpID0+IG5ldyBHcmFwaFZpZXcobGVhZiwgdGhpcykpO1xyXG5cdFx0dGhpcy5yZWdpc3RlclZpZXcoQ0hBVF9WSUVXX1RZUEUsIChsZWFmKSA9PiBuZXcgQ2hhdFZpZXcobGVhZiwgdGhpcykpO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0MzBcdTA0M0RcdTA0MzRcdTA0NEJcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnb3Blbi1sbG0tYWdlbnQtZ3JhcGgnLFxyXG5cdFx0XHRuYW1lOiAnXHUwNDFFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0JcdTA0M0VcdTA0MzNcdTA0M0VcdTA0MzIgTExNIEFnZW50JyxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuYWN0aXZhdGVHcmFwaFZpZXcoKVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdvcGVuLWxsbS1hZ2VudC1jaGF0JyxcclxuXHRcdFx0bmFtZTogJ1x1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0NDdcdTA0MzBcdTA0NDIgTExNIEFnZW50JyxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuYWN0aXZhdGVDaGF0VmlldygpXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ25ldy1sbG0tYWdlbnQtY2hhdCcsXHJcblx0XHRcdG5hbWU6ICdcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDQ3XHUwNDMwXHUwNDQyIExMTSBBZ2VudCcsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLmhhbmRsZU5ld0NoYXQoKVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MyBcdTA0MzIgcmliYm9uXHJcblx0XHR0aGlzLmFkZFJpYmJvbkljb24oJ2JyYWluLWNpcmN1aXQnLCAnTExNIEFnZW50JywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmFjdGl2YXRlR3JhcGhWaWV3KCk7XHJcblx0XHRcdHRoaXMuYWN0aXZhdGVDaGF0VmlldygpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Y29uc29sZS5sb2coJ0xMTSBBZ2VudCBwbHVnaW4gXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNEJyk7XHJcblxyXG5cdFx0dGhpcy5hY3RpdmVTdHJlYW1Db250cm9sbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBYm9ydENvbnRyb2xsZXI+KCk7XHJcblxyXG5cdFx0dGhpcy5ldmVudEJ1cy5vbignc3RyZWFtLXN0YXJ0ZWQnLCB0aGlzLmhhbmRsZVN0cmVhbVN0YXJ0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLmV2ZW50QnVzLm9uKCdzdHJlYW0tZW5kZWQnLCB0aGlzLmhhbmRsZVN0cmVhbUVuZGVkLmJpbmQodGhpcykpO1xyXG5cclxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNhbXBsZVNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0aWYgKHRoaXMud2ViU29ja2V0U2VydmljZSkge1xyXG5cdFx0XHR0aGlzLndlYlNvY2tldFNlcnZpY2UuZGlzY29ubmVjdCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYWN0aXZlU3RyZWFtQ29udHJvbGxlcnMuY2xlYXIoKTtcclxuXHJcblx0XHR0aGlzLmV2ZW50QnVzLm9mZignc3RyZWFtLXN0YXJ0ZWQnLCB0aGlzLmhhbmRsZVN0cmVhbVN0YXJ0ZWQpO1xyXG5cdFx0dGhpcy5ldmVudEJ1cy5vZmYoJ3N0cmVhbS1lbmRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtRW5kZWQpO1xyXG5cclxuXHRcdGNvbnNvbGUubG9nKCdMTE0gQWdlbnQgcGx1Z2luIFx1MDQzMlx1MDQ0Qlx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzRCcpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dGluZ3MgTWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmlldyBNYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRhc3luYyBhY3RpdmF0ZUdyYXBoVmlldygpIHtcclxuXHRcdGNvbnN0IGV4aXN0aW5nTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoR1JBUEhfVklFV19UWVBFKVswXTtcclxuXHRcdGlmIChleGlzdGluZ0xlYWYpIHtcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYoZXhpc3RpbmdMZWFmKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCd0YWInKS5zZXRWaWV3U3RhdGUoe1xyXG5cdFx0XHRcdHR5cGU6IEdSQVBIX1ZJRVdfVFlQRSxcclxuXHRcdFx0XHRhY3RpdmU6IHRydWVcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBhY3RpdmF0ZUNoYXRWaWV3KCkge1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShDSEFUX1ZJRVdfVFlQRSlbMF07XHJcblx0XHRpZiAoZXhpc3RpbmdMZWFmKSB7XHJcblx0XHRcdHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKGV4aXN0aW5nTGVhZik7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCByaWdodExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKTtcclxuXHRcdFx0aWYgKHJpZ2h0TGVhZikge1xyXG5cdFx0XHRcdGF3YWl0IHJpZ2h0TGVhZi5zZXRWaWV3U3RhdGUoe1xyXG5cdFx0XHRcdFx0dHlwZTogQ0hBVF9WSUVXX1RZUEUsXHJcblx0XHRcdFx0XHRhY3RpdmU6IHRydWVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnQgSGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdGhhbmRsZU5ld0NoYXQoKSB7XHJcblx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ25ldy1jaGF0Jyk7XHJcblx0fVxyXG5cclxuXHRoYW5kbGVTdHJlYW1TdGFydGVkKGRhdGE6IHsgbm9kZUlkOiBzdHJpbmc7IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB9KTogdm9pZCB7XHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzLnNldChkYXRhLm5vZGVJZCwgZGF0YS5jb250cm9sbGVyKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0cmVhbUVuZGVkKGRhdGE6IHsgbm9kZUlkOiBzdHJpbmcgfSk6IHZvaWQge1xyXG5cdFx0dGhpcy5hY3RpdmVTdHJlYW1Db250cm9sbGVycy5kZWxldGUoZGF0YS5ub2RlSWQpO1xyXG5cdH1cclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2FtcGxlIFNldHRpbmcgVGFiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuY2xhc3MgU2FtcGxlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogTExNQWdlbnRQbHVnaW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IExMTUFnZW50UGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBUEkgQmFzZSBVUkwnKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDExXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFVSTCBcdTA0MzRcdTA0M0JcdTA0NEYgQVBJIExMTSBBZ2VudCcpXHJcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG5cdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFVSTCcpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybClcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdcdTA0MjFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyJylcclxuXHRcdFx0LnNldERlc2MoJ1x1MDQyRFx1MDQ0Mlx1MDQzRVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQ0Mlx1MDQ0Q1x1MDQ0MVx1MDQ0RiBMTE0gXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQ0Qlx1MDQzQyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0JcdTA0M0VcdTA0MzNcdTA0M0VcdTA0M0MuJylcclxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxyXG5cdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignXHUwNDIyXHUwNDRCIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNVx1MDQzN1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MThcdTA0MTggXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyLicpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3lzdGVtUHJvbXB0KVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5zeXN0ZW1Qcm9tcHQgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzUgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnXHUwNDFGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDMwIFx1MDQ0MSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzgnKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDFGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUsIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNCAjLyMjJylcclxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdwcm9tcHRzJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRzRm9sZGVyKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRzRm9sZGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1x1MDQxRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzMCBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOScpXHJcblx0XHRcdC5zZXREZXNjKCdcdTA0MTBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMicpXHJcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PlxyXG5cdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcigncmVmLWNhY2hlJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWZDYWNoZUZvbGRlcilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucmVmQ2FjaGVGb2xkZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNEXHUwNDMwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QlxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEInKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBAL0BAIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0RcdTA0MzAgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCIFx1MDQzMiBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0M0JcdTA0MzhcdTA0NDlcdTA0MzUnKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVSZWZlcmVuY2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVSZWZlcmVuY2VzID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQ0QlxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0NEInKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSAjLyMjIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDRCJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxyXG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVQcm9tcHRSZWZlcmVuY2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZVByb21wdFJlZmVyZW5jZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0VcdTA0M0FcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnXHUwNDE4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBJylcclxuXHRcdFx0LnNldERlc2MoJ1x1MDQyMVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0M0VcdTA0NDJcdTA0M0RcdTA0M0VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDM5IFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzBcdTA0M0MsIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QiBcdTA0MzhcdTA0MzcgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDQ1IFx1MDQzRFx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNCXHUwNDMwXHUwNDMzXHUwNDMwXHUwNDQyXHUwNDRDXHUwNDQxXHUwNDRGIFx1MDQzMiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0MzRcdTA0M0VcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIChAL0BAKS4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVSZWZlcmVuY2VzKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVSZWZlcmVuY2VzID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQzQ1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzRVx1MDQzQVxyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRGb2xkZXJzLmZvckVhY2goKGZvbGRlciwgaW5kZXgpID0+IHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldENsYXNzKCdsbG0tYWdlbnQtZXhjbHVkZWQtZm9sZGVyLWl0ZW0nKSAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG5cdFx0XHRcdFx0dGV4dC5zZXRQbGFjZWhvbGRlcignXHUwNDFGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgKFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgdGVtcGxhdGVzLyknICsgaW5kZXgpXHJcblx0XHRcdFx0XHRcdC5zZXRWYWx1ZShmb2xkZXIpXHJcblx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5leGNsdWRlZEZvbGRlcnNbaW5kZXhdID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQ0RFx1MDQ0OCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0FcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzZXR0aW5ncy1jaGFuZ2VkJyk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcclxuXHRcdFx0XHRcdGJ1dHRvblxyXG5cdFx0XHRcdFx0XHQuc2V0SWNvbigneCcpXHJcblx0XHRcdFx0XHRcdC5zZXRUb29sdGlwKCdcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDQzJylcclxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVkRm9sZGVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpOyAvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwXHJcblx0XHRcdFx0XHRcdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQ0RFx1MDQ0OCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0FcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzZXR0aW5ncy1jaGFuZ2VkJyk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpLmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XHJcblx0XHRcdGJ1dHRvblxyXG5cdFx0XHRcdC5zZXRCdXR0b25UZXh0KCdcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDQzJylcclxuXHRcdFx0XHQuc2V0SWNvbigncGx1cycpXHJcblx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRGb2xkZXJzLnB1c2goJycpOyAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNVxyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTsgLy8gXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzMFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiIsICIvKlxyXG4gKiBFdmVudEJ1cyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzQ1x1MDQzNVx1MDQ0NVx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzN1x1MDQzQyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDM4IFx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0MzFcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM5XHJcbiAqIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0JcdTA0MzhcdTA0NDdcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiwgXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0M0JcdTA0MzBcdTA0MzFcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDMyXHUwNDRGXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudEJ1cyB7XHJcblx0cHJpdmF0ZSBldmVudHM6IHsgW2tleTogc3RyaW5nXTogKChkYXRhPzogYW55KSA9PiB2b2lkKVtdIH0gPSB7fTtcclxuXHJcblx0b24oZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmV2ZW50c1tldmVudE5hbWVdKSB7XHJcblx0XHRcdHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0gPSBbXTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0ucHVzaChjYWxsYmFjayk7XHJcblx0fVxyXG5cclxuXHRvZmYoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0pIHtcclxuXHRcdFx0dGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0uZmlsdGVyKChjYikgPT4gY2IgIT09IGNhbGxiYWNrKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGVtaXQoZXZlbnROYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmV2ZW50c1tldmVudE5hbWVdKSB7XHJcblx0XHRcdHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0uZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKGRhdGEpKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MUVcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4IFx1MDQ0M1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M0RcdTA0NEJcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDNDIExMTSBcdTA0MzBcdTA0MzNcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXHJcbiAqIFx1MDQxOFx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEUgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0MzJcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0NDFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzUgUmVhY3QgRmxvdy5cclxuICovXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYnNpZGlhbiBJbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYsIE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGx1Z2luIEltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmltcG9ydCBMTE1BZ2VudFBsdWdpbiBmcm9tICdtYWluJzsgLy8gXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNGXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDMzXHUwNDMwXHUwNDM1XHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0UgbWFpbi50cyBcdTA0NERcdTA0M0FcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgTExNQWdlbnRQbHVnaW4gXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzQlx1MDQ0N1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RVxyXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xyXG5cclxuaW1wb3J0IHsgSGlzdG9yeVBhbmVsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9IaXN0b3J5UGFuZWwnOyAvLyBcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzBcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBIaXN0b3J5UGFuZWwgXHUwNDREXHUwNDQyXHUwNDNFIEpTLVx1MDQzQVx1MDQzQlx1MDQzMFx1MDQ0MVx1MDQ0MVxyXG5pbXBvcnQgeyBHcmFwaFBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9HcmFwaFBhbmVsJzsgLy8gXHUwNDE4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFJlYWN0LVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0MzggUmVhY3RET01cclxuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnc3JjL3V0aWxzL0RpYWxvZyc7XHJcbmltcG9ydCB7IEdyYXBoU2V0dGluZ3NNb2RhbCB9IGZyb20gJy4uL21vZGFscy9HcmFwaFNldHRpbmdzTW9kYWwnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdSQVBIX1ZJRVdfVFlQRSA9ICdsbG0tYWdlbnQtZ3JhcGgtdmlldyc7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHcmFwaCBWaWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIEdyYXBoVmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuXHRwbHVnaW46IExMTUFnZW50UGx1Z2luO1xyXG5cdGdyYXBoRGF0YTogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9O1xyXG5cdGN1cnJlbnROb2RlOiBzdHJpbmcgfCBudWxsO1xyXG5cdGdyYXBoc0xpc3Q6IGFueVtdO1xyXG5cdHNlbGVjdGVkR3JhcGhJZDogc3RyaW5nIHwgbnVsbDtcclxuXHRzZWxlY3RlZE5vZGVJZHM6IFNldDxzdHJpbmc+OyAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgU2V0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgSUQgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMlxyXG5cdHNlbGVjdGVkR3JhcGhUaXRsZTogc3RyaW5nIHwgbnVsbDtcclxuXHRjdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGw7XHJcblxyXG5cdC8vIFVJIEVsZW1lbnRzXHJcblx0aGlzdG9yeVBhbmVsOiBIaXN0b3J5UGFuZWwgfCBudWxsO1xyXG5cdGhpc3RvcnlDb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xyXG5cdGdyYXBoQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRyZWFjdFJvb3Q6IFJlYWN0RE9NLlJvb3QgfCBudWxsO1xyXG5cdHRvZ2dsZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0aXNIaXN0b3J5Q29sbGFwc2VkOiBib29sZWFuO1xyXG5cclxuXHQvLyBcdTA0MTNcdTA0M0JcdTA0M0VcdTA0MzFcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzOVxyXG5cdGNvcHlTZWxlY3RlZEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRkZWxldGVTZWxlY3RlZEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRuZXdJbmRlcGVuZGVudENoYXRBY3Rpb25CdXR0b246IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0Z3JhcGhTZXR0aW5nc0J1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcblx0YWN0aXZlU3RyZWFtQ29udHJvbGxlcnM6IE1hcDxzdHJpbmcsIEFib3J0Q29udHJvbGxlcj47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogTExNQWdlbnRQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGxlYWYpO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0XHR0aGlzLmdyYXBoRGF0YSA9IHsgbm9kZXM6IFtdLCBlZGdlczogW10gfTtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xyXG5cdFx0dGhpcy5ncmFwaHNMaXN0ID0gW107XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhJZCA9IG51bGw7XHJcblx0XHR0aGlzLmhpc3RvcnlQYW5lbCA9IG51bGw7XHJcblx0XHR0aGlzLnJlYWN0Um9vdCA9IG51bGw7XHJcblx0XHR0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZCA9IHRydWU7XHJcblx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgPSBudWxsO1xyXG5cdFx0dGhpcy5hY3RpdmVTdHJlYW1Db250cm9sbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBYm9ydENvbnRyb2xsZXI+KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBcdTA0MjJcdTA0MzhcdTA0M0YgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqL1xyXG5cdGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gR1JBUEhfVklFV19UWVBFO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHJldHVybnMge3N0cmluZ30gXHUwNDFFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQzOFx1MDQzQ1x1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0Z2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSB8fCAnTExNIEFnZW50IEdyYXBoJztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFx1MDQxOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0Z2V0SWNvbigpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuICdicmFpbi1jaXJjdWl0JztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxMlx1MDQ0Qlx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri4gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFVJIFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1LlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG5cdCAqL1xyXG5cdGFzeW5jIG9uT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMV0gYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRjb250YWluZXIuZW1wdHkoKTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MCBcdTA0NDEgZmxleGJveCBsYXlvdXRcclxuXHRcdGNvbnN0IG1haW5Db250YWluZXIgPSBjb250YWluZXIuY3JlYXRlRGl2KCdsbG0tYWdlbnQtZ3JhcGgtbWFpbicpO1xyXG5cdFx0bWFpbkNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gYFxyXG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpO1xyXG4gICAgICAgIGA7XHJcblxyXG5cdFx0Ly8gXHUwNDFCXHUwNDM1XHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4XHJcblx0XHR0aGlzLmhpc3RvcnlDb250YWluZXIgPSBtYWluQ29udGFpbmVyLmNyZWF0ZURpdignbGxtLWFnZW50LWhpc3Rvcnktc2lkZWJhcicpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5pc0hpc3RvcnlDb2xsYXBzZWQgPyAnY29sbGFwc2VkJyA6ICdleHBhbmRlZCcpO1xyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQ0RiBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0NEMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMFxyXG5cdFx0dGhpcy5ncmFwaENvbnRhaW5lciA9IG1haW5Db250YWluZXIuY3JlYXRlRGl2KCdsbG0tYWdlbnQtZ3JhcGgtY29udGFpbmVyJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblx0XHR0aGlzLmdyYXBoQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBgXHJcbiAgICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KTtcclxuICAgICAgICBgO1xyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0NEMgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4XHJcblx0XHR0aGlzLmhpc3RvcnlQYW5lbCA9IG5ldyBIaXN0b3J5UGFuZWwoXHJcblx0XHRcdHRoaXMuaGlzdG9yeUNvbnRhaW5lcixcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGdyYXBoczogdGhpcy5ncmFwaHNMaXN0LFxyXG5cdFx0XHRcdGV2ZW50QnVzOiB0aGlzLnBsdWdpbi5ldmVudEJ1c1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR0aGlzLnBsdWdpblxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzggXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzlcclxuXHRcdHRoaXMuYWRkVG9nZ2xlQnV0dG9uKCk7XHJcblx0XHR0aGlzLmFkZEdsb2JhbEFjdGlvbkJ1dHRvbnMoKTsgLy8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMiBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzkgXHUwNDQ0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFJlYWN0IEZsb3dcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZUdyYXBoUGFuZWwoKTtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0NcdTA0NDFcdTA0NEYgXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQ0RlxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ25ldy1jaGF0JywgdGhpcy5oYW5kbGVOZXdDaGF0LmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ2dyYXBoLXNlbGVjdGVkJywgdGhpcy5oYW5kbGVHcmFwaFNlbGVjdGVkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ2RlbGV0ZS1ub2RlJywgdGhpcy5oYW5kbGVEZWxldGVOb2RlRnJvbUNoYXQuYmluZCh0aGlzKSk7IC8vIFx1MDQyMVx1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDM3IENoYXRQYW5lbFxyXG5cclxuXHRcdC8vIFdlYlNvY2tldCBFdmVudCBIYW5kbGVyc1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3dzLWdyYXBoLXRpdGxlLXVwZGF0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoVGl0bGVVcGRhdGVkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3dzLW5vZGUtdGl0bGUtdXBkYXRlZCcsIHRoaXMuaGFuZGxlTm9kZVRpdGxlVXBkYXRlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCd3cy1ub2RlLXR5cGUtY2hhbmdlZCcsIHRoaXMuaGFuZGxlTm9kZVR5cGVDaGFuZ2VkLmJpbmQodGhpcykpO1xyXG5cclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzdHJlYW0tZW5kZWQnLCB0aGlzLmhhbmRsZVN0cmVhbUVuZGVkLmJpbmQodGhpcykpO1xyXG5cclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyXHJcblx0XHRhd2FpdCB0aGlzLmZldGNoR3JhcGhzTGlzdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDEyXHUwNDRCXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLiBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRCLlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG5cdCAqL1xyXG5cdGFzeW5jIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAodGhpcy5oaXN0b3J5UGFuZWwpIHtcclxuXHRcdFx0dGhpcy5oaXN0b3J5UGFuZWwuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLmhpc3RvcnlQYW5lbCA9IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDQyXHUwNDNDXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFJlYWN0LVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0MlxyXG5cdFx0aWYgKHRoaXMucmVhY3RSb290KSB7XHJcblx0XHRcdHRoaXMucmVhY3RSb290LnVubW91bnQoKTtcclxuXHRcdFx0dGhpcy5yZWFjdFJvb3QgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignbmV3LWNoYXQnLCB0aGlzLmhhbmRsZU5ld0NoYXQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdncmFwaC1zZWxlY3RlZCcsIHRoaXMuaGFuZGxlR3JhcGhTZWxlY3RlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ2RlbGV0ZS1ub2RlJywgdGhpcy5oYW5kbGVEZWxldGVOb2RlRnJvbUNoYXQpO1xyXG5cclxuXHRcdC8vIFdlYlNvY2tldCBFdmVudCBDbGVhbnVwXHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3dzLWdyYXBoLXRpdGxlLXVwZGF0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoVGl0bGVVcGRhdGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignd3Mtbm9kZS10aXRsZS11cGRhdGVkJywgdGhpcy5oYW5kbGVOb2RlVGl0bGVVcGRhdGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignd3Mtbm9kZS10eXBlLWNoYW5nZWQnLCB0aGlzLmhhbmRsZU5vZGVUeXBlQ2hhbmdlZCk7XHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3N0cmVhbS1lbmRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtRW5kZWQpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ3VzdG9tIFRpdGxlIFVwZGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKiBcdTA0MkRcdTA0NDJcdTA0M0VcdTA0NDIgXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDM0IFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNEIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzBcdTA0M0NcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMFxyXG5cdCAqIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzJcdTA0M0VcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKi9cclxuXHR1cGRhdGVUaXRsZSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHRpdGxlRWxlbWVudCA9IHRoaXMuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcignLnZpZXctaGVhZGVyLXRpdGxlJyk7XHJcblx0XHRpZiAodGl0bGVFbGVtZW50KSB7XHJcblx0XHRcdHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlIHx8ICdMTE0gQWdlbnQgR3JhcGgnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGlzdG9yeSBQYW5lbCBUb2dnbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0M0MgXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0Qlx1MDQzQy5cclxuXHQgKi9cclxuXHR0b2dnbGVIaXN0b3J5UGFuZWwoKTogdm9pZCB7XHJcblx0XHR0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZCA9ICF0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZDtcclxuXHJcblx0XHRpZiAodGhpcy5pc0hpc3RvcnlDb2xsYXBzZWQpIHtcclxuXHRcdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2V4cGFuZGVkJyk7XHJcblx0XHRcdHRoaXMuaGlzdG9yeUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb2xsYXBzZWQnKTtcclxuXHRcdFx0dGhpcy50b2dnbGVCdXR0b24udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0NCJztcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuaGlzdG9yeUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdjb2xsYXBzZWQnKTtcclxuXHRcdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2V4cGFuZGVkJyk7XHJcblx0XHRcdHRoaXMudG9nZ2xlQnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0Qyc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHcmFwaCBQYW5lbCBJbnRlZ3JhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRhZGRUb2dnbGVCdXR0b24oKTogdm9pZCB7XHJcblx0XHRjb25zdCBidXR0b25XcmFwcGVyID0gdGhpcy5ncmFwaENvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdncmFwaC12aWV3LXRvb2xiYXInIH0pOyAvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0VcdTA0M0FcclxuXHRcdHRoaXMudG9nZ2xlQnV0dG9uID0gYnV0dG9uV3JhcHBlci5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6ICdnbG9iYWwtYWN0aW9uLWJ1dHRvbicgfSk7IC8vIGhpc3RvcnktdG9nZ2xlLWJ1dHRvblxyXG5cdFx0dGhpcy50b2dnbGVCdXR0b24udGV4dENvbnRlbnQgPSB0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZCA/ICdcdUQ4M0RcdURDQ0InIDogJ1x1Mjc0Qyc7XHJcblx0XHR0aGlzLnRvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlSGlzdG9yeVBhbmVsLmJpbmQodGhpcykpO1xyXG5cdFx0Y29uc29sZS5sb2coJ1RvZ2dsZSBidXR0b24gY3JlYXRlZCBhbmQgYXBwZW5kZWQ6JywgdGhpcy50b2dnbGVCdXR0b24pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyLlxyXG5cdCAqL1xyXG5cdGFkZEdsb2JhbEFjdGlvbkJ1dHRvbnMoKTogdm9pZCB7XHJcblx0XHRjb25zdCB0b29sYmFyID0gdGhpcy5ncmFwaENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZ3JhcGgtdmlldy10b29sYmFyJyk7XHJcblx0XHRpZiAoIXRvb2xiYXIpIHJldHVybjtcclxuXHJcblx0XHR0aGlzLmNvcHlTZWxlY3RlZEJ1dHRvbiA9IHRvb2xiYXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAnZ2xvYmFsLWFjdGlvbi1idXR0b24nLFxyXG5cdFx0XHRhdHRyOiB7ICdhcmlhLWxhYmVsJzogJ1x1MDQxQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCJywgJ2RhdGEtdG9vbHRpcCc6ICdcdTA0MUFcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QicgfSxcclxuXHRcdFx0dGV4dDogJ1x1RDgzRFx1RENDNCdcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5jb3B5U2VsZWN0ZWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNvcHlTZWxlY3RlZE5vZGVzLmJpbmQodGhpcykpO1xyXG5cclxuXHRcdHRoaXMuZGVsZXRlU2VsZWN0ZWRCdXR0b24gPSB0b29sYmFyLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcblx0XHRcdGNsczogJ2dsb2JhbC1hY3Rpb24tYnV0dG9uJyxcclxuXHRcdFx0YXR0cjogeyAnYXJpYS1sYWJlbCc6ICdcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QicsICdkYXRhLXRvb2x0aXAnOiAnXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEInIH0sXHJcblx0XHRcdHRleHQ6ICdcdUQ4M0RcdURERDFcdUZFMEYnXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZGVsZXRlU2VsZWN0ZWRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZURlbGV0ZVNlbGVjdGVkTm9kZXMuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uID0gdG9vbGJhci5jcmVhdGVFbCgnYnV0dG9uJywge1xyXG5cdFx0XHRjbHM6ICdnbG9iYWwtYWN0aW9uLWJ1dHRvbicsXHJcblx0XHRcdGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCcsICdkYXRhLXRvb2x0aXAnOiAnXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAnIH0sXHJcblx0XHRcdHRleHQ6ICdcdTI2OTlcdUZFMEYnIC8vIFx1MDQxOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzMCBcdTA0NDhcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0M0FcdTA0MzhcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVHcmFwaFNldHRpbmdzQ2xpY2suYmluZCh0aGlzKSk7XHJcblx0XHQvLyBcdTA0MTRcdTA0MzVcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDQzIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUsIFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFxyXG5cdFx0dGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uLnNldEF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKTtcclxuXHJcblx0XHR0aGlzLm5ld0luZGVwZW5kZW50Q2hhdEFjdGlvbkJ1dHRvbiA9IHRvb2xiYXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAnZ2xvYmFsLWFjdGlvbi1idXR0b24nLFxyXG5cdFx0XHRhdHRyOiB7ICdhcmlhLWxhYmVsJzogJ1x1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0M0RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M0NcdTA0NEJcdTA0MzkgXHUwNDQ3XHUwNDMwXHUwNDQyJywgJ2RhdGEtdG9vbHRpcCc6ICdcdTA0MURcdTA0MzBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDQzXHUwNDRFIFx1MDQzMVx1MDQzNVx1MDQ0MVx1MDQzNVx1MDQzNFx1MDQ0MywgXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSwgXHUwNDNEXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCcgfSxcclxuXHRcdFx0dGV4dDogJ1x1MjcyOCcgLy8gXHUwNDE4XHUwNDNCXHUwNDM4ICdcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDQ3XHUwNDMwXHUwNDQyJ1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLm5ld0luZGVwZW5kZW50Q2hhdEFjdGlvbkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuXHRcdFx0Ly8gXHUwNDJEXHUwNDNDXHUwNDM4XHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUsIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzNSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQyMlx1MDQxRVx1MDQxQlx1MDQyQ1x1MDQxQVx1MDQxRSBDaGF0Vmlld1xyXG5cdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdGFydC1uZXctaW5kZXBlbmRlbnQtY2hhdCcpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHcmFwaCBQYW5lbCBJbnRlZ3JhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzUgXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXCIuXHJcblx0ICovXHJcblx0aGFuZGxlR3JhcGhTZXR0aW5nc0NsaWNrKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdGVkR3JhcGhJZCB8fCAhdGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUpIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDIxXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDMwIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOC4nLCAzMDAwKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdG5ldyBHcmFwaFNldHRpbmdzTW9kYWwodGhpcy5hcHAsIHtcclxuXHRcdFx0YXBwOiB0aGlzLmFwcCxcclxuXHRcdFx0Z3JhcGhJZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsXHJcblx0XHRcdGdyYXBoVGl0bGU6IHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlLFxyXG5cdFx0XHRpbml0aWFsQ3VzdG9tU3lzdGVtUHJvbXB0OiB0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCxcclxuXHRcdFx0b25TYXZlOiB0aGlzLnNhdmVHcmFwaEN1c3RvbVN5c3RlbVByb21wdC5iaW5kKHRoaXMpXHJcblx0XHR9KS5vcGVuKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGdyYXBoSWQgLSBJRCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuXHJcblx0ICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBjdXN0b21TeXN0ZW1Qcm9tcHQgLSBcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzhcdTA0M0JcdTA0MzggbnVsbCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDMwLlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG5cdCAqL1xyXG5cdGFzeW5jIHNhdmVHcmFwaEN1c3RvbVN5c3RlbVByb21wdChncmFwaElkOiBzdHJpbmcsIGN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0aWYgKCFncmFwaElkKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNBLicsIDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9ncmFwaHMvJHtncmFwaElkfS9zZXR0aW5nc2AsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdQQVRDSCcsXHJcblx0XHRcdFx0aGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyBjdXN0b21fc3lzdGVtX3Byb21wdDogY3VzdG9tU3lzdGVtUHJvbXB0IH0pXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0NDFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMDogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvclRleHR9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQyMVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQ0M1x1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzRSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0QuJywgMjAwMCk7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM4IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBVSVxyXG5cdFx0XHRhd2FpdCB0aGlzLmZldGNoR3JhcGhEYXRhKGdyYXBoSWQpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwICR7Z3JhcGhJZH06YCwgZXJyb3IpO1xyXG5cdFx0XHRuZXcgTm90aWNlKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwOiAke2Vycm9yLm1lc3NhZ2V9YCwgNTAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgR3JhcGhQYW5lbENvbXBvbmVudCAoUmVhY3QgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyKSBcdTA0MzIgZ3JhcGhDb250YWluZXIuXHJcblx0ICogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyIFJlYWN0RE9NLmNyZWF0ZVJvb3QgXHUwNDM0XHUwNDNCXHUwNDRGIFJlYWN0IDE4LlxyXG5cdCAqL1xyXG5cdGluaXRpYWxpemVHcmFwaFBhbmVsKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5ncmFwaENvbnRhaW5lci5lbXB0eSgpO1xyXG5cdFx0Ly8gXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M0RcdTA0M0UgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzQVx1MDQzOCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRVx1MDQzRFx1MDQzOCBcdTA0MzFcdTA0NEJcdTA0M0JcdTA0MzggXHUwNDQ3XHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRDXHUwNDRFIGdyYXBoQ29udGFpbmVyXHJcblx0XHR0aGlzLmFkZFRvZ2dsZUJ1dHRvbigpO1xyXG5cdFx0dGhpcy5hZGRHbG9iYWxBY3Rpb25CdXR0b25zKCk7XHJcblxyXG5cdFx0Y29uc3Qgd3JhcHBlciA9IHRoaXMuZ3JhcGhDb250YWluZXIuY3JlYXRlRGl2KCk7XHJcblx0XHR3cmFwcGVyLnN0eWxlLmNzc1RleHQgPSAnd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsnO1xyXG5cclxuXHRcdGlmICghd3JhcHBlcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQ0QyB3cmFwcGVyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0NcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgUmVhY3QgRmxvdy4nKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChSZWFjdERPTSAmJiB0eXBlb2YgUmVhY3RET00uY3JlYXRlUm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHR0aGlzLnJlYWN0Um9vdCA9IFJlYWN0RE9NLmNyZWF0ZVJvb3Qod3JhcHBlcik7XHJcblx0XHRcdHRoaXMucmVuZGVyR3JhcGhQYW5lbCgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignUmVhY3RET00uY3JlYXRlUm9vdCBcdTA0M0RcdTA0MzUgXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNELiBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0NDFcdTA0NEMsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcInJlYWN0LWRvbS9jbGllbnRcIiBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNELicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgR3JhcGhQYW5lbENvbXBvbmVudCBcdTA0MzIgRE9NLlxyXG5cdCAqL1xyXG5cdHJlbmRlckdyYXBoUGFuZWwoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5yZWFjdFJvb3QpIHtcclxuXHRcdFx0dGhpcy5yZWFjdFJvb3QucmVuZGVyKFxyXG5cdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoR3JhcGhQYW5lbENvbXBvbmVudCwge1xyXG5cdFx0XHRcdFx0Z3JhcGhEYXRhOiB7XHJcblx0XHRcdFx0XHRcdG5vZGVzOiB0aGlzLmdyYXBoRGF0YS5ub2RlcyxcclxuXHRcdFx0XHRcdFx0ZWRnZXM6IHRoaXMuZ3JhcGhEYXRhLmVkZ2VzXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0b25Ob2RlQ2xpY2s6IHRoaXMuaGFuZGxlTm9kZUNsaWNrLmJpbmQodGhpcyksXHJcblx0XHRcdFx0XHRvbk5vZGVTZWxlY3Rpb25DaGFuZ2U6IHRoaXMuaGFuZGxlTm9kZVNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpLFxyXG5cdFx0XHRcdFx0b25Ob2RlRGVsZXRlOiB0aGlzLmhhbmRsZURlbGV0ZU5vZGUuYmluZCh0aGlzKSxcclxuXHRcdFx0XHRcdHNlbGVjdGVkTm9kZUlkczogdGhpcy5zZWxlY3RlZE5vZGVJZHMsXHJcblx0XHRcdFx0XHRhY3RpdmVOb2RlSWQ6IHRoaXMuY3VycmVudE5vZGUsXHJcblx0XHRcdFx0XHRhcHA6IHRoaXMucGx1Z2luLmFwcFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oJ1JlYWN0IHJvb3QgXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDMwIEdyYXBoUGFuZWxDb21wb25lbnQuJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyIFx1MDQ0MSBcdTA0MzFcdTA0NERcdTA0M0FcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzAuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgZmV0Y2hHcmFwaHNMaXN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9ncmFwaHNgKTtcclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMjogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvclRleHR9YCk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHRcdFx0dGhpcy5ncmFwaHNMaXN0ID0gZGF0YTtcclxuXHRcdFx0aWYgKHRoaXMuaGlzdG9yeVBhbmVsKSB7XHJcblx0XHRcdFx0dGhpcy5oaXN0b3J5UGFuZWwudXBkYXRlR3JhcGhzKHRoaXMuZ3JhcGhzTGlzdCk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMjonLCBlcnJvcik7XHJcblx0XHRcdC8vIE9wdGlvbmFsbHk6IHNob3cgYSBub3RpY2UgdG8gdGhlIHVzZXJcclxuXHRcdFx0Ly8gbmV3IE5vdGljZShgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzNVx1MDQzM1x1MDQzRSBJRC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JhcGhJZCAtIElEIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4LlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG5cdCAqL1xyXG5cdGFzeW5jIGZldGNoR3JhcGhEYXRhKGdyYXBoSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKCFncmFwaElkKSB7XHJcblx0XHRcdFx0dGhpcy5ncmFwaERhdGEgPSB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH07XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZE5vZGVJZHMuY2xlYXIoKTsgLy8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlID0gbnVsbDsgLy8gXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMFxyXG5cdFx0XHRcdHRoaXMudXBkYXRlVGl0bGUoKTsgLy8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQVxyXG5cdFx0XHRcdHRoaXMucmVuZGVyR3JhcGhQYW5lbCgpO1xyXG5cdFx0XHRcdC8vIFx1MDQxRFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0NDdcdTA0MzhcdTA0M0FcdTA0M0VcdTA0MzI6IHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2NoYXQtaGlzdG9yeS11cGRhdGVkJywgeyBncmFwaElkOiBudWxsLCBtZXNzYWdlczogW10sIGN1cnJlbnRfbm9kZV9pZDogbnVsbCB9KTtcclxuXHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1jdXN0b20tcHJvbXB0LXVwZGF0ZWQnLCB7IGdyYXBoX2lkOiBudWxsLCBjdXN0b21fc3lzdGVtX3Byb21wdDogbnVsbCB9KTsgLy8gXHUwNDIzXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDNDXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIENoYXRWaWV3IFx1MDQzRSBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDFcdTA0MzVcclxuXHRcdFx0XHRpZiAodGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uKSB7XHJcblx0XHRcdFx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uc2V0QXR0cignZGlzYWJsZWQnLCAndHJ1ZScpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vZ3JhcGhzLyR7Z3JhcGhJZH1gKTtcclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMDogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvclRleHR9YCk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcblx0XHRcdC8vIFx1MDQyN1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDQzXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQzNSBcdTA0NERcdTA0M0RcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0M0RcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1XHJcblx0XHRcdGNvbnN0IG5vZGVzV2l0aEdyYXBoSWQgPSBkYXRhLmdyYXBoX25vZGVzID8gZGF0YS5ncmFwaF9ub2Rlcy5tYXAoKG5vZGU6IGFueSkgPT4gKHsgLi4ubm9kZSwgZ3JhcGhfaWQ6IGdyYXBoSWQgfSkpIDogW107XHJcblxyXG5cdFx0XHR0aGlzLmdyYXBoRGF0YSA9IHtcclxuXHRcdFx0XHRub2Rlczogbm9kZXNXaXRoR3JhcGhJZCxcclxuXHRcdFx0XHRlZGdlczogZGF0YS5ncmFwaF9lZGdlcyB8fCBbXVxyXG5cdFx0XHR9O1xyXG5cdFx0XHR0aGlzLmN1cnJlbnROb2RlID0gZGF0YS5jdXJyZW50X25vZGVfaWQ7XHJcblxyXG5cdFx0XHQvLyBcdTA0MjNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNBIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMFxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSA9IGRhdGEudGl0bGUgfHwgZGF0YS5maXJzdF9tZXNzYWdlIHx8IGBcdTA0MTNcdTA0NDBcdTA0MzBcdTA0NDQgJHtncmFwaElkLnN1YnN0cmluZygwLCA4KX0uLi5gO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRpdGxlKCk7XHJcblxyXG5cdFx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IGRhdGEuY3VzdG9tX3N5c3RlbV9wcm9tcHQgfHwgbnVsbDtcclxuXHJcblx0XHRcdGlmICh0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24pIHtcclxuXHRcdFx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uc2V0QXR0cignZGlzYWJsZWQnLCBudWxsKTsgLy8gXHUwNDEwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcclxuXHRcdFx0dGhpcy5yZW5kZXJHcmFwaFBhbmVsKCk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MjJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIENoYXRWaWV3IFx1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHUwNDNDXHUwNDM4IFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDNDXHJcblx0XHRcdC8qIFx1MDQxRFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0NDdcdTA0MzhcdTA0M0FcdTA0M0VcdTA0MzI6IHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2NoYXQtaGlzdG9yeS11cGRhdGVkJywge1xyXG5cdFx0XHRcdGdyYXBoSWQ6IGdyYXBoSWQsXHJcblx0XHRcdFx0bWVzc2FnZXM6IGRhdGEubWVzc2FnZXMgfHwgW10sXHJcblx0XHRcdFx0Y3VycmVudF9ub2RlX2lkOiBkYXRhLmN1cnJlbnRfbm9kZV9pZCAvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IGN1cnJlbnRfbm9kZV9pZFxyXG5cdFx0XHR9KTsqL1xyXG5cdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1jdXN0b20tcHJvbXB0LXVwZGF0ZWQnLCB7XHJcblx0XHRcdFx0Z3JhcGhfaWQ6IGdyYXBoSWQsXHJcblx0XHRcdFx0Y3VzdG9tX3N5c3RlbV9wcm9tcHQ6IHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0XHJcblx0XHRcdH0pO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwOicsIGVycm9yKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBudWxsO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7IC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MSBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzVcclxuXHRcdFx0dGhpcy51cGRhdGVUaXRsZSgpOyAvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNBXHJcblx0XHRcdGlmICh0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24pIHtcclxuXHRcdFx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uc2V0QXR0cignZGlzYWJsZWQnLCAndHJ1ZScpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcsIHsgZ3JhcGhfaWQ6IGdyYXBoSWQsIGN1c3RvbV9zeXN0ZW1fcHJvbXB0OiBudWxsIH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzNVx1MDQzM1x1MDQzRSBJRC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JhcGhJZCAtIElEIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIC0gSUQgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlRGVsZXRlTm9kZShub2RlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdGVkR3JhcGhJZCkge1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MURcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMC4nLCAzMDAwKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vZ3JhcGhzLyR7dGhpcy5zZWxlY3RlZEdyYXBoSWR9L25vZGVzLyR7bm9kZUlkfWAsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdERUxFVEUnXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDIzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQ0M1x1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzRSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0QuJywgMjAwMCk7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLCBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM4IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzVcdTA0MzNcdTA0M0UuXHJcblx0XHRcdC8vIFx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyIENoYXRQYW5lbCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDRCXHUwNDNCXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0Q1x1MDQ0RSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDNBXHUwNDM4LlxyXG5cdFx0XHRhd2FpdCB0aGlzLmZldGNoR3JhcGhEYXRhKHRoaXMuc2VsZWN0ZWRHcmFwaElkKTtcclxuXHJcblx0XHRcdC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzMVx1MDQ0Qlx1MDQzQiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcclxuXHRcdFx0dGhpcy5zZWxlY3RlZE5vZGVJZHMuZGVsZXRlKG5vZGVJZCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtub2RlSWR9OmAsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwOiAke2Vycm9yLm1lc3NhZ2V9YCwgNTAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudCBIYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDQzIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuXHQgKiBcdTA0MjNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0MzggXHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSAnbm9kZS1zZWxlY3RlZCcuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCAtIElEIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcblx0ICovXHJcblx0aGFuZGxlTm9kZUNsaWNrKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gbm9kZUlkO1xyXG5cdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Qlx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzQyBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzVcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkTm9kZUlkcy5zaXplID4gMCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5jbGVhcigpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnbm9kZS1zZWxlY3RlZCcsIHsgbm9kZUlkLCBncmFwaElkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCB9KTtcclxuXHRcdHRoaXMucmVuZGVyR3JhcGhQYW5lbCgpOyAvLyBcdTA0MTJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXCJcdTA0MzZcdTA0MzhcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzVcIiBcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQxIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0M0VcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIC0gSUQgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTZWxlY3RlZCAtIFx1MDQxRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqL1xyXG5cdGhhbmRsZU5vZGVTZWxlY3Rpb25DaGFuZ2Uobm9kZUlkOiBzdHJpbmcsIGlzU2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdGlmIChpc1NlbGVjdGVkKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWROb2RlSWRzLmFkZChub2RlSWQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZE5vZGVJZHMuZGVsZXRlKG5vZGVJZCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnJlbmRlckdyYXBoUGFuZWwoKTsgLy8gXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyXHUwNDM4XHUwNDM3XHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzAgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM4IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzVcdTA0MzNcdTA0M0UuXHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlTmV3Q2hhdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRoaXMuZ3JhcGhEYXRhID0geyBub2RlczogW10sIGVkZ2VzOiBbXSB9O1xyXG5cdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XHJcblx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5jbGVhcigpO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgPSBudWxsO1xyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vZ3JhcGhzL25ld2AsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcclxuXHRcdFx0XHRoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmICghcmVzcG9uc2Uub2spIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzMVx1MDQ0RFx1MDQzQVx1MDQzNVx1MDQzRFx1MDQzNFx1MDQzNTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHRcdFx0Y29uc3QgbmV3R3JhcGhJZCA9IHJlc3VsdC5ncmFwaF9pZDtcclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaElkID0gbmV3R3JhcGhJZDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSAnXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCc7IC8vIFx1MDQxMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0QgZmV0Y2hHcmFwaERhdGEsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzFcdTA0NERcdTA0M0FcdTA0MzVcdTA0M0RcdTA0MzQgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNEXHUwNDM1XHUwNDQyIHRpdGxlXHJcblxyXG5cdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1zZWxlY3RlZCcsIHsgZ3JhcGhJZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsIGN1cnJlbnROb2RlOiBudWxsIH0pO1xyXG5cclxuXHRcdFx0dGhpcy5mZXRjaEdyYXBoc0xpc3QoKTsgLy8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzIgXHUwNDMyIEhpc3RvcnlQYW5lbFxyXG5cclxuXHRcdFx0Ly8gXHUwNDFEXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzRVx1MDQzMjogdGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnY2hhdC1oaXN0b3J5LXVwZGF0ZWQnLCB7IGdyYXBoSWQ6IHRoaXMuc2VsZWN0ZWRHcmFwaElkLCBtZXNzYWdlczogW10sIGN1cnJlbnRfbm9kZV9pZDogbnVsbCB9KTtcclxuXHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnZ3JhcGgtY3VzdG9tLXByb21wdC11cGRhdGVkJywgeyBncmFwaF9pZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsIGN1c3RvbV9zeXN0ZW1fcHJvbXB0OiBudWxsIH0pO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbikge1xyXG5cdFx0XHRcdHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbi5zZXRBdHRyKCdkaXNhYmxlZCcsIG51bGwpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzA6JywgZXJyb3IpO1xyXG5cdFx0XHRuZXcgTm90aWNlKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwOiAke2Vycm9yPy5tZXNzYWdlIHx8IGVycm9yfWAsIDUwMDApO1xyXG5cdFx0XHQvLyBcdTA0MjFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDEgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzUgXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDM4LCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDNEXHUwNDM1IFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzRSBcIlx1MDQ0NFx1MDQzMFx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRVwiIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMFxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkR3JhcGhJZCA9IG51bGw7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlID0gbnVsbDtcclxuXHRcdFx0dGhpcy51cGRhdGVUaXRsZSgpO1xyXG5cdFx0XHRpZiAodGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uLnNldEF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM4XHUwNDM3IFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzguXHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlR3JhcGhTZWxlY3RlZChkYXRhOiB7IGdyYXBoSWQ6IHN0cmluZzsgY3VycmVudE5vZGU6IHN0cmluZyB8IG51bGwgfSk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEdyYXBoSWQgPSBkYXRhLmdyYXBoSWQ7XHJcblx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5jbGVhcigpO1xyXG5cdFx0YXdhaXQgdGhpcy5mZXRjaEdyYXBoRGF0YShkYXRhLmdyYXBoSWQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzOFx1MDQzNyBDaGF0UGFuZWwuXHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlRGVsZXRlTm9kZUZyb21DaGF0KGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBub2RlSWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAoZGF0YS5ncmFwaElkID09PSB0aGlzLnNlbGVjdGVkR3JhcGhJZCkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmhhbmRsZURlbGV0ZU5vZGUoZGF0YS5ub2RlSWQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDIxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0EgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDNFXHUwNDNDXHUwNDQzIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQ0My4gXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRFx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzN1x1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzRFx1MDQzRSBcdTA0MzhcdTA0MzcgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMC4nLCAzMDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFwiXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEJcIi5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVDb3B5U2VsZWN0ZWROb2RlcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkTm9kZUlkcy5zaXplID09PSAwKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxMlx1MDQ0Qlx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Ri4nLCAyMDAwKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IG1lc3NhZ2VzVG9Db3B5OiBzdHJpbmdbXSA9IFtdO1xyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDMxXHUwNDM4XHUwNDQwXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDNBXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0Ly8gXHUwNDFEXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQ0Mlx1MDQzOFx1MDQ0MVx1MDQ0QyBcdTA0M0ZcdTA0M0Ugbm9kZXMgXHUwNDMyIGdyYXBoRGF0YSwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzBcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVxyXG5cdFx0Y29uc3Qgb3JkZXJlZE5vZGVJZHMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWROb2RlSWRzKTsgLy8gXHUwNDIxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0Rlx1MDQzNFx1MDQzRVx1MDQzQVxyXG5cdFx0Zm9yIChjb25zdCBub2RlSWQgb2Ygb3JkZXJlZE5vZGVJZHMpIHtcclxuXHRcdFx0Y29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGhEYXRhLm5vZGVzLmZpbmQoKG4pID0+IG4uaWQgPT09IG5vZGVJZCk7XHJcblx0XHRcdGlmIChub2RlICYmIG5vZGUuZGF0YSAmJiBub2RlLmRhdGEubWVzc2FnZSAmJiBub2RlLmRhdGEubWVzc2FnZS5jb250ZW50KSB7XHJcblx0XHRcdFx0bWVzc2FnZXNUb0NvcHkucHVzaChub2RlLmRhdGEubWVzc2FnZS5jb250ZW50KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChtZXNzYWdlc1RvQ29weS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQobWVzc2FnZXNUb0NvcHkuam9pbignXFxuXFxuLS0tIFx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyAtLS0gXFxuXFxuJykpO1xyXG5cdFx0XHRcdG5ldyBOb3RpY2UoYFx1MDQyMVx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRSAke21lc3NhZ2VzVG9Db3B5Lmxlbmd0aH0gXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5LmAsIDIwMDApO1xyXG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEY6JywgZXJyKTtcclxuXHRcdFx0XHRuZXcgTm90aWNlKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkuJywgMzAwMCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQ0NS4nLCAyMDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFwiXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEJcIi5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVEZWxldGVTZWxlY3RlZE5vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWROb2RlSWRzLnNpemUgPT09IDApIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDEyXHUwNDRCXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLicsIDIwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdGVkR3JhcGhJZCkge1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MURcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMi4nLCAzMDAwKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IERpYWxvZy5jb25maXJtKFxyXG5cdFx0XHR0aGlzLnBsdWdpbi5hcHAsXHJcblx0XHRcdGBcdTA0MTJcdTA0NEIgXHUwNDQzXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDRCLCBcdTA0NDdcdTA0NDJcdTA0M0UgXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyAke3RoaXMuc2VsZWN0ZWROb2RlSWRzLnNpemV9IFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzI/YFxyXG5cdFx0KTtcclxuXHRcdGlmICghY29uZmlybWVkKSByZXR1cm47XHJcblxyXG5cdFx0bmV3IE5vdGljZShgXHUwNDFEXHUwNDMwXHUwNDQ3XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDRFIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSAke3RoaXMuc2VsZWN0ZWROb2RlSWRzLnNpemV9IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMi4uLmAsIDIwMDApO1xyXG5cdFx0Y29uc3Qgbm9kZXNUb0RlbGV0ZSA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZE5vZGVJZHMpOyAvLyBcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDNFXHUwNDNBIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cclxuXHRcdGZvciAoY29uc3Qgbm9kZUlkIG9mIG5vZGVzVG9EZWxldGUpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L2dyYXBocy8ke3RoaXMuc2VsZWN0ZWRHcmFwaElkfS9ub2Rlcy8ke25vZGVJZH1gLCB7XHJcblx0XHRcdFx0XHRtZXRob2Q6ICdERUxFVEUnXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGlmICghcmVzcG9uc2Uub2spIHtcclxuXHRcdFx0XHRcdGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtub2RlSWR9OiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0bmV3IE5vdGljZShgXHUwNDIzXHUwNDM3XHUwNDM1XHUwNDNCICR7bm9kZUlkLnN1YnN0cmluZygwLCA4KX0uLi4gXHUwNDQzXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ4XHUwNDNEXHUwNDNFIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRC5gLCAxMDAwKTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtub2RlSWR9OmAsIGVycm9yKTtcclxuXHRcdFx0XHRuZXcgTm90aWNlKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtub2RlSWQuc3Vic3RyaW5nKDAsIDgpfS4uLjogJHtlcnJvci5tZXNzYWdlfWAsIDUwMDApO1xyXG5cdFx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0M0ZcdTA0NEJcdTA0NDJcdTA0M0FcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIsIFx1MDQzRFx1MDQzRSBcdTA0NDRcdTA0MzhcdTA0M0FcdTA0NDFcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDQzXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0M0VcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0Q1x1MDQ0RVxyXG5cdFx0dGhpcy5zZWxlY3RlZE5vZGVJZHMuY2xlYXIoKTtcclxuXHRcdGF3YWl0IHRoaXMuZmV0Y2hHcmFwaERhdGEodGhpcy5zZWxlY3RlZEdyYXBoSWQpOyAvLyBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NENcdTA0NEUgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzggXHUwNDQ3XHUwNDMwXHUwNDQyLVx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0Q1xyXG5cdFx0bmV3IE5vdGljZSgnXHUwNDFFXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzVcdTA0M0RcdTA0MzAuJywgMjAwMCk7XHJcblx0fVxyXG5cclxuXHRoYW5kbGVTdHJlYW1TdGFydGVkKGRhdGE6IHsgbm9kZUlkOiBzdHJpbmc7IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB9KTogdm9pZCB7XHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzLnNldChkYXRhLm5vZGVJZCwgZGF0YS5jb250cm9sbGVyKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0cmVhbUVuZGVkKGRhdGE6IHsgbm9kZUlkOiBzdHJpbmcgfSk6IHZvaWQge1xyXG5cdFx0dGhpcy5hY3RpdmVTdHJlYW1Db250cm9sbGVycy5kZWxldGUoZGF0YS5ub2RlSWQpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2ViU29ja2V0IEV2ZW50IEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3IFdlYlNvY2tldFxyXG5cdCAqL1xyXG5cdGhhbmRsZU5vZGVUeXBlQ2hhbmdlZChkYXRhOiB7IGdyYXBoSWQ6IHN0cmluZzsgbm9kZUlkOiBzdHJpbmc7IG5vZGVUeXBlOiBzdHJpbmcgfSk6IHZvaWQge1xyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQgIT09IGRhdGEuZ3JhcGhJZCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDIFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzIgZ3JhcGhEYXRhXHJcblx0XHRjb25zdCBub2RlSW5kZXggPSB0aGlzLmdyYXBoRGF0YS5ub2Rlcy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGRhdGEubm9kZUlkKTtcclxuXHRcdGlmIChub2RlSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdHRoaXMuZ3JhcGhEYXRhLm5vZGVzW25vZGVJbmRleF0udHlwZSA9IGRhdGEubm9kZVR5cGU7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQ0MSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0M0MgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDNFXHUwNDNDIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFxyXG5cdFx0XHR0aGlzLnJlbmRlckdyYXBoUGFuZWwoKTtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKGBcdTI3MDUgXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEIFx1MDQ0Mlx1MDQzOFx1MDQzRiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtkYXRhLm5vZGVJZH06IFwiJHtkYXRhLm5vZGVUeXBlfVwiYCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3IFdlYlNvY2tldFxyXG5cdCAqL1xyXG5cdGhhbmRsZUdyYXBoVGl0bGVVcGRhdGVkKGRhdGE6IHsgZ3JhcGhfaWQ6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFxyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRHcmFwaElkID09PSBkYXRhLmdyYXBoX2lkKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlID0gZGF0YS50aXRsZTtcclxuXHRcdFx0dGhpcy51cGRhdGVUaXRsZSgpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzIgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOFxyXG5cdFx0XHRpZiAodGhpcy5oaXN0b3J5UGFuZWwpIHtcclxuXHRcdFx0XHR0aGlzLmZldGNoR3JhcGhzTGlzdCgpOyAvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMlxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3IFdlYlNvY2tldFxyXG5cdCAqL1xyXG5cdGhhbmRsZU5vZGVUaXRsZVVwZGF0ZWQoZGF0YTogeyBncmFwaF9pZDogc3RyaW5nOyBub2RlX2lkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfSk6IHZvaWQge1xyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQgIT09IGRhdGEuZ3JhcGhfaWQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQzQyBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0MzIgZ3JhcGhEYXRhXHJcblx0XHRjb25zdCBub2RlSW5kZXggPSB0aGlzLmdyYXBoRGF0YS5ub2Rlcy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGRhdGEubm9kZV9pZCk7XHJcblx0XHRpZiAobm9kZUluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNBIFx1MDQzOCBcdTA0NDRcdTA0M0JcdTA0MzBcdTA0MzMgXHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0XHRcdHRoaXMuZ3JhcGhEYXRhLm5vZGVzW25vZGVJbmRleF0uZGF0YS50aXRsZSA9IGRhdGEudGl0bGU7XHJcblx0XHRcdHRoaXMuZ3JhcGhEYXRhLm5vZGVzW25vZGVJbmRleF0uZGF0YS50aXRsZV9nZW5lcmF0ZWQgPSB0cnVlO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0NDEgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOFxyXG5cdFx0XHQvLyBSZWFjdCBGbG93IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDIgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0JcclxuXHRcdFx0dGhpcy5yZW5kZXJHcmFwaFBhbmVsKCk7XHJcblxyXG5cdFx0XHRjb25zb2xlLmxvZyhgXHUyNzA1IFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0VcdTA0M0EgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwICR7ZGF0YS5ub2RlX2lkfTogXCIke2RhdGEudGl0bGV9XCJgKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG50eXBlIERpYWxvZ1R5cGUgPSAnYWxlcnQnIHwgJ2NvbmZpcm0nIHwgJ3Byb21wdCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRGlhbG9nIGV4dGVuZHMgTW9kYWwge1xyXG5cdHByaXZhdGUgdHlwZTogRGlhbG9nVHlwZTtcclxuXHRwcml2YXRlIG1lc3NhZ2U6IHN0cmluZztcclxuXHRwcml2YXRlIHJlc29sdmVGbjogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XHJcblx0cHJpdmF0ZSBpbnB1dFZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHRwcml2YXRlIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCB0eXBlOiBEaWFsb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIHBsYWNlaG9sZGVyID0gJycpIHtcclxuXHRcdHN1cGVyKGFwcCk7XHJcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xyXG5cdFx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcclxuXHRcdHRoaXMucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcclxuXHR9XHJcblxyXG5cdG9wZW4oKTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlc29sdmVGbiA9IHJlc29sdmU7XHJcblx0XHRcdHN1cGVyLm9wZW4oKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0b25PcGVuKCkge1xyXG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHRjb250ZW50RWwuY3JlYXRlRWwoJ2RpdicsIHsgdGV4dDogdGhpcy5tZXNzYWdlLCBjbHM6ICdkaWFsb2ctbWVzc2FnZScgfSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IHByb21wdCBcdTIwMTQgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIGlucHV0XHJcblx0XHRpZiAodGhpcy50eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRjb25zdCBpbnB1dCA9IGNvbnRlbnRFbC5jcmVhdGVFbCgnaW5wdXQnLCB7XHJcblx0XHRcdFx0dHlwZTogJ3RleHQnLFxyXG5cdFx0XHRcdGNsczogJ2RpYWxvZy1pbnB1dCcsXHJcblx0XHRcdFx0YXR0cjogeyBwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlciB9XHJcblx0XHRcdH0pIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG5cdFx0XHRpbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuaW5wdXRWYWx1ZSA9IGlucHV0LnZhbHVlO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aW5wdXQuZm9jdXMoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUFcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M0RcdTA0MzVcdTA0NDAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQVxyXG5cdFx0Y29uc3QgYnV0dG9uc0RpdiA9IGNvbnRlbnRFbC5jcmVhdGVEaXYoeyBjbHM6ICdkaWFsb2ctYnV0dG9ucycgfSk7XHJcblxyXG5cdFx0aWYgKHRoaXMudHlwZSA9PT0gJ2FsZXJ0Jykge1xyXG5cdFx0XHQvLyBcdTA0MjJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgT0tcclxuXHRcdFx0Y29uc3Qgb2tCdG4gPSBidXR0b25zRGl2LmNyZWF0ZUVsKCdidXR0b24nLCB7IHRleHQ6ICdPSycsIGNsczogJ21vZC1jdGEnIH0pO1xyXG5cdFx0XHRva0J0bi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVzb2x2ZUZuKHVuZGVmaW5lZCk7XHJcblx0XHRcdFx0dGhpcy5jbG9zZSgpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdjb25maXJtJyB8fCB0aGlzLnR5cGUgPT09ICdwcm9tcHQnKSB7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQ0Mlx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzMFxyXG5cdFx0XHRjb25zdCBjYW5jZWxCdG4gPSBidXR0b25zRGl2LmNyZWF0ZUVsKCdidXR0b24nLCB7IHRleHQ6ICdcdTA0MUVcdTA0NDJcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzAnIH0pO1xyXG5cdFx0XHRjYW5jZWxCdG4ub25jbGljayA9ICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlc29sdmVGbih0aGlzLnR5cGUgPT09ICdwcm9tcHQnID8gbnVsbCA6IGZhbHNlKTtcclxuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvLyBPS1xyXG5cdFx0XHRjb25zdCBva0J0biA9IGJ1dHRvbnNEaXYuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdGV4dDogJ09LJywgY2xzOiAnbW9kLWN0YScgfSk7XHJcblx0XHRcdG9rQnRuLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMudHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUZuKHRoaXMuaW5wdXRWYWx1ZSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUZuKHRydWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRvbkNsb3NlKCkge1xyXG5cdFx0dGhpcy5jb250ZW50RWwuZW1wdHkoKTtcclxuXHR9XHJcblxyXG5cdC8vIFx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzNSBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0VcdTA0MzRcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzNFx1MDQzRVx1MDQzMVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcclxuXHJcblx0c3RhdGljIHNob3coYXBwOiBBcHAsIHR5cGU6IERpYWxvZ1R5cGUsIG1lc3NhZ2U6IHN0cmluZywgcGxhY2Vob2xkZXIgPSAnJyk6IFByb21pc2U8YW55PiB7XHJcblx0XHRjb25zdCBkaWFsb2cgPSBuZXcgRGlhbG9nKGFwcCwgdHlwZSwgbWVzc2FnZSwgcGxhY2Vob2xkZXIpO1xyXG5cdFx0cmV0dXJuIGRpYWxvZy5vcGVuKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWxlcnQoYXBwOiBBcHAsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0cmV0dXJuIERpYWxvZy5zaG93KGFwcCwgJ2FsZXJ0JywgbWVzc2FnZSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29uZmlybShhcHA6IEFwcCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcblx0XHRyZXR1cm4gRGlhbG9nLnNob3coYXBwLCAnY29uZmlybScsIG1lc3NhZ2UpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHByb21wdChhcHA6IEFwcCwgbWVzc2FnZTogc3RyaW5nLCBwbGFjZWhvbGRlciA9ICcnKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcblx0XHRyZXR1cm4gRGlhbG9nLnNob3coYXBwLCAncHJvbXB0JywgbWVzc2FnZSwgcGxhY2Vob2xkZXIpO1xyXG5cdH1cclxufVxyXG4iLCAiLypcclxuICogXHUwNDIzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzOCBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMiBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAuIFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0IgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzMFxyXG4gKiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDhcdTA0M0JcdTA0NEJcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMzXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDMyLCBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzAgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDQ1IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzRVx1MDQzMiBcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzNVx1MDQzOSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzIuXHJcbiAqL1xyXG5cclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBFdmVudEJ1cyB9IGZyb20gJy4uL3V0aWxzL0V2ZW50QnVzJztcclxuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnc3JjL3V0aWxzL0RpYWxvZyc7XHJcblxyXG5leHBvcnQgY2xhc3MgSGlzdG9yeVBhbmVsIHtcclxuXHRjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG5cdHByb3BzOiB7XHJcblx0XHRncmFwaHM6IGFueVtdO1xyXG5cdFx0ZXZlbnRCdXM6IEV2ZW50QnVzO1xyXG5cdH07XHJcblx0cGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHRncmFwaHM6IGFueVtdO1xyXG5cdG5ld0NoYXRCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdGNsZWFyQWxsQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRjaGF0TGlzdDogSFRNTEVsZW1lbnQ7XHJcblx0Y29udGV4dE1lbnU6IEhUTUxFbGVtZW50O1xyXG5cdGRlbGV0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0cmVuYW1lQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRjb250ZXh0TWVudUdyYXBoSWQ6IHN0cmluZyB8IG51bGw7XHJcblx0Y3VycmVudFBhZ2U6IG51bWJlcjtcclxuXHRpdGVtc1BlclBhZ2U6IG51bWJlcjtcclxuXHRwYWdpbmF0aW9uQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRjb250YWluZXI6IEhUTUxFbGVtZW50LFxyXG5cdFx0cHJvcHM6IHtcclxuXHRcdFx0Z3JhcGhzOiBhbnlbXTtcclxuXHRcdFx0ZXZlbnRCdXM6IEV2ZW50QnVzO1xyXG5cdFx0fSxcclxuXHRcdHBsdWdpbjogTExNQWdlbnRQbHVnaW5cclxuXHQpIHtcclxuXHRcdHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cdFx0dGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0XHR0aGlzLmdyYXBocyA9IHByb3BzLmdyYXBocyB8fCBbXTtcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5pdGVtc1BlclBhZ2UgPSA0MDtcclxuXHJcblx0XHR0aGlzLmluaXQoKTtcclxuXHR9XHJcblxyXG5cdGluaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSBgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsbG0tYWdlbnQtaGlzdG9yeS1wYW5lbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpc3RvcnktaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzPlx1MDQxOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RiBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0JcdTA0M0VcdTA0MzNcdTA0M0VcdTA0MzI8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaXN0b3J5LWhlYWRlci1idXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJuZXctY2hhdC1idXR0b25cIiBjbGFzcz1cIm5ldy1jaGF0LWJ1dHRvblwiPisgXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQ0N1x1MDQzMFx1MDQ0MjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiY2xlYXItYWxsLWJ1dHRvblwiIGNsYXNzPVwiY2xlYXItYWxsLWJ1dHRvblwiPlx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NEI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtbGlzdFwiIGlkPVwiY2hhdC1saXN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1jb250YWluZXJcIiBpZD1cInBhZ2luYXRpb24tY29udGFpbmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudVwiIGlkPVwiY29udGV4dC1tZW51XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJyZW5hbWUtZ3JhcGgtYnV0dG9uXCI+XHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImRlbGV0ZS1ncmFwaC1idXR0b25cIj5cdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICBgO1xyXG5cclxuXHRcdHRoaXMubmV3Q2hhdEJ1dHRvbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNuZXctY2hhdC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRcdHRoaXMuY2xlYXJBbGxCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY2xlYXItYWxsLWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50OyAvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUVcclxuXHRcdHRoaXMuY2hhdExpc3QgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY2hhdC1saXN0JykgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHR0aGlzLnBhZ2luYXRpb25Db250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjcGFnaW5hdGlvbi1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDsgLy8gXHUwNDE0XHUwNDFFXHUwNDExXHUwNDEwXHUwNDEyXHUwNDFCXHUwNDE1XHUwNDFEXHUwNDFFXHJcblx0XHR0aGlzLmNvbnRleHRNZW51ID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI2NvbnRleHQtbWVudScpIGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0dGhpcy5yZW5hbWVCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjcmVuYW1lLWdyYXBoLWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50OyAvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUVcclxuXHRcdHRoaXMuZGVsZXRlQnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI2RlbGV0ZS1ncmFwaC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHJcblx0XHR0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHRcdHRoaXMucmVuZGVyR3JhcGhzKCk7XHJcblx0fVxyXG5cclxuXHRzZXR1cEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5uZXdDaGF0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnByb3BzLmV2ZW50QnVzLmVtaXQoJ25ldy1jaGF0Jyk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmNsZWFyQWxsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmhhbmRsZUNsZWFyQWxsQ2hhdHMoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuYW1lQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRpZiAodGhpcy5jb250ZXh0TWVudUdyYXBoSWQpIHtcclxuXHRcdFx0XHR0aGlzLmhhbmRsZVJlbmFtZUdyYXBoKHRoaXMuY29udGV4dE1lbnVHcmFwaElkKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5kZWxldGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmNvbnRleHRNZW51R3JhcGhJZCkge1xyXG5cdFx0XHRcdHRoaXMuaGFuZGxlRGVsZXRlR3JhcGgodGhpcy5jb250ZXh0TWVudUdyYXBoSWQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MTdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0RSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDM1IFx1MDQzMlx1MDQzRFx1MDQzNSBcdTA0MzVcdTA0MzNcdTA0M0VcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLmNvbnRleHRNZW51LmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XHJcblx0XHRcdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHJlbmRlckdyYXBocygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XHJcblx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB0aGlzLml0ZW1zUGVyUGFnZTtcclxuXHRcdGNvbnN0IGdyYXBoc1RvU2hvdyA9IHRoaXMuZ3JhcGhzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuXHJcblx0XHR0aGlzLmNoYXRMaXN0LmlubmVySFRNTCA9IGdyYXBoc1RvU2hvd1xyXG5cdFx0XHQubWFwKChncmFwaCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHRpdGxlQ2xhc3MgPSBncmFwaC50aXRsZV9nZW5lcmF0ZWQgPyAnZ3JhcGgtdGl0bGUtZ2VuZXJhdGVkJyA6ICdncmFwaC10aXRsZS1wZW5kaW5nJztcclxuXHRcdFx0XHRjb25zdCBkaXNwbGF5VGl0bGUgPSBncmFwaC50aXRsZSB8fCBncmFwaC5maXJzdF9tZXNzYWdlIHx8IGBcdTA0MTNcdTA0NDBcdTA0MzBcdTA0NDQgJHtncmFwaC5pZH1gO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtbGlzdC1pdGVtXCIgZGF0YS1ncmFwaC1pZD1cIiR7Z3JhcGguaWR9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtaXRlbS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWl0ZW0tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZSAke3RpdGxlQ2xhc3N9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtkaXNwbGF5VGl0bGV9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1pdGVtLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaGF0LWl0ZW0tb3B0aW9ucy1idXR0b25cIiBkYXRhLWdyYXBoLWlkPVwiJHtncmFwaC5pZH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTIyRUVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBgO1xyXG5cdFx0XHR9KVxyXG5cdFx0XHQuam9pbignJyk7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzlcclxuXHRcdHRoaXMuY2hhdExpc3QucXVlcnlTZWxlY3RvckFsbCgnLmNoYXQtbGlzdC1pdGVtJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0XHRpZiAoIShlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGF0LWl0ZW0tb3B0aW9ucy1idXR0b24nKSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgZ3JhcGhJZCA9IChpdGVtIGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0LmdyYXBoSWQ7XHJcblx0XHRcdFx0XHRpZiAoZ3JhcGhJZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnByb3BzLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLXNlbGVjdGVkJywgeyBncmFwaElkOiBncmFwaElkLCBjdXJyZW50Tm9kZTogbnVsbCB9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5jaGF0TGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hhdC1pdGVtLW9wdGlvbnMtYnV0dG9uJykuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XHJcblx0XHRcdGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHR0aGlzLnNob3dDb250ZXh0TWVudShlLCAoYnV0dG9uIGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0LmdyYXBoSWQgfHwgJycpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucmVuZGVyUGFnaW5hdGlvbigpO1xyXG5cdH1cclxuXHJcblx0cmVuZGVyUGFnaW5hdGlvbigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5ncmFwaHMubGVuZ3RoIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xyXG5cclxuXHRcdGlmICh0b3RhbFBhZ2VzIDw9IDEpIHtcclxuXHRcdFx0dGhpcy5wYWdpbmF0aW9uQ29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IHBhZ2luYXRpb25IVE1MID0gJzxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLWJ1dHRvbnNcIj4nO1xyXG5cclxuXHRcdC8vIFx1MDQxQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzMCBcIlx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Qlx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzMFx1MDQ0RlwiXHJcblx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IDEpIHtcclxuXHRcdFx0cGFnaW5hdGlvbkhUTUwgKz0gYDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWJ1dHRvblwiIGRhdGEtcGFnZT1cIiR7dGhpcy5jdXJyZW50UGFnZSAtIDF9XCI+XHUyMTkwPC9idXR0b24+YDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0M0NcdTA0MzVcdTA0NDBcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHJcblx0XHRjb25zdCBtYXhWaXNpYmxlUGFnZXMgPSA1O1xyXG5cdFx0bGV0IHN0YXJ0UGFnZSA9IE1hdGgubWF4KDEsIHRoaXMuY3VycmVudFBhZ2UgLSBNYXRoLmZsb29yKG1heFZpc2libGVQYWdlcyAvIDIpKTtcclxuXHRcdGxldCBlbmRQYWdlID0gTWF0aC5taW4odG90YWxQYWdlcywgc3RhcnRQYWdlICsgbWF4VmlzaWJsZVBhZ2VzIC0gMSk7XHJcblxyXG5cdFx0aWYgKGVuZFBhZ2UgLSBzdGFydFBhZ2UgPCBtYXhWaXNpYmxlUGFnZXMgLSAxKSB7XHJcblx0XHRcdHN0YXJ0UGFnZSA9IE1hdGgubWF4KDEsIGVuZFBhZ2UgLSBtYXhWaXNpYmxlUGFnZXMgKyAxKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoc3RhcnRQYWdlID4gMSkge1xyXG5cdFx0XHRwYWdpbmF0aW9uSFRNTCArPSBgPGJ1dHRvbiBjbGFzcz1cInBhZ2luYXRpb24tYnV0dG9uXCIgZGF0YS1wYWdlPVwiMVwiPjE8L2J1dHRvbj5gO1xyXG5cdFx0XHRpZiAoc3RhcnRQYWdlID4gMikge1xyXG5cdFx0XHRcdHBhZ2luYXRpb25IVE1MICs9IGA8c3BhbiBjbGFzcz1cInBhZ2luYXRpb24tZWxsaXBzaXNcIj4uLi48L3NwYW4+YDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAobGV0IGkgPSBzdGFydFBhZ2U7IGkgPD0gZW5kUGFnZTsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGFjdGl2ZUNsYXNzID0gaSA9PT0gdGhpcy5jdXJyZW50UGFnZSA/ICdhY3RpdmUnIDogJyc7XHJcblx0XHRcdHBhZ2luYXRpb25IVE1MICs9IGA8YnV0dG9uIGNsYXNzPVwicGFnaW5hdGlvbi1idXR0b24gJHthY3RpdmVDbGFzc31cIiBkYXRhLXBhZ2U9XCIke2l9XCI+JHtpfTwvYnV0dG9uPmA7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGVuZFBhZ2UgPCB0b3RhbFBhZ2VzKSB7XHJcblx0XHRcdGlmIChlbmRQYWdlIDwgdG90YWxQYWdlcyAtIDEpIHtcclxuXHRcdFx0XHRwYWdpbmF0aW9uSFRNTCArPSBgPHNwYW4gY2xhc3M9XCJwYWdpbmF0aW9uLWVsbGlwc2lzXCI+Li4uPC9zcGFuPmA7XHJcblx0XHRcdH1cclxuXHRcdFx0cGFnaW5hdGlvbkhUTUwgKz0gYDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWJ1dHRvblwiIGRhdGEtcGFnZT1cIiR7dG90YWxQYWdlc31cIj4ke3RvdGFsUGFnZXN9PC9idXR0b24+YDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUFcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzAgXCJcdTA0MjFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzBcdTA0NEZcIlxyXG5cdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPCB0b3RhbFBhZ2VzKSB7XHJcblx0XHRcdHBhZ2luYXRpb25IVE1MICs9IGA8YnV0dG9uIGNsYXNzPVwicGFnaW5hdGlvbi1idXR0b25cIiBkYXRhLXBhZ2U9XCIke3RoaXMuY3VycmVudFBhZ2UgKyAxfVwiPlx1MjE5MjwvYnV0dG9uPmA7XHJcblx0XHR9XHJcblxyXG5cdFx0cGFnaW5hdGlvbkhUTUwgKz0gJzwvZGl2Pic7XHJcblx0XHR0aGlzLnBhZ2luYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gcGFnaW5hdGlvbkhUTUw7XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0VcdTA0M0EgXHUwNDNGXHUwNDMwXHUwNDMzXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0XHR0aGlzLnBhZ2luYXRpb25Db250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnBhZ2luYXRpb24tYnV0dG9uJykuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XHJcblx0XHRcdGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgcGFnZSA9IHBhcnNlSW50KChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZGF0YXNldC5wYWdlIHx8ICcxJyk7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJHcmFwaHMoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNob3dDb250ZXh0TWVudShldmVudDogRXZlbnQsIGdyYXBoSWQ6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR0aGlzLmNvbnRleHRNZW51R3JhcGhJZCA9IGdyYXBoSWQ7XHJcblxyXG5cdFx0Y29uc3QgYnV0dG9uRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGNvbnN0IHJlY3QgPSBidXR0b25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuXHRcdGNvbnN0IHdvcmtzcGFjZUxlYWZDb250ZW50ID0gYnV0dG9uRWxlbWVudC5jbG9zZXN0KCcud29ya3NwYWNlLWxlYWYtY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuXHRcdGxldCByZWxhdGl2ZUNvbnRhaW5lclJlY3QgPSB7IGxlZnQ6IDAsIHRvcDogMCB9O1xyXG5cdFx0aWYgKHdvcmtzcGFjZUxlYWZDb250ZW50KSB7XHJcblx0XHRcdHJlbGF0aXZlQ29udGFpbmVyUmVjdCA9IHdvcmtzcGFjZUxlYWZDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IC53b3Jrc3BhY2UtbGVhZi1jb250ZW50IFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QsIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBjb250YWluZXIgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzN1x1MDQzMFx1MDQzRlx1MDQzMFx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0MzJcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzBcdTA0M0RcdTA0NDJcclxuXHRcdFx0cmVsYXRpdmVDb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0IC0gcmVsYXRpdmVDb250YWluZXJSZWN0LmxlZnR9cHhgO1xyXG5cdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS50b3AgPSBgJHtyZWN0LmJvdHRvbSAtIHJlbGF0aXZlQ29udGFpbmVyUmVjdC50b3AgKyA0fXB4YDtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGhhbmRsZVJlbmFtZUdyYXBoKGdyYXBoSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgZ3JhcGggPSB0aGlzLmdyYXBocy5maW5kKChnKSA9PiBnLmlkID09PSBncmFwaElkKTtcclxuXHRcdFx0aWYgKCFncmFwaCkgcmV0dXJuO1xyXG5cclxuXHRcdFx0Y29uc3QgY3VycmVudFRpdGxlID0gZ3JhcGgudGl0bGUgfHwgZ3JhcGguZmlyc3RfbWVzc2FnZSB8fCAnJztcclxuXHJcblx0XHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ1MVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzRcdTA0MzAgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRjb25zdCBuZXdUaXRsZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQodGhpcy5wbHVnaW4uYXBwLCAnXHUwNDEyXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzU6JywgY3VycmVudFRpdGxlKTtcclxuXHJcblx0XHRcdGlmIChuZXdUaXRsZSA9PT0gbnVsbCB8fCBuZXdUaXRsZS50cmltKCkgPT09ICcnKSB7XHJcblx0XHRcdFx0cmV0dXJuOyAvLyBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NEMgXHUwNDNFXHUwNDQyXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDNCIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0MzJcdTA0NTFcdTA0M0IgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjUwMDAvYXBpL2dyYXBocy8ke2dyYXBoSWR9L3JlbmFtZWAsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdQQVRDSCcsXHJcblx0XHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdFx0J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyB0aXRsZTogbmV3VGl0bGUudHJpbSgpIH0pXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSFRUUCBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAhIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0M1x1MDQ0MTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0JcdTA0M0VcdTA0M0FcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMlxyXG5cdFx0XHRjb25zdCBncmFwaEluZGV4ID0gdGhpcy5ncmFwaHMuZmluZEluZGV4KChnKSA9PiBnLmlkID09PSBncmFwaElkKTtcclxuXHRcdFx0aWYgKGdyYXBoSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dGhpcy5ncmFwaHNbZ3JhcGhJbmRleF0udGl0bGUgPSBuZXdUaXRsZS50cmltKCk7XHJcblx0XHRcdFx0dGhpcy5ncmFwaHNbZ3JhcGhJbmRleF0udGl0bGVfZ2VuZXJhdGVkID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJHcmFwaHMoKTtcclxuXHRcdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzA6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgaGFuZGxlQ2xlYXJBbGxDaGF0cygpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oJ1x1MDQxMlx1MDQ0QiBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NEIsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0NEI/IFx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzUgXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDM3XHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQ0Qy4nKTtcclxuXHJcblx0XHRcdGlmICghY29uZmlybWVkKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjUwMDAvYXBpL2dyYXBoc2AsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdERUxFVEUnXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSFRUUCBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAhIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0M1x1MDQ0MTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyXHJcblx0XHRcdHRoaXMuZ3JhcGhzID0gW107XHJcblx0XHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0XHR0aGlzLnJlbmRlckdyYXBocygpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIzXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDNDXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMSBcdTA0M0VcdTA0NDdcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0FcdTA0MzVcclxuXHRcdFx0dGhpcy5wcm9wcy5ldmVudEJ1cy5lbWl0KCdhbGwtY2hhdHMtY2xlYXJlZCcpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDNFXHUwNDMyOicsIGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGhhbmRsZURlbGV0ZUdyYXBoKGdyYXBoSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaS9ncmFwaHMvJHtncmFwaElkfWAsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdERUxFVEUnXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSFRUUCBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAhIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0M1x1MDQ0MTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyXHJcblx0XHRcdHRoaXMuZ3JhcGhzID0gdGhpcy5ncmFwaHMuZmlsdGVyKChncmFwaCkgPT4gZ3JhcGguaWQgIT09IGdyYXBoSWQpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFBXHUwNDNFXHUwNDQwXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDZcdTA0NDMgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRVxyXG5cdFx0XHRjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuZ3JhcGhzLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJQYWdlKTtcclxuXHRcdFx0aWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0b3RhbFBhZ2VzICYmIHRvdGFsUGFnZXMgPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IHRvdGFsUGFnZXM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMucmVuZGVyR3JhcGhzKCk7XHJcblx0XHRcdHRoaXMuY29udGV4dE1lbnUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwOicsIGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUdyYXBocyhuZXdHcmFwaHM6IGFueVtdKTogdm9pZCB7XHJcblx0XHR0aGlzLmdyYXBocyA9IG5ld0dyYXBocztcclxuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cdFx0dGhpcy5yZW5kZXJHcmFwaHMoKTtcclxuXHR9XHJcblxyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MkRcdTA0NDJcdTA0M0VcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBSZWFjdCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgR3JhcGhQYW5lbENvbXBvbmVudCwgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNEXHUwNDMwXHUwNDM3XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuICogXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzMi4gXHUwNDFFXHUwNDNEIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M0JcdTA0MzhcdTA0M0VcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDMgUmVhY3QgRmxvdyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG4gKiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM4IFx1MDQ0MFx1MDQ1MVx1MDQzMVx1MDQzNVx1MDQ0MCwgXHUwNDMwIFx1MDQ0Mlx1MDQzMFx1MDQzQVx1MDQzNlx1MDQzNSBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M0JcdTA0MzhcdTA0M0VcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDMgRGFncmUgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuICogXHUwNDEyXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0NEIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0JcdTA0MzhcdTA0NDdcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM1XHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuICovXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWFjdCAmIFJlYWN0IEZsb3cgSW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20vY2xpZW50JzsgLy8gPC0tIFx1MDQxOFx1MDQyMVx1MDQxRlx1MDQyMFx1MDQxMFx1MDQxMlx1MDQxQlx1MDQxNVx1MDQxRFx1MDQxRTogXHUwNDM0XHUwNDNCXHUwNDRGIGNyZWF0ZVJvb3QgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNEICdyZWFjdC1kb20vY2xpZW50J1xyXG5pbXBvcnQgUmVhY3RGbG93LCB7XHJcblx0YWRkRWRnZSxcclxuXHR1c2VOb2Rlc1N0YXRlLFxyXG5cdHVzZUVkZ2VzU3RhdGUsXHJcblx0QmFja2dyb3VuZCxcclxuXHRDb250cm9scyxcclxuXHRSZWFjdEZsb3dQcm92aWRlcixcclxuXHRDb25uZWN0aW9uLFxyXG5cdEVkZ2UsXHJcblx0QmFja2dyb3VuZFZhcmlhbnRcclxufSBmcm9tICdyZWFjdGZsb3cnO1xyXG5pbXBvcnQgeyBBcHAsIHNldEljb24gfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJ3NyYy91dGlscy9EaWFsb2cnO1xyXG5cclxuLy8gPC0tIFx1MDQxOFx1MDQyMVx1MDQxRlx1MDQyMFx1MDQxMFx1MDQxMlx1MDQxQlx1MDQxNVx1MDQxRFx1MDQxRTogXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0M0NcdTA0M0VcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0QywgXHUwNDQ3XHUwNDQyXHUwNDNFIGVzYnVpbGQgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDMgQ1NTIFx1MDQzOFx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQzMi5cclxuLy8gXHUwNDFFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDNFLCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM4IGVzYnVpbGQgXHUwNDM0XHUwNDNCXHUwNDRGIFJlYWN0LVx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzRVx1MDQzMiwgXHUwNDMyXHUwNDRCIFx1MDQzOFx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQzNSBDU1MgXHUwNDNGXHUwNDQwXHUwNDRGXHUwNDNDXHUwNDNFIFx1MDQzMiBKUy9UUyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IuXHJcbi8vIGVzYnVpbGQgXHUwNDM0XHUwNDNFXHUwNDNCXHUwNDM2XHUwNDM1XHUwNDNEIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBDU1MuXHJcbi8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQ0RVx1MDQ0Mlx1MDQ0MVx1MDQ0RiwgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRDXHUwNDQyXHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0NFx1MDQzOFx1MDQzM1x1MDQ0M1x1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBlc2J1aWxkIChcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsIFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNyBcdTA0M0ZcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzhcdTA0M0QgZXNidWlsZC1wbHVnaW4tY3NzLWJ1bmRsZSkuXHJcbmltcG9ydCAncmVhY3RmbG93L2Rpc3Qvc3R5bGUuY3NzJzsgLy8gXHUwNDE4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQlx1MDQzOCBSZWFjdEZsb3dcclxuXHJcbi8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0NEIgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQzQVx1MDQzOFx1MDQzNS1cdTA0M0JcdTA0MzhcdTA0MzFcdTA0M0UgXHUwNDNBXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzRFx1MDQzRVx1MDQzNFx1MDQ0QiwgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzOFx1MDQ0NSBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NENcclxuLy8gaW1wb3J0IEN1c3RvbU5vZGUgZnJvbSAnLi9DdXN0b21Ob2RlJztcclxuLy8gY29uc3Qgbm9kZVR5cGVzID0geyBjdXN0b206IEN1c3RvbU5vZGUgfTtcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEN1c3RvbSBOb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuaW1wb3J0IHsgSGFuZGxlLCBQb3NpdGlvbiB9IGZyb20gJ3JlYWN0Zmxvdyc7XHJcblxyXG4vKipcclxuICogXHUwNDE4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxLCBcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDQzIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSwgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDRCXHUwNDQ1IFx1MDQzMiBCYXNlTm9kZVdyYXBwZXIuXHJcbiAqL1xyXG5pbnRlcmZhY2UgQmFzZU5vZGVXcmFwcGVyRGF0YSB7XHJcblx0bGFiZWw6IHN0cmluZztcclxuXHR0aXRsZT86IHN0cmluZztcclxuXHR0aXRsZV9nZW5lcmF0ZWQ/OiBib29sZWFuO1xyXG5cdGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcblx0bm9kZUlkOiBzdHJpbmc7XHJcblx0Z3JhcGhJZDogc3RyaW5nO1xyXG5cdG9uTm9kZURlbGV0ZTogKG5vZGVJZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cdGlzQWN0aXZlOiBib29sZWFuO1xyXG5cdGFwcDogQXBwO1xyXG59XHJcblxyXG4vKipcclxuICogXHUwNDE4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxLCBcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDMyXHUwNDNFXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMCBCYXNlTm9kZVdyYXBwZXIuXHJcbiAqL1xyXG5pbnRlcmZhY2UgQmFzZU5vZGVXcmFwcGVyUHJvcHMge1xyXG5cdGRhdGE6IEJhc2VOb2RlV3JhcHBlckRhdGE7XHJcblx0aXNDb25uZWN0YWJsZTogYm9vbGVhbjtcclxuXHQvLyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlOyAvLyBcdTA0MjFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUsIFx1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAoXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzApXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCYXNlTm9kZVdyYXBwZXIgLSBcdTA0MUVcdTA0MzFcdTA0NDlcdTA0MzBcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDUxXHUwNDQwXHUwNDQyXHUwNDNBXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDNBXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMixcclxuICogXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDRFXHUwNDQ5XHUwNDMwXHUwNDRGIFx1MDQ0NVx1MDQ0RFx1MDQzRFx1MDQzNFx1MDQzQlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQzOCBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG4gKiBAcGFyYW0ge0Jhc2VOb2RlV3JhcHBlclByb3BzfSBwcm9wcyAtIFx1MDQyMVx1MDQzMlx1MDQzRVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXHJcbiAqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IFx1MDQyRFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBSZWFjdC5cclxuICovXHJcbmNvbnN0IEJhc2VOb2RlV3JhcHBlcjogUmVhY3QuRkM8QmFzZU5vZGVXcmFwcGVyUHJvcHM+ID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSwgY2hpbGRyZW4gfSkgPT4ge1xyXG5cdGNvbnN0IGRlbGV0ZUljb25SZWYgPSBSZWFjdC51c2VSZWY8SFRNTFNwYW5FbGVtZW50PihudWxsKTtcclxuXHRjb25zdCByZWdlbmVyYXRlSWNvblJlZiA9IFJlYWN0LnVzZVJlZjxIVE1MU3BhbkVsZW1lbnQ+KG51bGwpO1xyXG5cclxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xyXG5cdFx0aWYgKGRlbGV0ZUljb25SZWYuY3VycmVudCkge1xyXG5cdFx0XHRzZXRJY29uKGRlbGV0ZUljb25SZWYuY3VycmVudCwgJ3RyYXNoLTInKTtcclxuXHRcdH1cclxuXHRcdGlmIChyZWdlbmVyYXRlSWNvblJlZi5jdXJyZW50KSB7XHJcblx0XHRcdHNldEljb24ocmVnZW5lcmF0ZUljb25SZWYuY3VycmVudCwgJ3JlZnJlc2gtY3cnKTtcclxuXHRcdH1cclxuXHR9LCBbXSk7XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2ZW50IEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7UmVhY3QuTW91c2VFdmVudH0gZXZlbnQgLSBcdTA0MjFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwLlxyXG5cdCAqL1xyXG5cdGNvbnN0IGhhbmRsZU5vZGVEZWxldGUgPSBhc3luYyAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcclxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDJcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IG9uTm9kZUNsaWNrIFx1MDQzRFx1MDQzMCBcdTA0NDBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDM1XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybWVkID0gYXdhaXQgRGlhbG9nLmNvbmZpcm0oZGF0YS5hcHAsICdcdTA0MTJcdTA0NEIgXHUwNDQzXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDRCLCBcdTA0NDdcdTA0NDJcdTA0M0UgXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NERcdTA0NDJcdTA0M0VcdTA0NDIgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCPycpO1xyXG5cdFx0aWYgKGNvbmZpcm1lZCkge1xyXG5cdFx0XHRhd2FpdCBkYXRhLm9uTm9kZURlbGV0ZShkYXRhLm5vZGVJZCk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Y29uc3QgaGFuZGxlUmVnZW5lcmF0ZSA9IGFzeW5jIChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHQvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgRXZlbnRCdXMgXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFIHdvcmtzcGFjZS50cmlnZ2VyXHJcblx0XHRjb25zdCBldmVudEJ1cyA9IChkYXRhLmFwcCBhcyBhbnkpLnBsdWdpbnM/LnBsdWdpbnM/LlsnbGxtLWFnZW50LXBsdWdpbiddPy5ldmVudEJ1cztcclxuXHRcdGlmIChldmVudEJ1cykge1xyXG5cdFx0XHRldmVudEJ1cy5lbWl0KCdyZWdlbmVyYXRlLW1lc3NhZ2UnLCB7XHJcblx0XHRcdFx0Z3JhcGhJZDogZGF0YS5ncmFwaElkLFxyXG5cdFx0XHRcdG5vZGVJZDogZGF0YS5ub2RlSWQsXHJcblx0XHRcdFx0bW9kZWw6IChkYXRhLmFwcCBhcyBhbnkpLnBsdWdpbnM/LnBsdWdpbnM/LlsnbGxtLWFnZW50LXBsdWdpbiddPy5zZXR0aW5ncz8uZGVmYXVsdE1vZGVsIHx8ICdnZW1pbmktMi41LWZsYXNoJyAvLyBcdTA0MURcdTA0MUVcdTA0MTJcdTA0MUVcdTA0MTU6IFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NENcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fTtcclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHRSZWFjdC5GcmFnbWVudCxcclxuXHRcdG51bGwsXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZSwge1xyXG5cdFx0XHR0eXBlOiAnc291cmNlJyxcclxuXHRcdFx0cG9zaXRpb246IFBvc2l0aW9uLkJvdHRvbSxcclxuXHRcdFx0aXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZVxyXG5cdFx0fSksXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZSwge1xyXG5cdFx0XHR0eXBlOiAndGFyZ2V0JyxcclxuXHRcdFx0cG9zaXRpb246IFBvc2l0aW9uLlRvcCxcclxuXHRcdFx0aXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZVxyXG5cdFx0fSksXHJcblx0XHRjaGlsZHJlbiwgLy8gXHUwNDE3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0NENcdTA0NDFcdTA0NEYgXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcclxuXHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHRcdCdkaXYnLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Y2xhc3NOYW1lOiAnbm9kZS10b29sYmFyJyAvLyBcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDJcdTA0NDNcdTA0M0JcdTA0MzFcdTA0MzBcdTA0NDBcdTA0MzBcclxuXHRcdFx0fSxcclxuXHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdFx0XHQnYnV0dG9uJyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRvbkNsaWNrOiBoYW5kbGVOb2RlRGVsZXRlLFxyXG5cdFx0XHRcdFx0J2FyaWEtbGFiZWwnOiAnXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQicsXHJcblx0XHRcdFx0XHRjbGFzc05hbWU6ICdub2RlLWFjdGlvbi1idXR0b24gbm9kZS1kZWxldGUtYnV0dG9uJyAvLyBcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzhcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IHJlZjogZGVsZXRlSWNvblJlZiB9KSAvLyBcdTA0MkRcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHRcdFx0KSxcclxuXHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdFx0XHQnYnV0dG9uJyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRvbkNsaWNrOiBoYW5kbGVSZWdlbmVyYXRlLFxyXG5cdFx0XHRcdFx0J2FyaWEtbGFiZWwnOiAnXHUwNDIwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDJyxcclxuXHRcdFx0XHRcdGNsYXNzTmFtZTogJ25vZGUtYWN0aW9uLWJ1dHRvbiBub2RlLXJlZ2VuZXJhdGUtYnV0dG9uJyAvLyBcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzhcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IHJlZjogcmVnZW5lcmF0ZUljb25SZWYgfSkgLy8gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzhcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0FcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0XHRcdClcclxuXHRcdClcclxuXHQpO1xyXG59O1xyXG5cclxuLy8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIEN1c3RvbU5vZGUsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0MzJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDQzIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG4vLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzkgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDMwICd1c2VyJ1xyXG5jb25zdCBVc2VyTm9kZTogUmVhY3QuRkM8YW55PiA9ICh7IGRhdGEsIGlzQ29ubmVjdGFibGUgfSkgPT4ge1xyXG5cdGNvbnN0IGRpc3BsYXlMYWJlbCA9IGRhdGEudGl0bGUgfHwgZGF0YS5sYWJlbCB8fCAnXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDJztcclxuXHQvLyAuLi4gKHRpdGxlR2VuZXJhdGVkIFx1MDQzMVx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQ0OFx1MDQzNSBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNEIFx1MDQzMiBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0M0VcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDM1LCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwKVxyXG5cclxuXHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdEJhc2VOb2RlV3JhcHBlcixcclxuXHRcdHsgZGF0YTogZGF0YSwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSB9LFxyXG5cdFx0UmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgbnVsbCwgZGlzcGxheUxhYmVsKVxyXG5cdCk7XHJcbn07XHJcblxyXG4vLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQ0QiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIgKExMTU5vZGUsIFRvb2xOb2RlLCBFcnJvck5vZGUpIFx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzOFx1MDQ0N1x1MDQzRFx1MDQzRVxyXG5jb25zdCBMTE1Ob2RlOiBSZWFjdC5GQzxhbnk+ID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSB9KSA9PiB7XHJcblx0Y29uc3QgZGlzcGxheUxhYmVsID0gZGF0YS50aXRsZSB8fCBkYXRhLmxhYmVsIHx8ICdMTE0nO1xyXG5cdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzQVx1MDQzRVx1MDQzOSwgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzQlx1MDQzMFx1MDQ0MVx1MDQ0MSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNCXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0Y29uc3Qgbm9kZUNsYXNzTmFtZSA9IGRhdGEuaXNfcGxhY2Vob2xkZXIgPyAnbGxtLW5vZGUtcGxhY2Vob2xkZXInIDogJyc7XHJcblxyXG5cdHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0QmFzZU5vZGVXcmFwcGVyLFxyXG5cdFx0eyBkYXRhOiBkYXRhLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0sXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogbm9kZUNsYXNzTmFtZSB9LCBkaXNwbGF5TGFiZWwpXHJcblx0KTtcclxufTtcclxuXHJcbi8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0MzAgJ3Rvb2wnXHJcbmNvbnN0IFRvb2xOb2RlOiBSZWFjdC5GQzxhbnk+ID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSB9KSA9PiB7XHJcblx0Y29uc3QgZGlzcGxheUxhYmVsID0gZGF0YS50aXRsZSB8fCBkYXRhLmxhYmVsIHx8ICdcdTA0MThcdTA0M0RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDInO1xyXG5cdC8vIC4uLlxyXG5cclxuXHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdEJhc2VOb2RlV3JhcHBlcixcclxuXHRcdHsgZGF0YTogZGF0YSwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSB9LFxyXG5cdFx0UmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgbnVsbCwgZGlzcGxheUxhYmVsKVxyXG5cdCk7XHJcbn07XHJcblxyXG4vLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzkgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDMwICdlcnJvcidcclxuY29uc3QgRXJyb3JOb2RlOiBSZWFjdC5GQzxhbnk+ID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSB9KSA9PiB7XHJcblx0Y29uc3QgZGlzcGxheUxhYmVsID0gZGF0YS50aXRsZSB8fCBkYXRhLmxhYmVsIHx8ICdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAnO1xyXG5cdC8vIC4uLlxyXG5cclxuXHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdEJhc2VOb2RlV3JhcHBlcixcclxuXHRcdHsgZGF0YTogZGF0YSwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSB9LFxyXG5cdFx0UmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgbnVsbCwgZGlzcGxheUxhYmVsKVxyXG5cdCk7XHJcbn07XHJcblxyXG4vLyBcdTA0MjBcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQ0QiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzJcclxuY29uc3Qgbm9kZVR5cGVzID0ge1xyXG5cdHVzZXI6IFVzZXJOb2RlLFxyXG5cdGxsbTogTExNTm9kZSxcclxuXHR0b29sOiBUb29sTm9kZSxcclxuXHRlcnJvcjogRXJyb3JOb2RlXHJcblx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MyBcdTA0NDJcdTA0MzVcdTA0MzFcdTA0NEYgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDIG5vZGUudHlwZSA9PT0gJ2RlZmF1bHQnLCBcdTA0NDJcdTA0M0UgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQ4XHUwNDRDIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDJcdTA0M0VcdTA0MzZcdTA0MzUgXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDLFxyXG5cdC8vIFx1MDQzQlx1MDQzOFx1MDQzMVx1MDQzRSBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5ICdkZWZhdWx0JyBSZWFjdCBGbG93LlxyXG59O1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGFncmUgTGF5b3V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmltcG9ydCBkYWdyZSBmcm9tICdkYWdyZSc7IC8vIFx1MDQxOFx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0MzFcdTA0MzhcdTA0MzFcdTA0M0JcdTA0MzhcdTA0M0VcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDMgZGFncmVcclxuXHJcbi8vIFx1MDQyMlx1MDQzOFx1MDQzRlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgRGFncmUgKFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzOCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDNEXHUwNDRCKVxyXG5pbnRlcmZhY2UgRGFncmVOb2RlIHtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG5cdHdpZHRoOiBudW1iZXI7XHJcblx0aGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFx1MDQxOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIgRGFncmUgR3JhcGhcclxuY29uc3QgZGFncmVHcmFwaCA9IG5ldyBkYWdyZS5ncmFwaGxpYi5HcmFwaCgpLnNldERlZmF1bHRFZGdlTGFiZWwoKCkgPT4gKHt9KSk7XHJcblxyXG4vLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuLy8gXHUwNDFDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Q1x1MDQ0MVx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0M0FcdTA0MzAgXHUwNDMyIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0M0VcdTA0NDIgXHUwNDQwXHUwNDM1XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDMyIENTUy5cclxuY29uc3Qgbm9kZVdpZHRoID0gMTIwO1xyXG5jb25zdCBub2RlSGVpZ2h0ID0gNDA7XHJcblxyXG4vKipcclxuICogXHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzQlx1MDQzM1x1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzQyBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgRGFncmUgXHUwNDNBIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQzQyBcdTA0MzggXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBub2RlcyAtIFx1MDQxQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIgUmVhY3QgRmxvdy5cclxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBlZGdlcyAtIFx1MDQxQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0NDBcdTA0NTFcdTA0MzFcdTA0MzVcdTA0NDAgUmVhY3QgRmxvdy5cclxuICogQHBhcmFtIHsnVEInIHwgJ0xSJ30gW2RpcmVjdGlvbj0nVEInXSAtIFx1MDQxRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgKCdUQicgLSBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0NDMgXHUwNDMyXHUwNDNEXHUwNDM4XHUwNDM3LCAnTFInIC0gXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDMwIFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzRSkuXHJcbiAqIEByZXR1cm5zIHt7bm9kZXM6IGFueVtdLCBlZGdlczogYW55W119fSBcdTA0MUVcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIgXHUwNDQxIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ1MVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQ0MFx1MDQ1MVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzOCwgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzOC5cclxuICovXHJcbmNvbnN0IGdldExheW91dGVkRWxlbWVudHMgPSAobm9kZXM6IGFueVtdLCBlZGdlczogYW55W10sIGRpcmVjdGlvbjogJ1RCJyB8ICdMUicgPSAnVEInKSA9PiB7XHJcblx0Y29uc3QgaXNIb3Jpem9udGFsID0gZGlyZWN0aW9uID09PSAnTFInO1xyXG5cdC8vIFx1MDQxQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgMiBcdTA0NDBcdTA0NEZcdTA0MzRcdTA0MzBcclxuXHRkYWdyZUdyYXBoLnNldEdyYXBoKHtcclxuXHRcdHJhbmtkaXI6IGRpcmVjdGlvbixcclxuXHRcdHJhbmtzZXA6IDQwLCAvLyBcdTA0MjNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NENcdTA0NDhcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0MzBcdTA0M0NcdTA0MzggKFx1MDQ0MFx1MDQ0Rlx1MDQzNFx1MDQzMFx1MDQzQ1x1MDQzOClcclxuXHRcdG5vZGVzZXA6IDEwLCAvLyBcdTA0MjNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NENcdTA0NDhcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDMyIFx1MDQzRVx1MDQzNFx1MDQzRFx1MDQzRVx1MDQzQyBcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0MzVcclxuXHRcdGVkZ2VzZXA6IDIwLCAvLyBcdTA0MjBcdTA0MzBcdTA0NDFcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0MFx1MDQ1MVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzOFxyXG5cdFx0bWFyZ2lueDogMjAsIC8vIFx1MDQxRVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQ0QiBcdTA0M0ZcdTA0M0UgWFxyXG5cdFx0bWFyZ2lueTogMjAgLy8gXHUwNDFFXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDRCIFx1MDQzRlx1MDQzRSBZXHJcblx0fSk7XHJcblxyXG5cdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBEYWdyZSBcdTA0NDEgXHUwNDM0XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDNDXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzOFxyXG5cdG5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcclxuXHRcdC8vIFx1MDQxRlx1MDQ0Qlx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQzQ1x1MDQ0MVx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzIgRE9NIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQzRVx1MDQzMlxyXG5cdFx0Y29uc3Qgbm9kZUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7bm9kZS5pZH1cIl1gKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGNvbnN0IGRpbWVuc2lvbnMgPSBnZXROb2RlRGltZW5zaW9ucyhub2RlRWxlbWVudCk7XHJcblxyXG5cdFx0ZGFncmVHcmFwaC5zZXROb2RlKG5vZGUuaWQsIHtcclxuXHRcdFx0d2lkdGg6IE1hdGgubWluKGRpbWVuc2lvbnMud2lkdGggKyAxMCwgMTQwKSwgLy8gXHUwNDFFXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQ1x1MDQzMFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDNcclxuXHRcdFx0aGVpZ2h0OiBNYXRoLm1pbihkaW1lbnNpb25zLmhlaWdodCArIDEwLCA1MCkgLy8gXHUwNDFFXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQ1x1MDQzMFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0MzJcdTA0NEJcdTA0NDFcdTA0M0VcdTA0NDJcdTA0NDNcclxuXHRcdH0pO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDQwXHUwNDMwIFx1MDQzMiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgRGFncmVcclxuXHRlZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB7XHJcblx0XHQvLyBEYWdyZSBcdTA0M0VcdTA0MzZcdTA0MzhcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgaWQsIHNvdXJjZSwgdGFyZ2V0XHJcblx0XHRkYWdyZUdyYXBoLnNldEVkZ2UoZWRnZS5zb3VyY2UsIGVkZ2UudGFyZ2V0KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gXHUwNDEyXHUwNDRCXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0N1x1MDQ1MVx1MDQ0MiBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0ZGFncmUubGF5b3V0KGRhZ3JlR3JhcGgpO1xyXG5cclxuXHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBSZWFjdCBGbG93IFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0NDFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ3XHUwNDUxXHUwNDQyXHUwNDNFXHUwNDMyIERhZ3JlXHJcblx0Y29uc3QgbmV3Tm9kZXMgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcclxuXHRcdGNvbnN0IG5vZGVXaXRoUG9zaXRpb246IERhZ3JlTm9kZSA9IGRhZ3JlR3JhcGgubm9kZShub2RlLmlkKTtcclxuXHRcdGNvbnN0IG5vZGVEaW1lbnNpb25zID0gZGFncmVHcmFwaC5ub2RlKG5vZGUuaWQpO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdC4uLm5vZGUsXHJcblx0XHRcdHRhcmdldFBvc2l0aW9uOiBpc0hvcml6b250YWwgPyAnbGVmdCcgOiAndG9wJyxcclxuXHRcdFx0c291cmNlUG9zaXRpb246IGlzSG9yaXpvbnRhbCA/ICdyaWdodCcgOiAnYm90dG9tJyxcclxuXHRcdFx0cG9zaXRpb246IHtcclxuXHRcdFx0XHR4OiBub2RlV2l0aFBvc2l0aW9uLnggLSBub2RlRGltZW5zaW9ucy53aWR0aCAvIDIsXHJcblx0XHRcdFx0eTogbm9kZVdpdGhQb3NpdGlvbi55IC0gbm9kZURpbWVuc2lvbnMuaGVpZ2h0IC8gMlxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4geyBub2RlczogbmV3Tm9kZXMsIGVkZ2VzIH07XHJcbn07XHJcblxyXG4vLyBcdTA0MjRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDNFXHUwNDMyIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzhcdTA0MzcgRE9NXHJcbmNvbnN0IGdldE5vZGVEaW1lbnNpb25zID0gKG5vZGVFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gPT4ge1xyXG5cdGlmICghbm9kZUVsZW1lbnQpIHtcclxuXHRcdHJldHVybiB7IHdpZHRoOiAxMjAsIGhlaWdodDogNDAgfTsgLy8gRmFsbGJhY2sgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCXHJcblx0fVxyXG5cclxuXHRjb25zdCByZWN0ID0gbm9kZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0cmV0dXJuIHtcclxuXHRcdHdpZHRoOiBNYXRoLm1heChNYXRoLm1pbihyZWN0LndpZHRoLCAxMzApLCAxMDApLCAvLyBcdTA0MUVcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDQzOiBcdTA0M0NcdTA0MzhcdTA0M0QgMTAwcHgsIFx1MDQzQ1x1MDQzMFx1MDQzQVx1MDQ0MSAxMzBweFxyXG5cdFx0aGVpZ2h0OiBNYXRoLm1heChNYXRoLm1pbihyZWN0LmhlaWdodCwgNDUpLCAzMCkgLy8gXHUwNDFFXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQ0MVx1MDQzRVx1MDQ0Mlx1MDQ0MzogXHUwNDNDXHUwNDM4XHUwNDNEIDMwcHgsIFx1MDQzQ1x1MDQzMFx1MDQzQVx1MDQ0MSA0NXB4XHJcblx0fTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHcmFwaFBhbmVsUHJvcHNcclxuICogQHByb3BlcnR5IHt7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdOyB9fSBncmFwaERhdGEgLSBcdTA0MTRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgKFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QiBcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQwXHUwNDMwKS5cclxuICogQHByb3BlcnR5IHsobm9kZUlkOiBzdHJpbmcpID0+IHZvaWR9IG9uTm9kZUNsaWNrIC0gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDQzLlxyXG4gKiBAcHJvcGVydHkgeyhub2RlSWQ6IHN0cmluZywgaXNTZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZH0gb25Ob2RlU2VsZWN0aW9uQ2hhbmdlIC0gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLlxyXG4gKiBAcHJvcGVydHkgeyhub2RlSWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gb25Ob2RlRGVsZXRlIC0gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHNlbGVjdGVkTm9kZUlkcyAtIFx1MDQxRFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0MCBJRCBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyLlxyXG4gKi9cclxuaW50ZXJmYWNlIEdyYXBoUGFuZWxQcm9wcyB7XHJcblx0Z3JhcGhEYXRhOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH07XHJcblx0b25Ob2RlQ2xpY2s6IChub2RlSWQ6IHN0cmluZykgPT4gdm9pZDtcclxuXHRvbk5vZGVTZWxlY3Rpb25DaGFuZ2U6IChub2RlSWQ6IHN0cmluZywgaXNTZWxlY3RlZDogYm9vbGVhbikgPT4gdm9pZDtcclxuXHRvbk5vZGVEZWxldGU6IChub2RlSWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcclxuXHRzZWxlY3RlZE5vZGVJZHM6IFNldDxzdHJpbmc+O1xyXG5cdGFjdGl2ZU5vZGVJZDogc3RyaW5nIHwgbnVsbDsgXHJcblx0YXBwOiBBcHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHcmFwaFBhbmVsQ29tcG9uZW50IC0gUmVhY3QgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzMiBcdTA0NDEgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1XHUwNDNDIFJlYWN0IEZsb3cgXHUwNDM4IERhZ3JlLlxyXG4gKiBAcGFyYW0ge0dyYXBoUGFuZWxQcm9wc30gcHJvcHMgLSBcdTA0MjFcdTA0MzJcdTA0M0VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwLlxyXG4gKiBAcmV0dXJucyB7UmVhY3QuUmVhY3RFbGVtZW50fSBcdTA0MkRcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgUmVhY3QuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgR3JhcGhQYW5lbENvbXBvbmVudDogUmVhY3QuRkM8R3JhcGhQYW5lbFByb3BzPiA9ICh7XHJcblx0Z3JhcGhEYXRhLFxyXG5cdG9uTm9kZUNsaWNrLFxyXG5cdG9uTm9kZVNlbGVjdGlvbkNoYW5nZSxcclxuXHRvbk5vZGVEZWxldGUsXHJcblx0c2VsZWN0ZWROb2RlSWRzLFxyXG5cdGFjdGl2ZU5vZGVJZCxcclxuXHRhcHBcclxufSkgPT4ge1xyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlYWN0IEhvb2tzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdC8vIFx1MDQxOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzggXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDM1XHUwNDQwIFJlYWN0IEZsb3dcclxuXHRjb25zdCBbbm9kZXMsIHNldE5vZGVzLCBvbk5vZGVzQ2hhbmdlXSA9IHVzZU5vZGVzU3RhdGUoW10pO1xyXG5cdGNvbnN0IFtlZGdlcywgc2V0RWRnZXMsIG9uRWRnZXNDaGFuZ2VdID0gdXNlRWRnZXNTdGF0ZShbXSk7IC8vIG9uRWRnZXNTdGF0ZSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0UgXHUwNDNEXHUwNDMwIG9uRWRnZXNDaGFuZ2VcclxuXHJcblx0Ly8gXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIHVzZUVmZmVjdCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIERhZ3JlIGxheW91dCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcclxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0MzVcdTA0NDFcdTA0NDJcdTA0NEMgXHUwNDNCXHUwNDM4IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMFxyXG5cdFx0aWYgKGdyYXBoRGF0YS5ub2Rlcy5sZW5ndGggPiAwIHx8IGdyYXBoRGF0YS5lZGdlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGNvbnNvbGUubG9nKCdBcHBseWluZyBEYWdyZSBsYXlvdXQgd2l0aCBkYXRhOicsIGdyYXBoRGF0YSk7XHJcblxyXG5cdFx0XHRjb25zdCBpbml0aWFsTm9kZXNGb3JMYXlvdXQgPSBncmFwaERhdGEubm9kZXMubWFwKChub2RlKSA9PiAoe1xyXG5cdFx0XHRcdGlkOiBub2RlLmlkLFxyXG5cdFx0XHRcdHR5cGU6IG5vZGUudHlwZSB8fCAnZGVmYXVsdCcsXHJcblx0XHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdFx0bGFiZWw6IG5vZGUuZGF0YT8ubGFiZWwgfHwgYE5vZGUgJHtub2RlLmlkfWAsXHJcblx0XHRcdFx0XHR0aXRsZTogbm9kZS5kYXRhPy50aXRsZSxcclxuXHRcdFx0XHRcdHRpdGxlX2dlbmVyYXRlZDogbm9kZS5kYXRhPy50aXRsZV9nZW5lcmF0ZWQgfHwgZmFsc2UsXHJcblx0XHRcdFx0XHRvbk5vZGVEZWxldGU6IG9uTm9kZURlbGV0ZSxcclxuXHRcdFx0XHRcdGlzU2VsZWN0ZWQ6IHNlbGVjdGVkTm9kZUlkcy5oYXMobm9kZS5pZCksXHJcblx0XHRcdFx0XHRncmFwaElkOiBub2RlLmdyYXBoX2lkIHx8ICd1bmtub3duJywgLy8gXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0NTFcdTA0M0MgaWQgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQ0MSBcdTA0NERcdTA0M0RcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0M0RcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0RFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzRVx1MDQzQ1x1MDQzOFx1MDQzOCBcdTA0NDJcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzhcdTA0M0FcdTA0MzAgLSBcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDQyXHUwNDMwXHUwNDNBLCBcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzUgXHUwNDMxXHUwNDRCIFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzRSBcdTA0NDdcdTA0NDJcdTA0M0UtXHUwNDQyXHUwNDNFIFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQzRSBub2RlLmRhdGEubWVzc2FnZS5ncmFwaF9pZFxyXG5cdFx0XHRcdFx0bm9kZUlkOiBub2RlLmlkLFxyXG5cdFx0XHRcdFx0YXBwOiBhcHAsXHJcblx0XHRcdFx0XHRpc19wbGFjZWhvbGRlcjogbm9kZS5kYXRhPy5pc19wbGFjZWhvbGRlciB8fCBmYWxzZSwgLy8gXHUwNDFEXHUwNDFFXHUwNDEyXHUwNDFFXHUwNDE1OiBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQxIHBsYWNlaG9sZGVyXHJcblx0XHRcdFx0XHRpc0FjdGl2ZTogbm9kZS5pZCA9PT0gYWN0aXZlTm9kZUlkXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXHJcblx0XHRcdFx0Y2xhc3NOYW1lOiBgJHtzZWxlY3RlZE5vZGVJZHMuaGFzKG5vZGUuaWQpID8gJ3NlbGVjdGVkLW5vZGUnIDogJyd9ICR7XHJcblx0XHRcdFx0XHRub2RlLmlkID09PSBhY3RpdmVOb2RlSWQgPyAnYWN0aXZlLW5vZGUnIDogJydcclxuXHRcdFx0XHR9YFxyXG5cdFx0XHR9KSk7XHJcblxyXG5cdFx0XHRjb25zdCBpbml0aWFsRWRnZXNGb3JMYXlvdXQgPSBncmFwaERhdGEuZWRnZXMubWFwKChlZGdlKSA9PiAoe1xyXG5cdFx0XHRcdGlkOiBlZGdlLmlkLFxyXG5cdFx0XHRcdHNvdXJjZTogZWRnZS5zb3VyY2UsXHJcblx0XHRcdFx0dGFyZ2V0OiBlZGdlLnRhcmdldCxcclxuXHRcdFx0XHR0eXBlOiBlZGdlLnR5cGUgfHwgJ2RlZmF1bHQnXHJcblx0XHRcdH0pKTtcclxuXHJcblx0XHRcdC8vIFx1MDQyMVx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzMCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCIFx1MDQzMVx1MDQzNVx1MDQzNyBsYXlvdXRcclxuXHRcdFx0c2V0Tm9kZXMoaW5pdGlhbE5vZGVzRm9yTGF5b3V0KTtcclxuXHRcdFx0c2V0RWRnZXMoaW5pdGlhbEVkZ2VzRm9yTGF5b3V0KTtcclxuXHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBsYXlvdXQgXHUwNDQxIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzQVx1MDQzRVx1MDQzOSwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIERPTSBcdTA0NDNcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0M0IgXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QlxyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCB7IG5vZGVzOiBsYXlvdXRlZE5vZGVzLCBlZGdlczogbGF5b3V0ZWRFZGdlcyB9ID0gZ2V0TGF5b3V0ZWRFbGVtZW50cyhpbml0aWFsTm9kZXNGb3JMYXlvdXQsIGluaXRpYWxFZGdlc0ZvckxheW91dCk7XHJcblx0XHRcdFx0c2V0Tm9kZXMobGF5b3V0ZWROb2Rlcyk7XHJcblx0XHRcdFx0c2V0RWRnZXMobGF5b3V0ZWRFZGdlcyk7XHJcblx0XHRcdH0sIDEwMCk7IC8vIFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzQVx1MDQzMCAxMDBtcyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwIERPTVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0RcdTA0MzVcdTA0NDIsIFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcclxuXHRcdFx0c2V0Tm9kZXMoW10pO1xyXG5cdFx0XHRzZXRFZGdlcyhbXSk7XHJcblx0XHR9XHJcblx0fSwgW2dyYXBoRGF0YS5ub2RlcywgZ3JhcGhEYXRhLmVkZ2VzLCBvbk5vZGVEZWxldGUsIHNlbGVjdGVkTm9kZUlkcywgYWN0aXZlTm9kZUlkXSk7IC8vIFx1MDQxN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzODogXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcdTA0NDUgXHUwNDM4IFx1MDQ0MFx1MDQ1MVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0NSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAsIFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzMVx1MDQ0RFx1MDQzQSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYsIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEJcclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnQgSGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQxXHUwNDNFXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggKFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzVcdTA0M0RcdTA0M0UpLlxyXG5cdCAqIEBwYXJhbSB7Q29ubmVjdGlvbiB8IEVkZ2V9IHBhcmFtcyAtIFx1MDQxRlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0QiBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQxXHUwNDNFXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqL1xyXG5cdGNvbnN0IG9uQ29ubmVjdCA9IFJlYWN0LnVzZUNhbGxiYWNrKChwYXJhbXM6IENvbm5lY3Rpb24gfCBFZGdlKSA9PiBzZXRFZGdlcygoZWRzKSA9PiBhZGRFZGdlKHBhcmFtcywgZWRzKSksIFtzZXRFZGdlc10pO1xyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NDMuXHJcblx0ICogQHBhcmFtIHtSZWFjdC5Nb3VzZUV2ZW50fSBldmVudCAtIFx1MDQxRVx1MDQzMVx1MDQ0QVx1MDQzNVx1MDQzQVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7YW55fSBub2RlIC0gXHUwNDE0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCwgXHUwNDNGXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0MzFcdTA0NEJcdTA0M0IgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBLlxyXG5cdCAqL1xyXG5cdGNvbnN0IG5vZGVDbGlja0hhbmRsZXIgPSBSZWFjdC51c2VDYWxsYmFjayhcclxuXHRcdChldmVudDogUmVhY3QuTW91c2VFdmVudCwgbm9kZTogYW55KSA9PiB7XHJcblx0XHRcdGlmIChldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDIgU2hpZnQsIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHRcdFx0XHRvbk5vZGVTZWxlY3Rpb25DaGFuZ2Uobm9kZS5pZCwgIXNlbGVjdGVkTm9kZUlkcy5oYXMobm9kZS5pZCkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx1MDQxOFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzNSwgXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0EgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0M1xyXG5cdFx0XHRcdG9uTm9kZUNsaWNrKG5vZGUuaWQpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0W29uTm9kZUNsaWNrLCBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UsIHNlbGVjdGVkTm9kZUlkc11cclxuXHQpO1xyXG5cclxuXHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBSZWFjdEZsb3csIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDM4IFx1MDQzRlx1MDQzRSBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHJcblx0Y29uc3Qgb25QYW5lQ2xpY2sgPSBSZWFjdC51c2VDYWxsYmFjayhcclxuXHRcdChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQzMVx1MDQ0Qlx1MDQzQiBcdTA0M0JcdTA0MzggXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBIFx1MDQzRlx1MDQzRSBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzIChcdTA0M0RcdTA0MzUgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0MyBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQwXHUwNDQzKVxyXG5cdFx0XHRjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRcdGlmICghdGFyZ2V0LmNsb3Nlc3QoJy5yZWFjdC1mbG93X19ub2RlJykgJiYgIXRhcmdldC5jbG9zZXN0KCcucmVhY3QtZmxvd19fZWRnZScpKSB7XHJcblx0XHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQSBcdTA0MzFcdTA0NEJcdTA0M0IgXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NDMgXHUwNDM4IFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQwXHUwNDQzLCBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHRcdFx0aWYgKHNlbGVjdGVkTm9kZUlkcy5zaXplID4gMCkge1xyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyXHUwNDRCXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzMVx1MDQ0RFx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDMwIFx1MDQzMlx1MDQ0MVx1MDQzNVx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzlcclxuXHRcdFx0XHRcdHNlbGVjdGVkTm9kZUlkcy5mb3JFYWNoKChub2RlSWQpID0+IG9uTm9kZVNlbGVjdGlvbkNoYW5nZShub2RlSWQsIGZhbHNlKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0W3NlbGVjdGVkTm9kZUlkcywgb25Ob2RlU2VsZWN0aW9uQ2hhbmdlXVxyXG5cdCk7XHJcblxyXG5cdC8vIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRCIChFc2NhcGUpXHJcblx0UmVhY3QudXNlRWZmZWN0KCgpID0+IHtcclxuXHRcdGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuXHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcclxuXHRcdFx0XHRpZiAoc2VsZWN0ZWROb2RlSWRzLnNpemUgPiAwKSB7XHJcblx0XHRcdFx0XHRzZWxlY3RlZE5vZGVJZHMuZm9yRWFjaCgobm9kZUlkKSA9PiBvbk5vZGVTZWxlY3Rpb25DaGFuZ2Uobm9kZUlkLCBmYWxzZSkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcclxuXHRcdHJldHVybiAoKSA9PiB7XHJcblx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcclxuXHRcdH07XHJcblx0fSwgW3NlbGVjdGVkTm9kZUlkcywgb25Ob2RlU2VsZWN0aW9uQ2hhbmdlXSk7XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0J2RpdicsXHJcblx0XHR7IGNsYXNzTmFtZTogJ2dyYXBoLXBhbmVsJywgc3R5bGU6IHsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJScgfSB9LFxyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFJlYWN0Rmxvd1Byb3ZpZGVyIFx1MDQzMlx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQ0M1x1MDQzMyBSZWFjdEZsb3cgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzMCBcdTA0M0EgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDQzIFJlYWN0IEZsb3dcclxuXHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHRcdFJlYWN0Rmxvd1Byb3ZpZGVyLFxyXG5cdFx0XHRudWxsLFxyXG5cdFx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0XHRcdFJlYWN0RmxvdyxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRub2RlcyxcclxuXHRcdFx0XHRcdGVkZ2VzLFxyXG5cdFx0XHRcdFx0b25Ob2Rlc0NoYW5nZSwgLy8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzJcclxuXHRcdFx0XHRcdG9uRWRnZXNDaGFuZ2UsIC8vIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDM1XHUwNDQwXHJcblx0XHRcdFx0XHRvbkNvbm5lY3QsIC8vIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHRcdFx0XHRcdG9uTm9kZUNsaWNrOiBub2RlQ2xpY2tIYW5kbGVyLCAvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NDNcclxuXHRcdFx0XHRcdG9uUGFuZUNsaWNrOiBvblBhbmVDbGljaywgLy8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0UgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4XHJcblx0XHRcdFx0XHRmaXRWaWV3OiB0cnVlLCAvLyBcdTA0MTBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0MzggXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzOCBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDhcdTA0NDJcdTA0MzBcdTA0MzFcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzVcclxuXHRcdFx0XHRcdGF0dHJpYnV0aW9uUG9zaXRpb246ICdib3R0b20tcmlnaHQnLCAvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDMwXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMxXHUwNDQzXHUwNDQ2XHUwNDM4XHUwNDM4IFJlYWN0IEZsb3dcclxuXHRcdFx0XHRcdG5vZGVUeXBlcyxcclxuXHRcdFx0XHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0ZcdTA0MzBcdTA0NDBcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0NDBcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHRcdFx0XHRcdHpvb21PblNjcm9sbDogdHJ1ZSxcclxuXHRcdFx0XHRcdHBhbk9uRHJhZzogdHJ1ZSxcclxuXHRcdFx0XHRcdG1pblpvb206IDAuMSxcclxuXHRcdFx0XHRcdG1heFpvb206IDJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIFx1MDQxQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0QiBDb250cm9scyBcdTA0MzggQmFja2dyb3VuZCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0NEVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDM0XHUwNDNFXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDNEXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBSZWFjdEZsb3dcclxuXHRcdFx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xzLCBudWxsKSxcclxuXHRcdFx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KEJhY2tncm91bmQsIHsgdmFyaWFudDogQmFja2dyb3VuZFZhcmlhbnQuRG90cywgZ2FwOiAxMiwgc2l6ZTogMSB9KVxyXG5cdFx0XHQpXHJcblx0XHQpXHJcblx0KTtcclxufTtcclxuIiwgImltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCB1c2VNZW1vLCBtZW1vLCB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIGZvcndhcmRSZWYsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNjIGZyb20gJ2NsYXNzY2F0JztcbmltcG9ydCB7IHVzZVN0b3JlV2l0aEVxdWFsaXR5Rm4sIGNyZWF0ZVdpdGhFcXVhbGl0eUZuIH0gZnJvbSAnenVzdGFuZC90cmFkaXRpb25hbCc7XG5pbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnenVzdGFuZC9zaGFsbG93JztcbmltcG9ydCB7IHpvb21JZGVudGl0eSwgem9vbSB9IGZyb20gJ2QzLXpvb20nO1xuaW1wb3J0IHsgc2VsZWN0LCBwb2ludGVyIH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7IGRyYWcgfSBmcm9tICdkMy1kcmFnJztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbmNvbnN0IFN0b3JlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb25zdCBQcm92aWRlciQxID0gU3RvcmVDb250ZXh0LlByb3ZpZGVyO1xuXG5jb25zdCBlcnJvck1lc3NhZ2VzID0ge1xuICAgIGVycm9yMDAxOiAoKSA9PiAnW1JlYWN0IEZsb3ddOiBTZWVtcyBsaWtlIHlvdSBoYXZlIG5vdCB1c2VkIHp1c3RhbmQgcHJvdmlkZXIgYXMgYW4gYW5jZXN0b3IuIEhlbHA6IGh0dHBzOi8vcmVhY3RmbG93LmRldi9lcnJvciMwMDEnLFxuICAgIGVycm9yMDAyOiAoKSA9PiBcIkl0IGxvb2tzIGxpa2UgeW91J3ZlIGNyZWF0ZWQgYSBuZXcgbm9kZVR5cGVzIG9yIGVkZ2VUeXBlcyBvYmplY3QuIElmIHRoaXMgd2Fzbid0IG9uIHB1cnBvc2UgcGxlYXNlIGRlZmluZSB0aGUgbm9kZVR5cGVzL2VkZ2VUeXBlcyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQgb3IgbWVtb2l6ZSB0aGVtLlwiLFxuICAgIGVycm9yMDAzOiAobm9kZVR5cGUpID0+IGBOb2RlIHR5cGUgXCIke25vZGVUeXBlfVwiIG5vdCBmb3VuZC4gVXNpbmcgZmFsbGJhY2sgdHlwZSBcImRlZmF1bHRcIi5gLFxuICAgIGVycm9yMDA0OiAoKSA9PiAnVGhlIFJlYWN0IEZsb3cgcGFyZW50IGNvbnRhaW5lciBuZWVkcyBhIHdpZHRoIGFuZCBhIGhlaWdodCB0byByZW5kZXIgdGhlIGdyYXBoLicsXG4gICAgZXJyb3IwMDU6ICgpID0+ICdPbmx5IGNoaWxkIG5vZGVzIGNhbiB1c2UgYSBwYXJlbnQgZXh0ZW50LicsXG4gICAgZXJyb3IwMDY6ICgpID0+IFwiQ2FuJ3QgY3JlYXRlIGVkZ2UuIEFuIGVkZ2UgbmVlZHMgYSBzb3VyY2UgYW5kIGEgdGFyZ2V0LlwiLFxuICAgIGVycm9yMDA3OiAoaWQpID0+IGBUaGUgb2xkIGVkZ2Ugd2l0aCBpZD0ke2lkfSBkb2VzIG5vdCBleGlzdC5gLFxuICAgIGVycm9yMDA5OiAodHlwZSkgPT4gYE1hcmtlciB0eXBlIFwiJHt0eXBlfVwiIGRvZXNuJ3QgZXhpc3QuYCxcbiAgICBlcnJvcjAwODogKHNvdXJjZUhhbmRsZSwgZWRnZSkgPT4gYENvdWxkbid0IGNyZWF0ZSBlZGdlIGZvciAkeyFzb3VyY2VIYW5kbGUgPyAnc291cmNlJyA6ICd0YXJnZXQnfSBoYW5kbGUgaWQ6IFwiJHshc291cmNlSGFuZGxlID8gZWRnZS5zb3VyY2VIYW5kbGUgOiBlZGdlLnRhcmdldEhhbmRsZX1cIiwgZWRnZSBpZDogJHtlZGdlLmlkfS5gLFxuICAgIGVycm9yMDEwOiAoKSA9PiAnSGFuZGxlOiBObyBub2RlIGlkIGZvdW5kLiBNYWtlIHN1cmUgdG8gb25seSB1c2UgYSBIYW5kbGUgaW5zaWRlIGEgY3VzdG9tIE5vZGUuJyxcbiAgICBlcnJvcjAxMTogKGVkZ2VUeXBlKSA9PiBgRWRnZSB0eXBlIFwiJHtlZGdlVHlwZX1cIiBub3QgZm91bmQuIFVzaW5nIGZhbGxiYWNrIHR5cGUgXCJkZWZhdWx0XCIuYCxcbiAgICBlcnJvcjAxMjogKGlkKSA9PiBgTm9kZSB3aXRoIGlkIFwiJHtpZH1cIiBkb2VzIG5vdCBleGlzdCwgaXQgbWF5IGhhdmUgYmVlbiByZW1vdmVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIG5vZGUgaXMgZGVsZXRlZCBiZWZvcmUgdGhlIFwib25Ob2RlQ2xpY2tcIiBoYW5kbGVyIGlzIGNhbGxlZC5gLFxufTtcblxuY29uc3QgenVzdGFuZEVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZXNbJ2Vycm9yMDAxJ10oKTtcbmZ1bmN0aW9uIHVzZVN0b3JlKHNlbGVjdG9yLCBlcXVhbGl0eUZuKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VDb250ZXh0KFN0b3JlQ29udGV4dCk7XG4gICAgaWYgKHN0b3JlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih6dXN0YW5kRXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVN0b3JlV2l0aEVxdWFsaXR5Rm4oc3RvcmUsIHNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbn1cbmNvbnN0IHVzZVN0b3JlQXBpID0gKCkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlQ29udGV4dChTdG9yZUNvbnRleHQpO1xuICAgIGlmIChzdG9yZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoenVzdGFuZEVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIGdldFN0YXRlOiBzdG9yZS5nZXRTdGF0ZSxcbiAgICAgICAgc2V0U3RhdGU6IHN0b3JlLnNldFN0YXRlLFxuICAgICAgICBzdWJzY3JpYmU6IHN0b3JlLnN1YnNjcmliZSxcbiAgICAgICAgZGVzdHJveTogc3RvcmUuZGVzdHJveSxcbiAgICB9KSwgW3N0b3JlXSk7XG59O1xuXG5jb25zdCBzZWxlY3RvciRnID0gKHMpID0+IChzLnVzZXJTZWxlY3Rpb25BY3RpdmUgPyAnbm9uZScgOiAnYWxsJyk7XG5mdW5jdGlvbiBQYW5lbCh7IHBvc2l0aW9uLCBjaGlsZHJlbiwgY2xhc3NOYW1lLCBzdHlsZSwgLi4ucmVzdCB9KSB7XG4gICAgY29uc3QgcG9pbnRlckV2ZW50cyA9IHVzZVN0b3JlKHNlbGVjdG9yJGcpO1xuICAgIGNvbnN0IHBvc2l0aW9uQ2xhc3NlcyA9IGAke3Bvc2l0aW9ufWAuc3BsaXQoJy0nKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fcGFuZWwnLCBjbGFzc05hbWUsIC4uLnBvc2l0aW9uQ2xhc3Nlc10pLCBzdHlsZTogeyAuLi5zdHlsZSwgcG9pbnRlckV2ZW50cyB9LCAuLi5yZXN0IH0sIGNoaWxkcmVuKSk7XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0aW9uKHsgcHJvT3B0aW9ucywgcG9zaXRpb24gPSAnYm90dG9tLXJpZ2h0JyB9KSB7XG4gICAgaWYgKHByb09wdGlvbnM/LmhpZGVBdHRyaWJ1dGlvbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFBhbmVsLCB7IHBvc2l0aW9uOiBwb3NpdGlvbiwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2F0dHJpYnV0aW9uXCIsIFwiZGF0YS1tZXNzYWdlXCI6IFwiUGxlYXNlIG9ubHkgaGlkZSB0aGlzIGF0dHJpYnV0aW9uIHdoZW4geW91IGFyZSBzdWJzY3JpYmVkIHRvIFJlYWN0IEZsb3cgUHJvOiBodHRwczovL3JlYWN0Zmxvdy5kZXYvcHJvXCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgeyBocmVmOiBcImh0dHBzOi8vcmVhY3RmbG93LmRldlwiLCB0YXJnZXQ6IFwiX2JsYW5rXCIsIHJlbDogXCJub29wZW5lciBub3JlZmVycmVyXCIsIFwiYXJpYS1sYWJlbFwiOiBcIlJlYWN0IEZsb3cgYXR0cmlidXRpb25cIiB9LCBcIlJlYWN0IEZsb3dcIikpKTtcbn1cblxuY29uc3QgRWRnZVRleHQgPSAoeyB4LCB5LCBsYWJlbCwgbGFiZWxTdHlsZSA9IHt9LCBsYWJlbFNob3dCZyA9IHRydWUsIGxhYmVsQmdTdHlsZSA9IHt9LCBsYWJlbEJnUGFkZGluZyA9IFsyLCA0XSwgbGFiZWxCZ0JvcmRlclJhZGl1cyA9IDIsIGNoaWxkcmVuLCBjbGFzc05hbWUsIC4uLnJlc3QgfSkgPT4ge1xuICAgIGNvbnN0IGVkZ2VSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW2VkZ2VUZXh0QmJveCwgc2V0RWRnZVRleHRCYm94XSA9IHVzZVN0YXRlKHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgICBjb25zdCBlZGdlVGV4dENsYXNzZXMgPSBjYyhbJ3JlYWN0LWZsb3dfX2VkZ2UtdGV4dHdyYXBwZXInLCBjbGFzc05hbWVdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZWRnZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0QmJveCA9IGVkZ2VSZWYuY3VycmVudC5nZXRCQm94KCk7XG4gICAgICAgICAgICBzZXRFZGdlVGV4dEJib3goe1xuICAgICAgICAgICAgICAgIHg6IHRleHRCYm94LngsXG4gICAgICAgICAgICAgICAgeTogdGV4dEJib3gueSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4dEJib3gud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0ZXh0QmJveC5oZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtsYWJlbF0pO1xuICAgIGlmICh0eXBlb2YgbGFiZWwgPT09ICd1bmRlZmluZWQnIHx8ICFsYWJlbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3ggLSBlZGdlVGV4dEJib3gud2lkdGggLyAyfSAke3kgLSBlZGdlVGV4dEJib3guaGVpZ2h0IC8gMn0pYCwgY2xhc3NOYW1lOiBlZGdlVGV4dENsYXNzZXMsIHZpc2liaWxpdHk6IGVkZ2VUZXh0QmJveC53aWR0aCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nLCAuLi5yZXN0IH0sXG4gICAgICAgIGxhYmVsU2hvd0JnICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7IHdpZHRoOiBlZGdlVGV4dEJib3gud2lkdGggKyAyICogbGFiZWxCZ1BhZGRpbmdbMF0sIHg6IC1sYWJlbEJnUGFkZGluZ1swXSwgeTogLWxhYmVsQmdQYWRkaW5nWzFdLCBoZWlnaHQ6IGVkZ2VUZXh0QmJveC5oZWlnaHQgKyAyICogbGFiZWxCZ1BhZGRpbmdbMV0sIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlLXRleHRiZ1wiLCBzdHlsZTogbGFiZWxCZ1N0eWxlLCByeDogbGFiZWxCZ0JvcmRlclJhZGl1cywgcnk6IGxhYmVsQmdCb3JkZXJSYWRpdXMgfSkpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwidGV4dFwiLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlLXRleHRcIiwgeTogZWRnZVRleHRCYm94LmhlaWdodCAvIDIsIGR5OiBcIjAuM2VtXCIsIHJlZjogZWRnZVJlZiwgc3R5bGU6IGxhYmVsU3R5bGUgfSwgbGFiZWwpLFxuICAgICAgICBjaGlsZHJlbikpO1xufTtcbnZhciBFZGdlVGV4dCQxID0gbWVtbyhFZGdlVGV4dCk7XG5cbmNvbnN0IGdldERpbWVuc2lvbnMgPSAobm9kZSkgPT4gKHtcbiAgICB3aWR0aDogbm9kZS5vZmZzZXRXaWR0aCxcbiAgICBoZWlnaHQ6IG5vZGUub2Zmc2V0SGVpZ2h0LFxufSk7XG5jb25zdCBjbGFtcCA9ICh2YWwsIG1pbiA9IDAsIG1heCA9IDEpID0+IE1hdGgubWluKE1hdGgubWF4KHZhbCwgbWluKSwgbWF4KTtcbmNvbnN0IGNsYW1wUG9zaXRpb24gPSAocG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfSwgZXh0ZW50KSA9PiAoe1xuICAgIHg6IGNsYW1wKHBvc2l0aW9uLngsIGV4dGVudFswXVswXSwgZXh0ZW50WzFdWzBdKSxcbiAgICB5OiBjbGFtcChwb3NpdGlvbi55LCBleHRlbnRbMF1bMV0sIGV4dGVudFsxXVsxXSksXG59KTtcbi8vIHJldHVybnMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIHRoYXQgcmVwcmVzZW50cyB0aGUgdmVsb2NpdHkgb2YgdGhlIG1vdmVtZW50XG4vLyB3aGVuIHRoZSBtb3VzZSBpcyBjbG9zZSB0byB0aGUgZWRnZSBvZiB0aGUgY2FudmFzXG5jb25zdCBjYWxjQXV0b1BhblZlbG9jaXR5ID0gKHZhbHVlLCBtaW4sIG1heCkgPT4ge1xuICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICByZXR1cm4gY2xhbXAoTWF0aC5hYnModmFsdWUgLSBtaW4pLCAxLCA1MCkgLyA1MDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgcmV0dXJuIC1jbGFtcChNYXRoLmFicyh2YWx1ZSAtIG1heCksIDEsIDUwKSAvIDUwO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn07XG5jb25zdCBjYWxjQXV0b1BhbiA9IChwb3MsIGJvdW5kcykgPT4ge1xuICAgIGNvbnN0IHhNb3ZlbWVudCA9IGNhbGNBdXRvUGFuVmVsb2NpdHkocG9zLngsIDM1LCBib3VuZHMud2lkdGggLSAzNSkgKiAyMDtcbiAgICBjb25zdCB5TW92ZW1lbnQgPSBjYWxjQXV0b1BhblZlbG9jaXR5KHBvcy55LCAzNSwgYm91bmRzLmhlaWdodCAtIDM1KSAqIDIwO1xuICAgIHJldHVybiBbeE1vdmVtZW50LCB5TW92ZW1lbnRdO1xufTtcbmNvbnN0IGdldEhvc3RGb3JFbGVtZW50ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0Um9vdE5vZGU/LigpIHx8IHdpbmRvdz8uZG9jdW1lbnQ7XG5jb25zdCBnZXRCb3VuZHNPZkJveGVzID0gKGJveDEsIGJveDIpID0+ICh7XG4gICAgeDogTWF0aC5taW4oYm94MS54LCBib3gyLngpLFxuICAgIHk6IE1hdGgubWluKGJveDEueSwgYm94Mi55KSxcbiAgICB4MjogTWF0aC5tYXgoYm94MS54MiwgYm94Mi54MiksXG4gICAgeTI6IE1hdGgubWF4KGJveDEueTIsIGJveDIueTIpLFxufSk7XG5jb25zdCByZWN0VG9Cb3ggPSAoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pID0+ICh7XG4gICAgeCxcbiAgICB5LFxuICAgIHgyOiB4ICsgd2lkdGgsXG4gICAgeTI6IHkgKyBoZWlnaHQsXG59KTtcbmNvbnN0IGJveFRvUmVjdCA9ICh7IHgsIHksIHgyLCB5MiB9KSA9PiAoe1xuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aDogeDIgLSB4LFxuICAgIGhlaWdodDogeTIgLSB5LFxufSk7XG5jb25zdCBub2RlVG9SZWN0ID0gKG5vZGUpID0+ICh7XG4gICAgLi4uKG5vZGUucG9zaXRpb25BYnNvbHV0ZSB8fCB7IHg6IDAsIHk6IDAgfSksXG4gICAgd2lkdGg6IG5vZGUud2lkdGggfHwgMCxcbiAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0IHx8IDAsXG59KTtcbmNvbnN0IGdldEJvdW5kc09mUmVjdHMgPSAocmVjdDEsIHJlY3QyKSA9PiBib3hUb1JlY3QoZ2V0Qm91bmRzT2ZCb3hlcyhyZWN0VG9Cb3gocmVjdDEpLCByZWN0VG9Cb3gocmVjdDIpKSk7XG5jb25zdCBnZXRPdmVybGFwcGluZ0FyZWEgPSAocmVjdEEsIHJlY3RCKSA9PiB7XG4gICAgY29uc3QgeE92ZXJsYXAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyZWN0QS54ICsgcmVjdEEud2lkdGgsIHJlY3RCLnggKyByZWN0Qi53aWR0aCkgLSBNYXRoLm1heChyZWN0QS54LCByZWN0Qi54KSk7XG4gICAgY29uc3QgeU92ZXJsYXAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyZWN0QS55ICsgcmVjdEEuaGVpZ2h0LCByZWN0Qi55ICsgcmVjdEIuaGVpZ2h0KSAtIE1hdGgubWF4KHJlY3RBLnksIHJlY3RCLnkpKTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHhPdmVybGFwICogeU92ZXJsYXApO1xufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBpc1JlY3RPYmplY3QgPSAob2JqKSA9PiBpc051bWVyaWMob2JqLndpZHRoKSAmJiBpc051bWVyaWMob2JqLmhlaWdodCkgJiYgaXNOdW1lcmljKG9iai54KSAmJiBpc051bWVyaWMob2JqLnkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmNvbnN0IGlzTnVtZXJpYyA9IChuKSA9PiAhaXNOYU4obikgJiYgaXNGaW5pdGUobik7XG5jb25zdCBpbnRlcm5hbHNTeW1ib2wgPSBTeW1ib2wuZm9yKCdpbnRlcm5hbHMnKTtcbi8vIHVzZWQgZm9yIGExMXkga2V5IGJvYXJkIGNvbnRyb2xzIGZvciBub2RlcyBhbmQgZWRnZXNcbmNvbnN0IGVsZW1lbnRTZWxlY3Rpb25LZXlzID0gWydFbnRlcicsICcgJywgJ0VzY2FwZSddO1xuY29uc3QgZGV2V2FybiA9IChpZCwgbWVzc2FnZSkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtSZWFjdCBGbG93XTogJHttZXNzYWdlfSBIZWxwOiBodHRwczovL3JlYWN0Zmxvdy5kZXYvZXJyb3IjJHtpZH1gKTtcbiAgICB9XG59O1xuY29uc3QgaXNSZWFjdEtleWJvYXJkRXZlbnQgPSAoZXZlbnQpID0+ICduYXRpdmVFdmVudCcgaW4gZXZlbnQ7XG5mdW5jdGlvbiBpc0lucHV0RE9NTm9kZShldmVudCkge1xuICAgIGNvbnN0IGtiRXZlbnQgPSBpc1JlYWN0S2V5Ym9hcmRFdmVudChldmVudCkgPyBldmVudC5uYXRpdmVFdmVudCA6IGV2ZW50O1xuICAgIC8vIHVzaW5nIGNvbXBvc2VkIHBhdGggZm9yIGhhbmRsaW5nIHNoYWRvdyBkb21cbiAgICBjb25zdCB0YXJnZXQgPSAoa2JFdmVudC5jb21wb3NlZFBhdGg/LigpPy5bMF0gfHwgZXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCBpc0lucHV0ID0gWydJTlBVVCcsICdTRUxFQ1QnLCAnVEVYVEFSRUEnXS5pbmNsdWRlcyh0YXJnZXQ/Lm5vZGVOYW1lKSB8fCB0YXJnZXQ/Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7XG4gICAgLy8gd2hlbiBhbiBpbnB1dCBmaWVsZCBpcyBmb2N1c2VkIHdlIGRvbid0IHdhbnQgdG8gdHJpZ2dlciBkZWxldGlvbiBvciBtb3ZlbWVudCBvZiBub2Rlc1xuICAgIHJldHVybiBpc0lucHV0IHx8ICEhdGFyZ2V0Py5jbG9zZXN0KCcubm9rZXknKTtcbn1cbmNvbnN0IGlzTW91c2VFdmVudCA9IChldmVudCkgPT4gJ2NsaWVudFgnIGluIGV2ZW50O1xuY29uc3QgZ2V0RXZlbnRQb3NpdGlvbiA9IChldmVudCwgYm91bmRzKSA9PiB7XG4gICAgY29uc3QgaXNNb3VzZVRyaWdnZXJlZCA9IGlzTW91c2VFdmVudChldmVudCk7XG4gICAgY29uc3QgZXZ0WCA9IGlzTW91c2VUcmlnZ2VyZWQgPyBldmVudC5jbGllbnRYIDogZXZlbnQudG91Y2hlcz8uWzBdLmNsaWVudFg7XG4gICAgY29uc3QgZXZ0WSA9IGlzTW91c2VUcmlnZ2VyZWQgPyBldmVudC5jbGllbnRZIDogZXZlbnQudG91Y2hlcz8uWzBdLmNsaWVudFk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogZXZ0WCAtIChib3VuZHM/LmxlZnQgPz8gMCksXG4gICAgICAgIHk6IGV2dFkgLSAoYm91bmRzPy50b3AgPz8gMCksXG4gICAgfTtcbn07XG5jb25zdCBpc01hY09zID0gKCkgPT4gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yPy51c2VyQWdlbnQ/LmluZGV4T2YoJ01hYycpID49IDA7XG5cbmNvbnN0IEJhc2VFZGdlID0gKHsgaWQsIHBhdGgsIGxhYmVsWCwgbGFiZWxZLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCBpbnRlcmFjdGlvbldpZHRoID0gMjAsIH0pID0+IHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgaWQ6IGlkLCBzdHlsZTogc3R5bGUsIGQ6IHBhdGgsIGZpbGw6IFwibm9uZVwiLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fZWRnZS1wYXRoXCIsIG1hcmtlckVuZDogbWFya2VyRW5kLCBtYXJrZXJTdGFydDogbWFya2VyU3RhcnQgfSksXG4gICAgICAgIGludGVyYWN0aW9uV2lkdGggJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogcGF0aCwgZmlsbDogXCJub25lXCIsIHN0cm9rZU9wYWNpdHk6IDAsIHN0cm9rZVdpZHRoOiBpbnRlcmFjdGlvbldpZHRoLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fZWRnZS1pbnRlcmFjdGlvblwiIH0pKSxcbiAgICAgICAgbGFiZWwgJiYgaXNOdW1lcmljKGxhYmVsWCkgJiYgaXNOdW1lcmljKGxhYmVsWSkgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChFZGdlVGV4dCQxLCB7IHg6IGxhYmVsWCwgeTogbGFiZWxZLCBsYWJlbDogbGFiZWwsIGxhYmVsU3R5bGU6IGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnOiBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlOiBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nOiBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1czogbGFiZWxCZ0JvcmRlclJhZGl1cyB9KSkgOiBudWxsKSk7XG59O1xuQmFzZUVkZ2UuZGlzcGxheU5hbWUgPSAnQmFzZUVkZ2UnO1xuXG5jb25zdCBnZXRNYXJrZXJFbmQgPSAobWFya2VyVHlwZSwgbWFya2VyRW5kSWQpID0+IHtcbiAgICBpZiAodHlwZW9mIG1hcmtlckVuZElkICE9PSAndW5kZWZpbmVkJyAmJiBtYXJrZXJFbmRJZCkge1xuICAgICAgICByZXR1cm4gYHVybCgjJHttYXJrZXJFbmRJZH0pYDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBtYXJrZXJUeXBlICE9PSAndW5kZWZpbmVkJyA/IGB1cmwoI3JlYWN0LWZsb3dfXyR7bWFya2VyVHlwZX0pYCA6ICdub25lJztcbn07XG5mdW5jdGlvbiBnZXRNb3VzZUhhbmRsZXIkMShpZCwgZ2V0U3RhdGUsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gaGFuZGxlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gaGFuZGxlclxuICAgICAgICA6IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWRnZSA9IGdldFN0YXRlKCkuZWRnZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKGVkZ2UpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50LCB7IC4uLmVkZ2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG59XG4vLyB0aGlzIGlzIHVzZWQgZm9yIHN0cmFpZ2h0IGVkZ2VzIGFuZCBzaW1wbGUgc21vb3Roc3RlcCBlZGdlcyAoTFRSLCBSVEwsIEJUVCwgVFRCKVxuZnVuY3Rpb24gZ2V0RWRnZUNlbnRlcih7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFksIH0pIHtcbiAgICBjb25zdCB4T2Zmc2V0ID0gTWF0aC5hYnModGFyZ2V0WCAtIHNvdXJjZVgpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJYID0gdGFyZ2V0WCA8IHNvdXJjZVggPyB0YXJnZXRYICsgeE9mZnNldCA6IHRhcmdldFggLSB4T2Zmc2V0O1xuICAgIGNvbnN0IHlPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXRZIC0gc291cmNlWSkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclkgPSB0YXJnZXRZIDwgc291cmNlWSA/IHRhcmdldFkgKyB5T2Zmc2V0IDogdGFyZ2V0WSAtIHlPZmZzZXQ7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZLCB4T2Zmc2V0LCB5T2Zmc2V0XTtcbn1cbmZ1bmN0aW9uIGdldEJlemllckVkZ2VDZW50ZXIoeyBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZLCBzb3VyY2VDb250cm9sWCwgc291cmNlQ29udHJvbFksIHRhcmdldENvbnRyb2xYLCB0YXJnZXRDb250cm9sWSwgfSkge1xuICAgIC8vIGN1YmljIGJlemllciB0PTAuNSBtaWQgcG9pbnQsIG5vdCB0aGUgYWN0dWFsIG1pZCBwb2ludCwgYnV0IGVhc3kgdG8gY2FsY3VsYXRlXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjc1MTYxMDEvaG93LXRvLWZpbmQtZGlzdGFuY2UtbWlkLXBvaW50LW9mLWJlemllci1jdXJ2ZVxuICAgIGNvbnN0IGNlbnRlclggPSBzb3VyY2VYICogMC4xMjUgKyBzb3VyY2VDb250cm9sWCAqIDAuMzc1ICsgdGFyZ2V0Q29udHJvbFggKiAwLjM3NSArIHRhcmdldFggKiAwLjEyNTtcbiAgICBjb25zdCBjZW50ZXJZID0gc291cmNlWSAqIDAuMTI1ICsgc291cmNlQ29udHJvbFkgKiAwLjM3NSArIHRhcmdldENvbnRyb2xZICogMC4zNzUgKyB0YXJnZXRZICogMC4xMjU7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguYWJzKGNlbnRlclggLSBzb3VyY2VYKTtcbiAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5hYnMoY2VudGVyWSAtIHNvdXJjZVkpO1xuICAgIHJldHVybiBbY2VudGVyWCwgY2VudGVyWSwgb2Zmc2V0WCwgb2Zmc2V0WV07XG59XG5cbnZhciBDb25uZWN0aW9uTW9kZTtcbihmdW5jdGlvbiAoQ29ubmVjdGlvbk1vZGUpIHtcbiAgICBDb25uZWN0aW9uTW9kZVtcIlN0cmljdFwiXSA9IFwic3RyaWN0XCI7XG4gICAgQ29ubmVjdGlvbk1vZGVbXCJMb29zZVwiXSA9IFwibG9vc2VcIjtcbn0pKENvbm5lY3Rpb25Nb2RlIHx8IChDb25uZWN0aW9uTW9kZSA9IHt9KSk7XG52YXIgUGFuT25TY3JvbGxNb2RlO1xuKGZ1bmN0aW9uIChQYW5PblNjcm9sbE1vZGUpIHtcbiAgICBQYW5PblNjcm9sbE1vZGVbXCJGcmVlXCJdID0gXCJmcmVlXCI7XG4gICAgUGFuT25TY3JvbGxNb2RlW1wiVmVydGljYWxcIl0gPSBcInZlcnRpY2FsXCI7XG4gICAgUGFuT25TY3JvbGxNb2RlW1wiSG9yaXpvbnRhbFwiXSA9IFwiaG9yaXpvbnRhbFwiO1xufSkoUGFuT25TY3JvbGxNb2RlIHx8IChQYW5PblNjcm9sbE1vZGUgPSB7fSkpO1xudmFyIFNlbGVjdGlvbk1vZGU7XG4oZnVuY3Rpb24gKFNlbGVjdGlvbk1vZGUpIHtcbiAgICBTZWxlY3Rpb25Nb2RlW1wiUGFydGlhbFwiXSA9IFwicGFydGlhbFwiO1xuICAgIFNlbGVjdGlvbk1vZGVbXCJGdWxsXCJdID0gXCJmdWxsXCI7XG59KShTZWxlY3Rpb25Nb2RlIHx8IChTZWxlY3Rpb25Nb2RlID0ge30pKTtcblxudmFyIENvbm5lY3Rpb25MaW5lVHlwZTtcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkxpbmVUeXBlKSB7XG4gICAgQ29ubmVjdGlvbkxpbmVUeXBlW1wiQmV6aWVyXCJdID0gXCJkZWZhdWx0XCI7XG4gICAgQ29ubmVjdGlvbkxpbmVUeXBlW1wiU3RyYWlnaHRcIl0gPSBcInN0cmFpZ2h0XCI7XG4gICAgQ29ubmVjdGlvbkxpbmVUeXBlW1wiU3RlcFwiXSA9IFwic3RlcFwiO1xuICAgIENvbm5lY3Rpb25MaW5lVHlwZVtcIlNtb290aFN0ZXBcIl0gPSBcInNtb290aHN0ZXBcIjtcbiAgICBDb25uZWN0aW9uTGluZVR5cGVbXCJTaW1wbGVCZXppZXJcIl0gPSBcInNpbXBsZWJlemllclwiO1xufSkoQ29ubmVjdGlvbkxpbmVUeXBlIHx8IChDb25uZWN0aW9uTGluZVR5cGUgPSB7fSkpO1xudmFyIE1hcmtlclR5cGU7XG4oZnVuY3Rpb24gKE1hcmtlclR5cGUpIHtcbiAgICBNYXJrZXJUeXBlW1wiQXJyb3dcIl0gPSBcImFycm93XCI7XG4gICAgTWFya2VyVHlwZVtcIkFycm93Q2xvc2VkXCJdID0gXCJhcnJvd2Nsb3NlZFwiO1xufSkoTWFya2VyVHlwZSB8fCAoTWFya2VyVHlwZSA9IHt9KSk7XG5cbnZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICBQb3NpdGlvbltcIkxlZnRcIl0gPSBcImxlZnRcIjtcbiAgICBQb3NpdGlvbltcIlRvcFwiXSA9IFwidG9wXCI7XG4gICAgUG9zaXRpb25bXCJSaWdodFwiXSA9IFwicmlnaHRcIjtcbiAgICBQb3NpdGlvbltcIkJvdHRvbVwiXSA9IFwiYm90dG9tXCI7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuXG5mdW5jdGlvbiBnZXRDb250cm9sKHsgcG9zLCB4MSwgeTEsIHgyLCB5MiB9KSB7XG4gICAgaWYgKHBvcyA9PT0gUG9zaXRpb24uTGVmdCB8fCBwb3MgPT09IFBvc2l0aW9uLlJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBbMC41ICogKHgxICsgeDIpLCB5MV07XG4gICAgfVxuICAgIHJldHVybiBbeDEsIDAuNSAqICh5MSArIHkyKV07XG59XG5mdW5jdGlvbiBnZXRTaW1wbGVCZXppZXJQYXRoKHsgc291cmNlWCwgc291cmNlWSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFgsIHRhcmdldFksIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCB9KSB7XG4gICAgY29uc3QgW3NvdXJjZUNvbnRyb2xYLCBzb3VyY2VDb250cm9sWV0gPSBnZXRDb250cm9sKHtcbiAgICAgICAgcG9zOiBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgeDE6IHNvdXJjZVgsXG4gICAgICAgIHkxOiBzb3VyY2VZLFxuICAgICAgICB4MjogdGFyZ2V0WCxcbiAgICAgICAgeTI6IHRhcmdldFksXG4gICAgfSk7XG4gICAgY29uc3QgW3RhcmdldENvbnRyb2xYLCB0YXJnZXRDb250cm9sWV0gPSBnZXRDb250cm9sKHtcbiAgICAgICAgcG9zOiB0YXJnZXRQb3NpdGlvbixcbiAgICAgICAgeDE6IHRhcmdldFgsXG4gICAgICAgIHkxOiB0YXJnZXRZLFxuICAgICAgICB4Mjogc291cmNlWCxcbiAgICAgICAgeTI6IHNvdXJjZVksXG4gICAgfSk7XG4gICAgY29uc3QgW2xhYmVsWCwgbGFiZWxZLCBvZmZzZXRYLCBvZmZzZXRZXSA9IGdldEJlemllckVkZ2VDZW50ZXIoe1xuICAgICAgICBzb3VyY2VYLFxuICAgICAgICBzb3VyY2VZLFxuICAgICAgICB0YXJnZXRYLFxuICAgICAgICB0YXJnZXRZLFxuICAgICAgICBzb3VyY2VDb250cm9sWCxcbiAgICAgICAgc291cmNlQ29udHJvbFksXG4gICAgICAgIHRhcmdldENvbnRyb2xYLFxuICAgICAgICB0YXJnZXRDb250cm9sWSxcbiAgICB9KTtcbiAgICByZXR1cm4gW1xuICAgICAgICBgTSR7c291cmNlWH0sJHtzb3VyY2VZfSBDJHtzb3VyY2VDb250cm9sWH0sJHtzb3VyY2VDb250cm9sWX0gJHt0YXJnZXRDb250cm9sWH0sJHt0YXJnZXRDb250cm9sWX0gJHt0YXJnZXRYfSwke3RhcmdldFl9YCxcbiAgICAgICAgbGFiZWxYLFxuICAgICAgICBsYWJlbFksXG4gICAgICAgIG9mZnNldFgsXG4gICAgICAgIG9mZnNldFksXG4gICAgXTtcbn1cbmNvbnN0IFNpbXBsZUJlemllckVkZ2UgPSBtZW1vKCh7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFksIHNvdXJjZVBvc2l0aW9uID0gUG9zaXRpb24uQm90dG9tLCB0YXJnZXRQb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgbGFiZWwsIGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZSwgbWFya2VyRW5kLCBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aCwgfSkgPT4ge1xuICAgIGNvbnN0IFtwYXRoLCBsYWJlbFgsIGxhYmVsWV0gPSBnZXRTaW1wbGVCZXppZXJQYXRoKHtcbiAgICAgICAgc291cmNlWCxcbiAgICAgICAgc291cmNlWSxcbiAgICAgICAgc291cmNlUG9zaXRpb24sXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgICAgIHRhcmdldFBvc2l0aW9uLFxuICAgIH0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlRWRnZSwgeyBwYXRoOiBwYXRoLCBsYWJlbFg6IGxhYmVsWCwgbGFiZWxZOiBsYWJlbFksIGxhYmVsOiBsYWJlbCwgbGFiZWxTdHlsZTogbGFiZWxTdHlsZSwgbGFiZWxTaG93Qmc6IGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGU6IGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmc6IGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzOiBsYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZTogc3R5bGUsIG1hcmtlckVuZDogbWFya2VyRW5kLCBtYXJrZXJTdGFydDogbWFya2VyU3RhcnQsIGludGVyYWN0aW9uV2lkdGg6IGludGVyYWN0aW9uV2lkdGggfSkpO1xufSk7XG5TaW1wbGVCZXppZXJFZGdlLmRpc3BsYXlOYW1lID0gJ1NpbXBsZUJlemllckVkZ2UnO1xuXG5jb25zdCBoYW5kbGVEaXJlY3Rpb25zID0ge1xuICAgIFtQb3NpdGlvbi5MZWZ0XTogeyB4OiAtMSwgeTogMCB9LFxuICAgIFtQb3NpdGlvbi5SaWdodF06IHsgeDogMSwgeTogMCB9LFxuICAgIFtQb3NpdGlvbi5Ub3BdOiB7IHg6IDAsIHk6IC0xIH0sXG4gICAgW1Bvc2l0aW9uLkJvdHRvbV06IHsgeDogMCwgeTogMSB9LFxufTtcbmNvbnN0IGdldERpcmVjdGlvbiA9ICh7IHNvdXJjZSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldCwgfSkgPT4ge1xuICAgIGlmIChzb3VyY2VQb3NpdGlvbiA9PT0gUG9zaXRpb24uTGVmdCB8fCBzb3VyY2VQb3NpdGlvbiA9PT0gUG9zaXRpb24uUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS54IDwgdGFyZ2V0LnggPyB7IHg6IDEsIHk6IDAgfSA6IHsgeDogLTEsIHk6IDAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZS55IDwgdGFyZ2V0LnkgPyB7IHg6IDAsIHk6IDEgfSA6IHsgeDogMCwgeTogLTEgfTtcbn07XG5jb25zdCBkaXN0YW5jZSA9IChhLCBiKSA9PiBNYXRoLnNxcnQoTWF0aC5wb3coYi54IC0gYS54LCAyKSArIE1hdGgucG93KGIueSAtIGEueSwgMikpO1xuLy8gaXRoIHRoaXMgZnVuY3Rpb24gd2UgdHJ5IHRvIG1pbWljIGEgb3J0aG9nb25hbCBlZGdlIHJvdXRpbmcgYmVoYXZpb3VyXG4vLyBJdCdzIG5vdCBhcyBnb29kIGFzIGEgcmVhbCBvcnRob2dvbmFsIGVkZ2Ugcm91dGluZyBidXQgaXQncyBmYXN0ZXIgYW5kIGdvb2QgZW5vdWdoIGFzIGEgZGVmYXVsdCBmb3Igc3RlcCBhbmQgc21vb3RoIHN0ZXAgZWRnZXNcbmZ1bmN0aW9uIGdldFBvaW50cyh7IHNvdXJjZSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldCwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIGNlbnRlciwgb2Zmc2V0LCB9KSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gaGFuZGxlRGlyZWN0aW9uc1tzb3VyY2VQb3NpdGlvbl07XG4gICAgY29uc3QgdGFyZ2V0RGlyID0gaGFuZGxlRGlyZWN0aW9uc1t0YXJnZXRQb3NpdGlvbl07XG4gICAgY29uc3Qgc291cmNlR2FwcGVkID0geyB4OiBzb3VyY2UueCArIHNvdXJjZURpci54ICogb2Zmc2V0LCB5OiBzb3VyY2UueSArIHNvdXJjZURpci55ICogb2Zmc2V0IH07XG4gICAgY29uc3QgdGFyZ2V0R2FwcGVkID0geyB4OiB0YXJnZXQueCArIHRhcmdldERpci54ICogb2Zmc2V0LCB5OiB0YXJnZXQueSArIHRhcmdldERpci55ICogb2Zmc2V0IH07XG4gICAgY29uc3QgZGlyID0gZ2V0RGlyZWN0aW9uKHtcbiAgICAgICAgc291cmNlOiBzb3VyY2VHYXBwZWQsXG4gICAgICAgIHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldEdhcHBlZCxcbiAgICB9KTtcbiAgICBjb25zdCBkaXJBY2Nlc3NvciA9IGRpci54ICE9PSAwID8gJ3gnIDogJ3knO1xuICAgIGNvbnN0IGN1cnJEaXIgPSBkaXJbZGlyQWNjZXNzb3JdO1xuICAgIGxldCBwb2ludHMgPSBbXTtcbiAgICBsZXQgY2VudGVyWCwgY2VudGVyWTtcbiAgICBjb25zdCBzb3VyY2VHYXBPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICBjb25zdCB0YXJnZXRHYXBPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICBjb25zdCBbZGVmYXVsdENlbnRlclgsIGRlZmF1bHRDZW50ZXJZLCBkZWZhdWx0T2Zmc2V0WCwgZGVmYXVsdE9mZnNldFldID0gZ2V0RWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVg6IHNvdXJjZS54LFxuICAgICAgICBzb3VyY2VZOiBzb3VyY2UueSxcbiAgICAgICAgdGFyZ2V0WDogdGFyZ2V0LngsXG4gICAgICAgIHRhcmdldFk6IHRhcmdldC55LFxuICAgIH0pO1xuICAgIC8vIG9wcG9zaXRlIGhhbmRsZSBwb3NpdGlvbnMsIGRlZmF1bHQgY2FzZVxuICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdICogdGFyZ2V0RGlyW2RpckFjY2Vzc29yXSA9PT0gLTEpIHtcbiAgICAgICAgY2VudGVyWCA9IGNlbnRlci54ID8/IGRlZmF1bHRDZW50ZXJYO1xuICAgICAgICBjZW50ZXJZID0gY2VudGVyLnkgPz8gZGVmYXVsdENlbnRlclk7XG4gICAgICAgIC8vICAgIC0tLT5cbiAgICAgICAgLy8gICAgfFxuICAgICAgICAvLyA+LS0tXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU3BsaXQgPSBbXG4gICAgICAgICAgICB7IHg6IGNlbnRlclgsIHk6IHNvdXJjZUdhcHBlZC55IH0sXG4gICAgICAgICAgICB7IHg6IGNlbnRlclgsIHk6IHRhcmdldEdhcHBlZC55IH0sXG4gICAgICAgIF07XG4gICAgICAgIC8vICAgIHxcbiAgICAgICAgLy8gIC0tLVxuICAgICAgICAvLyAgfFxuICAgICAgICBjb25zdCBob3Jpem9udGFsU3BsaXQgPSBbXG4gICAgICAgICAgICB7IHg6IHNvdXJjZUdhcHBlZC54LCB5OiBjZW50ZXJZIH0sXG4gICAgICAgICAgICB7IHg6IHRhcmdldEdhcHBlZC54LCB5OiBjZW50ZXJZIH0sXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSBjdXJyRGlyKSB7XG4gICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gdmVydGljYWxTcGxpdCA6IGhvcml6b250YWxTcGxpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBob3Jpem9udGFsU3BsaXQgOiB2ZXJ0aWNhbFNwbGl0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBzb3VyY2VUYXJnZXQgbWVhbnMgd2UgdGFrZSB4IGZyb20gc291cmNlIGFuZCB5IGZyb20gdGFyZ2V0LCB0YXJnZXRTb3VyY2UgaXMgdGhlIG9wcG9zaXRlXG4gICAgICAgIGNvbnN0IHNvdXJjZVRhcmdldCA9IFt7IHg6IHNvdXJjZUdhcHBlZC54LCB5OiB0YXJnZXRHYXBwZWQueSB9XTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U291cmNlID0gW3sgeDogdGFyZ2V0R2FwcGVkLngsIHk6IHNvdXJjZUdhcHBlZC55IH1dO1xuICAgICAgICAvLyB0aGlzIGhhbmRsZXMgZWRnZXMgd2l0aCBzYW1lIGhhbmRsZSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKGRpckFjY2Vzc29yID09PSAneCcpIHtcbiAgICAgICAgICAgIHBvaW50cyA9IHNvdXJjZURpci54ID09PSBjdXJyRGlyID8gdGFyZ2V0U291cmNlIDogc291cmNlVGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRzID0gc291cmNlRGlyLnkgPT09IGN1cnJEaXIgPyBzb3VyY2VUYXJnZXQgOiB0YXJnZXRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVBvc2l0aW9uID09PSB0YXJnZXRQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKHNvdXJjZVtkaXJBY2Nlc3Nvcl0gLSB0YXJnZXRbZGlyQWNjZXNzb3JdKTtcbiAgICAgICAgICAgIC8vIGlmIGFuIGVkZ2UgZ29lcyBmcm9tIHJpZ2h0IHRvIHJpZ2h0IGZvciBleGFtcGxlIChzb3VyY2VQb3NpdGlvbiA9PT0gdGFyZ2V0UG9zaXRpb24pIGFuZCB0aGUgZGlzdGFuY2UgYmV0d2VlbiBzb3VyY2UueCBhbmQgdGFyZ2V0LnggaXMgbGVzcyB0aGFuIHRoZSBvZmZzZXQsIHRoZSBhZGRlZCBwb2ludCBhbmQgdGhlIGdhcHBlZCBzb3VyY2UvdGFyZ2V0IHdpbGwgb3ZlcmxhcC4gVGhpcyBsZWFkcyB0byBhIHdlaXJkIGVkZ2UgcGF0aC4gVG8gYXZvaWQgdGhpcyB3ZSBhZGQgYSBnYXBPZmZzZXQgdG8gdGhlIHNvdXJjZS90YXJnZXRcbiAgICAgICAgICAgIGlmIChkaWZmIDw9IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdhcE9mZnNldCA9IE1hdGgubWluKG9mZnNldCAtIDEsIG9mZnNldCAtIGRpZmYpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSBjdXJyRGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUdhcE9mZnNldFtkaXJBY2Nlc3Nvcl0gPSAoc291cmNlR2FwcGVkW2RpckFjY2Vzc29yXSA+IHNvdXJjZVtkaXJBY2Nlc3Nvcl0gPyAtMSA6IDEpICogZ2FwT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0R2FwT2Zmc2V0W2RpckFjY2Vzc29yXSA9ICh0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JdID4gdGFyZ2V0W2RpckFjY2Vzc29yXSA/IC0xIDogMSkgKiBnYXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXNlIGFyZSBjb25kaXRpb25zIGZvciBoYW5kbGluZyBtaXhlZCBoYW5kbGUgcG9zaXRpb25zIGxpa2UgUmlnaHQgLT4gQm90dG9tIGZvciBleGFtcGxlXG4gICAgICAgIGlmIChzb3VyY2VQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRpckFjY2Vzc29yT3Bwb3NpdGUgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICAgICAgICAgICAgY29uc3QgaXNTYW1lRGlyID0gc291cmNlRGlyW2RpckFjY2Vzc29yXSA9PT0gdGFyZ2V0RGlyW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlR3RUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdID4gdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTHRUYXJnZXRPcHBvID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdIDwgdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgY29uc3QgZmxpcFNvdXJjZVRhcmdldCA9IChzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VHdFRhcmdldE9wcG8pIHx8IChpc1NhbWVEaXIgJiYgc291cmNlTHRUYXJnZXRPcHBvKSkpIHx8XG4gICAgICAgICAgICAgICAgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gIT09IDEgJiYgKCghaXNTYW1lRGlyICYmIHNvdXJjZUx0VGFyZ2V0T3BwbykgfHwgKGlzU2FtZURpciAmJiBzb3VyY2VHdFRhcmdldE9wcG8pKSk7XG4gICAgICAgICAgICBpZiAoZmxpcFNvdXJjZVRhcmdldCkge1xuICAgICAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyBzb3VyY2VUYXJnZXQgOiB0YXJnZXRTb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlR2FwUG9pbnQgPSB7IHg6IHNvdXJjZUdhcHBlZC54ICsgc291cmNlR2FwT2Zmc2V0LngsIHk6IHNvdXJjZUdhcHBlZC55ICsgc291cmNlR2FwT2Zmc2V0LnkgfTtcbiAgICAgICAgY29uc3QgdGFyZ2V0R2FwUG9pbnQgPSB7IHg6IHRhcmdldEdhcHBlZC54ICsgdGFyZ2V0R2FwT2Zmc2V0LngsIHk6IHRhcmdldEdhcHBlZC55ICsgdGFyZ2V0R2FwT2Zmc2V0LnkgfTtcbiAgICAgICAgY29uc3QgbWF4WERpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5hYnMoc291cmNlR2FwUG9pbnQueCAtIHBvaW50c1swXS54KSwgTWF0aC5hYnModGFyZ2V0R2FwUG9pbnQueCAtIHBvaW50c1swXS54KSk7XG4gICAgICAgIGNvbnN0IG1heFlEaXN0YW5jZSA9IE1hdGgubWF4KE1hdGguYWJzKHNvdXJjZUdhcFBvaW50LnkgLSBwb2ludHNbMF0ueSksIE1hdGguYWJzKHRhcmdldEdhcFBvaW50LnkgLSBwb2ludHNbMF0ueSkpO1xuICAgICAgICAvLyB3ZSB3YW50IHRvIHBsYWNlIHRoZSBsYWJlbCBvbiB0aGUgbG9uZ2VzdCBzZWdtZW50IG9mIHRoZSBlZGdlXG4gICAgICAgIGlmIChtYXhYRGlzdGFuY2UgPj0gbWF4WURpc3RhbmNlKSB7XG4gICAgICAgICAgICBjZW50ZXJYID0gKHNvdXJjZUdhcFBvaW50LnggKyB0YXJnZXRHYXBQb2ludC54KSAvIDI7XG4gICAgICAgICAgICBjZW50ZXJZID0gcG9pbnRzWzBdLnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjZW50ZXJYID0gcG9pbnRzWzBdLng7XG4gICAgICAgICAgICBjZW50ZXJZID0gKHNvdXJjZUdhcFBvaW50LnkgKyB0YXJnZXRHYXBQb2ludC55KSAvIDI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGF0aFBvaW50cyA9IFtcbiAgICAgICAgc291cmNlLFxuICAgICAgICB7IHg6IHNvdXJjZUdhcHBlZC54ICsgc291cmNlR2FwT2Zmc2V0LngsIHk6IHNvdXJjZUdhcHBlZC55ICsgc291cmNlR2FwT2Zmc2V0LnkgfSxcbiAgICAgICAgLi4ucG9pbnRzLFxuICAgICAgICB7IHg6IHRhcmdldEdhcHBlZC54ICsgdGFyZ2V0R2FwT2Zmc2V0LngsIHk6IHRhcmdldEdhcHBlZC55ICsgdGFyZ2V0R2FwT2Zmc2V0LnkgfSxcbiAgICAgICAgdGFyZ2V0LFxuICAgIF07XG4gICAgcmV0dXJuIFtwYXRoUG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCBkZWZhdWx0T2Zmc2V0WCwgZGVmYXVsdE9mZnNldFldO1xufVxuZnVuY3Rpb24gZ2V0QmVuZChhLCBiLCBjLCBzaXplKSB7XG4gICAgY29uc3QgYmVuZFNpemUgPSBNYXRoLm1pbihkaXN0YW5jZShhLCBiKSAvIDIsIGRpc3RhbmNlKGIsIGMpIC8gMiwgc2l6ZSk7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBiO1xuICAgIC8vIG5vIGJlbmRcbiAgICBpZiAoKGEueCA9PT0geCAmJiB4ID09PSBjLngpIHx8IChhLnkgPT09IHkgJiYgeSA9PT0gYy55KSkge1xuICAgICAgICByZXR1cm4gYEwke3h9ICR7eX1gO1xuICAgIH1cbiAgICAvLyBmaXJzdCBzZWdtZW50IGlzIGhvcml6b250YWxcbiAgICBpZiAoYS55ID09PSB5KSB7XG4gICAgICAgIGNvbnN0IHhEaXIgPSBhLnggPCBjLnggPyAtMSA6IDE7XG4gICAgICAgIGNvbnN0IHlEaXIgPSBhLnkgPCBjLnkgPyAxIDogLTE7XG4gICAgICAgIHJldHVybiBgTCAke3ggKyBiZW5kU2l6ZSAqIHhEaXJ9LCR7eX1RICR7eH0sJHt5fSAke3h9LCR7eSArIGJlbmRTaXplICogeURpcn1gO1xuICAgIH1cbiAgICBjb25zdCB4RGlyID0gYS54IDwgYy54ID8gMSA6IC0xO1xuICAgIGNvbnN0IHlEaXIgPSBhLnkgPCBjLnkgPyAtMSA6IDE7XG4gICAgcmV0dXJuIGBMICR7eH0sJHt5ICsgYmVuZFNpemUgKiB5RGlyfVEgJHt4fSwke3l9ICR7eCArIGJlbmRTaXplICogeERpcn0sJHt5fWA7XG59XG5mdW5jdGlvbiBnZXRTbW9vdGhTdGVwUGF0aCh7IHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVBvc2l0aW9uID0gUG9zaXRpb24uQm90dG9tLCB0YXJnZXRYLCB0YXJnZXRZLCB0YXJnZXRQb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgYm9yZGVyUmFkaXVzID0gNSwgY2VudGVyWCwgY2VudGVyWSwgb2Zmc2V0ID0gMjAsIH0pIHtcbiAgICBjb25zdCBbcG9pbnRzLCBsYWJlbFgsIGxhYmVsWSwgb2Zmc2V0WCwgb2Zmc2V0WV0gPSBnZXRQb2ludHMoe1xuICAgICAgICBzb3VyY2U6IHsgeDogc291cmNlWCwgeTogc291cmNlWSB9LFxuICAgICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0OiB7IHg6IHRhcmdldFgsIHk6IHRhcmdldFkgfSxcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24sXG4gICAgICAgIGNlbnRlcjogeyB4OiBjZW50ZXJYLCB5OiBjZW50ZXJZIH0sXG4gICAgICAgIG9mZnNldCxcbiAgICB9KTtcbiAgICBjb25zdCBwYXRoID0gcG9pbnRzLnJlZHVjZSgocmVzLCBwLCBpKSA9PiB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gJyc7XG4gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgPSBnZXRCZW5kKHBvaW50c1tpIC0gMV0sIHAsIHBvaW50c1tpICsgMV0sIGJvcmRlclJhZGl1cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWdtZW50ID0gYCR7aSA9PT0gMCA/ICdNJyA6ICdMJ30ke3AueH0gJHtwLnl9YDtcbiAgICAgICAgfVxuICAgICAgICByZXMgKz0gc2VnbWVudDtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCAnJyk7XG4gICAgcmV0dXJuIFtwYXRoLCBsYWJlbFgsIGxhYmVsWSwgb2Zmc2V0WCwgb2Zmc2V0WV07XG59XG5jb25zdCBTbW9vdGhTdGVwRWRnZSA9IG1lbW8oKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgbGFiZWwsIGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCBwYXRoT3B0aW9ucywgaW50ZXJhY3Rpb25XaWR0aCwgfSkgPT4ge1xuICAgIGNvbnN0IFtwYXRoLCBsYWJlbFgsIGxhYmVsWV0gPSBnZXRTbW9vdGhTdGVwUGF0aCh7XG4gICAgICAgIHNvdXJjZVgsXG4gICAgICAgIHNvdXJjZVksXG4gICAgICAgIHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICB0YXJnZXRYLFxuICAgICAgICB0YXJnZXRZLFxuICAgICAgICB0YXJnZXRQb3NpdGlvbixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBwYXRoT3B0aW9ucz8uYm9yZGVyUmFkaXVzLFxuICAgICAgICBvZmZzZXQ6IHBhdGhPcHRpb25zPy5vZmZzZXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VFZGdlLCB7IHBhdGg6IHBhdGgsIGxhYmVsWDogbGFiZWxYLCBsYWJlbFk6IGxhYmVsWSwgbGFiZWw6IGxhYmVsLCBsYWJlbFN0eWxlOiBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZTogbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlOiBzdHlsZSwgbWFya2VyRW5kOiBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aDogaW50ZXJhY3Rpb25XaWR0aCB9KSk7XG59KTtcblNtb290aFN0ZXBFZGdlLmRpc3BsYXlOYW1lID0gJ1Ntb290aFN0ZXBFZGdlJztcblxuY29uc3QgU3RlcEVkZ2UgPSBtZW1vKChwcm9wcykgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoU21vb3RoU3RlcEVkZ2UsIHsgLi4ucHJvcHMsIHBhdGhPcHRpb25zOiB1c2VNZW1vKCgpID0+ICh7IGJvcmRlclJhZGl1czogMCwgb2Zmc2V0OiBwcm9wcy5wYXRoT3B0aW9ucz8ub2Zmc2V0IH0pLCBbcHJvcHMucGF0aE9wdGlvbnM/Lm9mZnNldF0pIH0pKSk7XG5TdGVwRWRnZS5kaXNwbGF5TmFtZSA9ICdTdGVwRWRnZSc7XG5cbmZ1bmN0aW9uIGdldFN0cmFpZ2h0UGF0aCh7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFksIH0pIHtcbiAgICBjb25zdCBbbGFiZWxYLCBsYWJlbFksIG9mZnNldFgsIG9mZnNldFldID0gZ2V0RWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVgsXG4gICAgICAgIHNvdXJjZVksXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgfSk7XG4gICAgcmV0dXJuIFtgTSAke3NvdXJjZVh9LCR7c291cmNlWX1MICR7dGFyZ2V0WH0sJHt0YXJnZXRZfWAsIGxhYmVsWCwgbGFiZWxZLCBvZmZzZXRYLCBvZmZzZXRZXTtcbn1cbmNvbnN0IFN0cmFpZ2h0RWRnZSA9IG1lbW8oKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgbGFiZWwsIGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZSwgbWFya2VyRW5kLCBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aCwgfSkgPT4ge1xuICAgIGNvbnN0IFtwYXRoLCBsYWJlbFgsIGxhYmVsWV0gPSBnZXRTdHJhaWdodFBhdGgoeyBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZIH0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlRWRnZSwgeyBwYXRoOiBwYXRoLCBsYWJlbFg6IGxhYmVsWCwgbGFiZWxZOiBsYWJlbFksIGxhYmVsOiBsYWJlbCwgbGFiZWxTdHlsZTogbGFiZWxTdHlsZSwgbGFiZWxTaG93Qmc6IGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGU6IGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmc6IGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzOiBsYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZTogc3R5bGUsIG1hcmtlckVuZDogbWFya2VyRW5kLCBtYXJrZXJTdGFydDogbWFya2VyU3RhcnQsIGludGVyYWN0aW9uV2lkdGg6IGludGVyYWN0aW9uV2lkdGggfSkpO1xufSk7XG5TdHJhaWdodEVkZ2UuZGlzcGxheU5hbWUgPSAnU3RyYWlnaHRFZGdlJztcblxuZnVuY3Rpb24gY2FsY3VsYXRlQ29udHJvbE9mZnNldChkaXN0YW5jZSwgY3VydmF0dXJlKSB7XG4gICAgaWYgKGRpc3RhbmNlID49IDApIHtcbiAgICAgICAgcmV0dXJuIDAuNSAqIGRpc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gY3VydmF0dXJlICogMjUgKiBNYXRoLnNxcnQoLWRpc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGdldENvbnRyb2xXaXRoQ3VydmF0dXJlKHsgcG9zLCB4MSwgeTEsIHgyLCB5MiwgYyB9KSB7XG4gICAgc3dpdGNoIChwb3MpIHtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIFt4MSAtIGNhbGN1bGF0ZUNvbnRyb2xPZmZzZXQoeDEgLSB4MiwgYyksIHkxXTtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5SaWdodDpcbiAgICAgICAgICAgIHJldHVybiBbeDEgKyBjYWxjdWxhdGVDb250cm9sT2Zmc2V0KHgyIC0geDEsIGMpLCB5MV07XG4gICAgICAgIGNhc2UgUG9zaXRpb24uVG9wOlxuICAgICAgICAgICAgcmV0dXJuIFt4MSwgeTEgLSBjYWxjdWxhdGVDb250cm9sT2Zmc2V0KHkxIC0geTIsIGMpXTtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5Cb3R0b206XG4gICAgICAgICAgICByZXR1cm4gW3gxLCB5MSArIGNhbGN1bGF0ZUNvbnRyb2xPZmZzZXQoeTIgLSB5MSwgYyldO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEJlemllclBhdGgoeyBzb3VyY2VYLCBzb3VyY2VZLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0WCwgdGFyZ2V0WSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIGN1cnZhdHVyZSA9IDAuMjUsIH0pIHtcbiAgICBjb25zdCBbc291cmNlQ29udHJvbFgsIHNvdXJjZUNvbnRyb2xZXSA9IGdldENvbnRyb2xXaXRoQ3VydmF0dXJlKHtcbiAgICAgICAgcG9zOiBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgeDE6IHNvdXJjZVgsXG4gICAgICAgIHkxOiBzb3VyY2VZLFxuICAgICAgICB4MjogdGFyZ2V0WCxcbiAgICAgICAgeTI6IHRhcmdldFksXG4gICAgICAgIGM6IGN1cnZhdHVyZSxcbiAgICB9KTtcbiAgICBjb25zdCBbdGFyZ2V0Q29udHJvbFgsIHRhcmdldENvbnRyb2xZXSA9IGdldENvbnRyb2xXaXRoQ3VydmF0dXJlKHtcbiAgICAgICAgcG9zOiB0YXJnZXRQb3NpdGlvbixcbiAgICAgICAgeDE6IHRhcmdldFgsXG4gICAgICAgIHkxOiB0YXJnZXRZLFxuICAgICAgICB4Mjogc291cmNlWCxcbiAgICAgICAgeTI6IHNvdXJjZVksXG4gICAgICAgIGM6IGN1cnZhdHVyZSxcbiAgICB9KTtcbiAgICBjb25zdCBbbGFiZWxYLCBsYWJlbFksIG9mZnNldFgsIG9mZnNldFldID0gZ2V0QmV6aWVyRWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVgsXG4gICAgICAgIHNvdXJjZVksXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgICAgIHNvdXJjZUNvbnRyb2xYLFxuICAgICAgICBzb3VyY2VDb250cm9sWSxcbiAgICAgICAgdGFyZ2V0Q29udHJvbFgsXG4gICAgICAgIHRhcmdldENvbnRyb2xZLFxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIGBNJHtzb3VyY2VYfSwke3NvdXJjZVl9IEMke3NvdXJjZUNvbnRyb2xYfSwke3NvdXJjZUNvbnRyb2xZfSAke3RhcmdldENvbnRyb2xYfSwke3RhcmdldENvbnRyb2xZfSAke3RhcmdldFh9LCR7dGFyZ2V0WX1gLFxuICAgICAgICBsYWJlbFgsXG4gICAgICAgIGxhYmVsWSxcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICBdO1xufVxuY29uc3QgQmV6aWVyRWRnZSA9IG1lbW8oKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCBwYXRoT3B0aW9ucywgaW50ZXJhY3Rpb25XaWR0aCwgfSkgPT4ge1xuICAgIGNvbnN0IFtwYXRoLCBsYWJlbFgsIGxhYmVsWV0gPSBnZXRCZXppZXJQYXRoKHtcbiAgICAgICAgc291cmNlWCxcbiAgICAgICAgc291cmNlWSxcbiAgICAgICAgc291cmNlUG9zaXRpb24sXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgICAgIHRhcmdldFBvc2l0aW9uLFxuICAgICAgICBjdXJ2YXR1cmU6IHBhdGhPcHRpb25zPy5jdXJ2YXR1cmUsXG4gICAgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VFZGdlLCB7IHBhdGg6IHBhdGgsIGxhYmVsWDogbGFiZWxYLCBsYWJlbFk6IGxhYmVsWSwgbGFiZWw6IGxhYmVsLCBsYWJlbFN0eWxlOiBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZTogbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlOiBzdHlsZSwgbWFya2VyRW5kOiBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aDogaW50ZXJhY3Rpb25XaWR0aCB9KSk7XG59KTtcbkJlemllckVkZ2UuZGlzcGxheU5hbWUgPSAnQmV6aWVyRWRnZSc7XG5cbmNvbnN0IE5vZGVJZENvbnRleHQgPSBjcmVhdGVDb250ZXh0KG51bGwpO1xuY29uc3QgUHJvdmlkZXIgPSBOb2RlSWRDb250ZXh0LlByb3ZpZGVyO1xuTm9kZUlkQ29udGV4dC5Db25zdW1lcjtcbmNvbnN0IHVzZU5vZGVJZCA9ICgpID0+IHtcbiAgICBjb25zdCBub2RlSWQgPSB1c2VDb250ZXh0KE5vZGVJZENvbnRleHQpO1xuICAgIHJldHVybiBub2RlSWQ7XG59O1xuXG5jb25zdCBpc0VkZ2UgPSAoZWxlbWVudCkgPT4gJ2lkJyBpbiBlbGVtZW50ICYmICdzb3VyY2UnIGluIGVsZW1lbnQgJiYgJ3RhcmdldCcgaW4gZWxlbWVudDtcbmNvbnN0IGlzTm9kZSA9IChlbGVtZW50KSA9PiAnaWQnIGluIGVsZW1lbnQgJiYgISgnc291cmNlJyBpbiBlbGVtZW50KSAmJiAhKCd0YXJnZXQnIGluIGVsZW1lbnQpO1xuY29uc3QgZ2V0T3V0Z29lcnMgPSAobm9kZSwgbm9kZXMsIGVkZ2VzKSA9PiB7XG4gICAgaWYgKCFpc05vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvdXRnb2VySWRzID0gZWRnZXMuZmlsdGVyKChlKSA9PiBlLnNvdXJjZSA9PT0gbm9kZS5pZCkubWFwKChlKSA9PiBlLnRhcmdldCk7XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcigobikgPT4gb3V0Z29lcklkcy5pbmNsdWRlcyhuLmlkKSk7XG59O1xuY29uc3QgZ2V0SW5jb21lcnMgPSAobm9kZSwgbm9kZXMsIGVkZ2VzKSA9PiB7XG4gICAgaWYgKCFpc05vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBpbmNvbWVyc0lkcyA9IGVkZ2VzLmZpbHRlcigoZSkgPT4gZS50YXJnZXQgPT09IG5vZGUuaWQpLm1hcCgoZSkgPT4gZS5zb3VyY2UpO1xuICAgIHJldHVybiBub2Rlcy5maWx0ZXIoKG4pID0+IGluY29tZXJzSWRzLmluY2x1ZGVzKG4uaWQpKTtcbn07XG5jb25zdCBnZXRFZGdlSWQgPSAoeyBzb3VyY2UsIHNvdXJjZUhhbmRsZSwgdGFyZ2V0LCB0YXJnZXRIYW5kbGUgfSkgPT4gYHJlYWN0Zmxvd19fZWRnZS0ke3NvdXJjZX0ke3NvdXJjZUhhbmRsZSB8fCAnJ30tJHt0YXJnZXR9JHt0YXJnZXRIYW5kbGUgfHwgJyd9YDtcbmNvbnN0IGdldE1hcmtlcklkID0gKG1hcmtlciwgcmZJZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWFya2VyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbWFya2VyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbWFya2VyO1xuICAgIH1cbiAgICBjb25zdCBpZFByZWZpeCA9IHJmSWQgPyBgJHtyZklkfV9fYCA6ICcnO1xuICAgIHJldHVybiBgJHtpZFByZWZpeH0ke09iamVjdC5rZXlzKG1hcmtlcilcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAubWFwKChrZXkpID0+IGAke2tleX09JHttYXJrZXJba2V5XX1gKVxuICAgICAgICAuam9pbignJicpfWA7XG59O1xuY29uc3QgY29ubmVjdGlvbkV4aXN0cyA9IChlZGdlLCBlZGdlcykgPT4ge1xuICAgIHJldHVybiBlZGdlcy5zb21lKChlbCkgPT4gZWwuc291cmNlID09PSBlZGdlLnNvdXJjZSAmJlxuICAgICAgICBlbC50YXJnZXQgPT09IGVkZ2UudGFyZ2V0ICYmXG4gICAgICAgIChlbC5zb3VyY2VIYW5kbGUgPT09IGVkZ2Uuc291cmNlSGFuZGxlIHx8ICghZWwuc291cmNlSGFuZGxlICYmICFlZGdlLnNvdXJjZUhhbmRsZSkpICYmXG4gICAgICAgIChlbC50YXJnZXRIYW5kbGUgPT09IGVkZ2UudGFyZ2V0SGFuZGxlIHx8ICghZWwudGFyZ2V0SGFuZGxlICYmICFlZGdlLnRhcmdldEhhbmRsZSkpKTtcbn07XG5jb25zdCBhZGRFZGdlID0gKGVkZ2VQYXJhbXMsIGVkZ2VzKSA9PiB7XG4gICAgaWYgKCFlZGdlUGFyYW1zLnNvdXJjZSB8fCAhZWRnZVBhcmFtcy50YXJnZXQpIHtcbiAgICAgICAgZGV2V2FybignMDA2JywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDYnXSgpKTtcbiAgICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICBsZXQgZWRnZTtcbiAgICBpZiAoaXNFZGdlKGVkZ2VQYXJhbXMpKSB7XG4gICAgICAgIGVkZ2UgPSB7IC4uLmVkZ2VQYXJhbXMgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVkZ2UgPSB7XG4gICAgICAgICAgICAuLi5lZGdlUGFyYW1zLFxuICAgICAgICAgICAgaWQ6IGdldEVkZ2VJZChlZGdlUGFyYW1zKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNvbm5lY3Rpb25FeGlzdHMoZWRnZSwgZWRnZXMpKSB7XG4gICAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2VzLmNvbmNhdChlZGdlKTtcbn07XG5jb25zdCByZWNvbm5lY3RFZGdlID0gKG9sZEVkZ2UsIG5ld0Nvbm5lY3Rpb24sIGVkZ2VzLCBvcHRpb25zID0geyBzaG91bGRSZXBsYWNlSWQ6IHRydWUgfSkgPT4ge1xuICAgIGNvbnN0IHsgaWQ6IG9sZEVkZ2VJZCwgLi4ucmVzdCB9ID0gb2xkRWRnZTtcbiAgICBpZiAoIW5ld0Nvbm5lY3Rpb24uc291cmNlIHx8ICFuZXdDb25uZWN0aW9uLnRhcmdldCkge1xuICAgICAgICBkZXZXYXJuKCcwMDYnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwNiddKCkpO1xuICAgICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kRWRnZSA9IGVkZ2VzLmZpbmQoKGUpID0+IGUuaWQgPT09IG9sZEVkZ2VJZCk7XG4gICAgaWYgKCFmb3VuZEVkZ2UpIHtcbiAgICAgICAgZGV2V2FybignMDA3JywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDcnXShvbGRFZGdlSWQpKTtcbiAgICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgb2xkIGVkZ2UgYW5kIGNyZWF0ZSB0aGUgbmV3IGVkZ2Ugd2l0aCBwYXJhbWV0ZXJzIG9mIG9sZCBlZGdlLlxuICAgIGNvbnN0IGVkZ2UgPSB7XG4gICAgICAgIC4uLnJlc3QsXG4gICAgICAgIGlkOiBvcHRpb25zLnNob3VsZFJlcGxhY2VJZCA/IGdldEVkZ2VJZChuZXdDb25uZWN0aW9uKSA6IG9sZEVkZ2VJZCxcbiAgICAgICAgc291cmNlOiBuZXdDb25uZWN0aW9uLnNvdXJjZSxcbiAgICAgICAgdGFyZ2V0OiBuZXdDb25uZWN0aW9uLnRhcmdldCxcbiAgICAgICAgc291cmNlSGFuZGxlOiBuZXdDb25uZWN0aW9uLnNvdXJjZUhhbmRsZSxcbiAgICAgICAgdGFyZ2V0SGFuZGxlOiBuZXdDb25uZWN0aW9uLnRhcmdldEhhbmRsZSxcbiAgICB9O1xuICAgIHJldHVybiBlZGdlcy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IG9sZEVkZ2VJZCkuY29uY2F0KGVkZ2UpO1xufTtcbi8qKlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBgcmVjb25uZWN0RWRnZWAgaW5zdGVhZC5cbiAqL1xuY29uc3QgdXBkYXRlRWRnZSA9IChvbGRFZGdlLCBuZXdDb25uZWN0aW9uLCBlZGdlcywgb3B0aW9ucyA9IHsgc2hvdWxkUmVwbGFjZUlkOiB0cnVlIH0pID0+IHtcbiAgICBjb25zb2xlLndhcm4oJ1tERVBSRUNBVEVEXSBgdXBkYXRlRWRnZWAgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgYHJlY29ubmVjdEVkZ2VgIGh0dHBzOi8vcmVhY3RmbG93LmRldi9hcGktcmVmZXJlbmNlL3V0aWxzL3JlY29ubmVjdC1lZGdlJyk7XG4gICAgcmV0dXJuIHJlY29ubmVjdEVkZ2Uob2xkRWRnZSwgbmV3Q29ubmVjdGlvbiwgZWRnZXMsIG9wdGlvbnMpO1xufTtcbmNvbnN0IHBvaW50VG9SZW5kZXJlclBvaW50ID0gKHsgeCwgeSB9LCBbdHgsIHR5LCB0U2NhbGVdLCBzbmFwVG9HcmlkLCBbc25hcFgsIHNuYXBZXSkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgICB4OiAoeCAtIHR4KSAvIHRTY2FsZSxcbiAgICAgICAgeTogKHkgLSB0eSkgLyB0U2NhbGUsXG4gICAgfTtcbiAgICBpZiAoc25hcFRvR3JpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogc25hcFggKiBNYXRoLnJvdW5kKHBvc2l0aW9uLnggLyBzbmFwWCksXG4gICAgICAgICAgICB5OiBzbmFwWSAqIE1hdGgucm91bmQocG9zaXRpb24ueSAvIHNuYXBZKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc2l0aW9uO1xufTtcbmNvbnN0IHJlbmRlcmVyUG9pbnRUb1BvaW50ID0gKHsgeCwgeSB9LCBbdHgsIHR5LCB0U2NhbGVdKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAqIHRTY2FsZSArIHR4LFxuICAgICAgICB5OiB5ICogdFNjYWxlICsgdHksXG4gICAgfTtcbn07XG5jb25zdCBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luID0gKG5vZGUsIG5vZGVPcmlnaW4gPSBbMCwgMF0pID0+IHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgcG9zaXRpb25BYnNvbHV0ZToge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldFggPSAobm9kZS53aWR0aCA/PyAwKSAqIG5vZGVPcmlnaW5bMF07XG4gICAgY29uc3Qgb2Zmc2V0WSA9IChub2RlLmhlaWdodCA/PyAwKSAqIG5vZGVPcmlnaW5bMV07XG4gICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICAgIHg6IG5vZGUucG9zaXRpb24ueCAtIG9mZnNldFgsXG4gICAgICAgIHk6IG5vZGUucG9zaXRpb24ueSAtIG9mZnNldFksXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgcG9zaXRpb25BYnNvbHV0ZTogbm9kZS5wb3NpdGlvbkFic29sdXRlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB4OiBub2RlLnBvc2l0aW9uQWJzb2x1dGUueCAtIG9mZnNldFgsXG4gICAgICAgICAgICAgICAgeTogbm9kZS5wb3NpdGlvbkFic29sdXRlLnkgLSBvZmZzZXRZLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBwb3NpdGlvbixcbiAgICB9O1xufTtcbmNvbnN0IGdldE5vZGVzQm91bmRzID0gKG5vZGVzLCBub2RlT3JpZ2luID0gWzAsIDBdKSA9PiB7XG4gICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgfVxuICAgIGNvbnN0IGJveCA9IG5vZGVzLnJlZHVjZSgoY3VyckJveCwgbm9kZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGdldE5vZGVQb3NpdGlvbldpdGhPcmlnaW4obm9kZSwgbm9kZU9yaWdpbikucG9zaXRpb25BYnNvbHV0ZTtcbiAgICAgICAgcmV0dXJuIGdldEJvdW5kc09mQm94ZXMoY3VyckJveCwgcmVjdFRvQm94KHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgd2lkdGg6IG5vZGUud2lkdGggfHwgMCxcbiAgICAgICAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgfHwgMCxcbiAgICAgICAgfSkpO1xuICAgIH0sIHsgeDogSW5maW5pdHksIHk6IEluZmluaXR5LCB4MjogLUluZmluaXR5LCB5MjogLUluZmluaXR5IH0pO1xuICAgIHJldHVybiBib3hUb1JlY3QoYm94KTtcbn07XG4vLyBAZGVwcmVjYXRlZCBVc2UgYGdldE5vZGVzQm91bmRzYC5cbmNvbnN0IGdldFJlY3RPZk5vZGVzID0gKG5vZGVzLCBub2RlT3JpZ2luID0gWzAsIDBdKSA9PiB7XG4gICAgY29uc29sZS53YXJuKCdbREVQUkVDQVRFRF0gYGdldFJlY3RPZk5vZGVzYCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBgZ2V0Tm9kZXNCb3VuZHNgIGh0dHBzOi8vcmVhY3RmbG93LmRldi9hcGktcmVmZXJlbmNlL3V0aWxzL2dldC1ub2Rlcy1ib3VuZHMuJyk7XG4gICAgcmV0dXJuIGdldE5vZGVzQm91bmRzKG5vZGVzLCBub2RlT3JpZ2luKTtcbn07XG5jb25zdCBnZXROb2Rlc0luc2lkZSA9IChub2RlSW50ZXJuYWxzLCByZWN0LCBbdHgsIHR5LCB0U2NhbGVdID0gWzAsIDAsIDFdLCBwYXJ0aWFsbHkgPSBmYWxzZSwgXG4vLyBzZXQgZXhjbHVkZU5vblNlbGVjdGFibGVOb2RlcyBpZiB5b3Ugd2FudCB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZSBub2RlcyBcInNlbGVjdGFibGVcIiBhdHRyaWJ1dGVcbmV4Y2x1ZGVOb25TZWxlY3RhYmxlTm9kZXMgPSBmYWxzZSwgbm9kZU9yaWdpbiA9IFswLCAwXSkgPT4ge1xuICAgIGNvbnN0IHBhbmVSZWN0ID0ge1xuICAgICAgICB4OiAocmVjdC54IC0gdHgpIC8gdFNjYWxlLFxuICAgICAgICB5OiAocmVjdC55IC0gdHkpIC8gdFNjYWxlLFxuICAgICAgICB3aWR0aDogcmVjdC53aWR0aCAvIHRTY2FsZSxcbiAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCAvIHRTY2FsZSxcbiAgICB9O1xuICAgIGNvbnN0IHZpc2libGVOb2RlcyA9IFtdO1xuICAgIG5vZGVJbnRlcm5hbHMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHNlbGVjdGFibGUgPSB0cnVlLCBoaWRkZW4gPSBmYWxzZSB9ID0gbm9kZTtcbiAgICAgICAgaWYgKChleGNsdWRlTm9uU2VsZWN0YWJsZU5vZGVzICYmICFzZWxlY3RhYmxlKSB8fCBoaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHBvc2l0aW9uQWJzb2x1dGUgfSA9IGdldE5vZGVQb3NpdGlvbldpdGhPcmlnaW4obm9kZSwgbm9kZU9yaWdpbik7XG4gICAgICAgIGNvbnN0IG5vZGVSZWN0ID0ge1xuICAgICAgICAgICAgeDogcG9zaXRpb25BYnNvbHV0ZS54LFxuICAgICAgICAgICAgeTogcG9zaXRpb25BYnNvbHV0ZS55LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoIHx8IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCB8fCAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvdmVybGFwcGluZ0FyZWEgPSBnZXRPdmVybGFwcGluZ0FyZWEocGFuZVJlY3QsIG5vZGVSZWN0KTtcbiAgICAgICAgY29uc3Qgbm90SW5pdGlhbGl6ZWQgPSB0eXBlb2Ygd2lkdGggPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBoZWlnaHQgPT09ICd1bmRlZmluZWQnIHx8IHdpZHRoID09PSBudWxsIHx8IGhlaWdodCA9PT0gbnVsbDtcbiAgICAgICAgY29uc3QgcGFydGlhbGx5VmlzaWJsZSA9IHBhcnRpYWxseSAmJiBvdmVybGFwcGluZ0FyZWEgPiAwO1xuICAgICAgICBjb25zdCBhcmVhID0gKHdpZHRoIHx8IDApICogKGhlaWdodCB8fCAwKTtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gbm90SW5pdGlhbGl6ZWQgfHwgcGFydGlhbGx5VmlzaWJsZSB8fCBvdmVybGFwcGluZ0FyZWEgPj0gYXJlYTtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSB8fCBub2RlLmRyYWdnaW5nKSB7XG4gICAgICAgICAgICB2aXNpYmxlTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2aXNpYmxlTm9kZXM7XG59O1xuY29uc3QgZ2V0Q29ubmVjdGVkRWRnZXMgPSAobm9kZXMsIGVkZ2VzKSA9PiB7XG4gICAgY29uc3Qgbm9kZUlkcyA9IG5vZGVzLm1hcCgobm9kZSkgPT4gbm9kZS5pZCk7XG4gICAgcmV0dXJuIGVkZ2VzLmZpbHRlcigoZWRnZSkgPT4gbm9kZUlkcy5pbmNsdWRlcyhlZGdlLnNvdXJjZSkgfHwgbm9kZUlkcy5pbmNsdWRlcyhlZGdlLnRhcmdldCkpO1xufTtcbi8vIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vmlld3BvcnRGb3JCb3VuZHNgLlxuY29uc3QgZ2V0VHJhbnNmb3JtRm9yQm91bmRzID0gKGJvdW5kcywgd2lkdGgsIGhlaWdodCwgbWluWm9vbSwgbWF4Wm9vbSwgcGFkZGluZyA9IDAuMSkgPT4ge1xuICAgIGNvbnN0IHsgeCwgeSwgem9vbSB9ID0gZ2V0Vmlld3BvcnRGb3JCb3VuZHMoYm91bmRzLCB3aWR0aCwgaGVpZ2h0LCBtaW5ab29tLCBtYXhab29tLCBwYWRkaW5nKTtcbiAgICBjb25zb2xlLndhcm4oJ1tERVBSRUNBVEVEXSBgZ2V0VHJhbnNmb3JtRm9yQm91bmRzYCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBgZ2V0Vmlld3BvcnRGb3JCb3VuZHNgLiBCZXdhcmUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIHR5cGUgVmlld3BvcnQgKGB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6b29tOiBudW1iZXIgfWApIGluc3RlYWQgb2YgVHJhbnNmb3JtIChgW251bWJlciwgbnVtYmVyLCBudW1iZXJdYCkuIGh0dHBzOi8vcmVhY3RmbG93LmRldi9hcGktcmVmZXJlbmNlL3V0aWxzL2dldC12aWV3cG9ydC1mb3ItYm91bmRzJyk7XG4gICAgcmV0dXJuIFt4LCB5LCB6b29tXTtcbn07XG5jb25zdCBnZXRWaWV3cG9ydEZvckJvdW5kcyA9IChib3VuZHMsIHdpZHRoLCBoZWlnaHQsIG1pblpvb20sIG1heFpvb20sIHBhZGRpbmcgPSAwLjEpID0+IHtcbiAgICBjb25zdCB4Wm9vbSA9IHdpZHRoIC8gKGJvdW5kcy53aWR0aCAqICgxICsgcGFkZGluZykpO1xuICAgIGNvbnN0IHlab29tID0gaGVpZ2h0IC8gKGJvdW5kcy5oZWlnaHQgKiAoMSArIHBhZGRpbmcpKTtcbiAgICBjb25zdCB6b29tID0gTWF0aC5taW4oeFpvb20sIHlab29tKTtcbiAgICBjb25zdCBjbGFtcGVkWm9vbSA9IGNsYW1wKHpvb20sIG1pblpvb20sIG1heFpvb20pO1xuICAgIGNvbnN0IGJvdW5kc0NlbnRlclggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aCAvIDI7XG4gICAgY29uc3QgYm91bmRzQ2VudGVyWSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCAvIDI7XG4gICAgY29uc3QgeCA9IHdpZHRoIC8gMiAtIGJvdW5kc0NlbnRlclggKiBjbGFtcGVkWm9vbTtcbiAgICBjb25zdCB5ID0gaGVpZ2h0IC8gMiAtIGJvdW5kc0NlbnRlclkgKiBjbGFtcGVkWm9vbTtcbiAgICByZXR1cm4geyB4LCB5LCB6b29tOiBjbGFtcGVkWm9vbSB9O1xufTtcbmNvbnN0IGdldEQzVHJhbnNpdGlvbiA9IChzZWxlY3Rpb24sIGR1cmF0aW9uID0gMCkgPT4ge1xuICAgIHJldHVybiBzZWxlY3Rpb24udHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKTtcbn07XG5cbi8vIHRoaXMgZnVuY3Rpb25zIGNvbGxlY3RzIGFsbCBoYW5kbGVzIGFuZCBhZGRzIGFuIGFic29sdXRlIHBvc2l0aW9uXG4vLyBzbyB0aGF0IHdlIGNhbiBsYXRlciBmaW5kIHRoZSBjbG9zZXN0IGhhbmRsZSB0byB0aGUgbW91c2UgcG9zaXRpb25cbmZ1bmN0aW9uIGdldEhhbmRsZXMobm9kZSwgaGFuZGxlQm91bmRzLCB0eXBlLCBjdXJyZW50SGFuZGxlKSB7XG4gICAgcmV0dXJuIChoYW5kbGVCb3VuZHNbdHlwZV0gfHwgW10pLnJlZHVjZSgocmVzLCBoKSA9PiB7XG4gICAgICAgIGlmIChgJHtub2RlLmlkfS0ke2guaWR9LSR7dHlwZX1gICE9PSBjdXJyZW50SGFuZGxlKSB7XG4gICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IGguaWQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgICB4OiAobm9kZS5wb3NpdGlvbkFic29sdXRlPy54ID8/IDApICsgaC54ICsgaC53aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgeTogKG5vZGUucG9zaXRpb25BYnNvbHV0ZT8ueSA/PyAwKSArIGgueSArIGguaGVpZ2h0IC8gMixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfSwgW10pO1xufVxuZnVuY3Rpb24gZ2V0Q2xvc2VzdEhhbmRsZShldmVudCwgZG9jLCBwb3MsIGNvbm5lY3Rpb25SYWRpdXMsIGhhbmRsZXMsIHZhbGlkYXRvcikge1xuICAgIC8vIHdlIGFsd2F5cyB3YW50IHRvIHByaW9yaXRpemUgdGhlIGhhbmRsZSBiZWxvdyB0aGUgbW91c2UgY3Vyc29yIG92ZXIgdGhlIGNsb3Nlc3QgZGlzdGFuY2UgaGFuZGxlLFxuICAgIC8vIGJlY2F1c2UgaXQgY291bGQgYmUgdGhhdCB0aGUgY2VudGVyIG9mIGFub3RoZXIgaGFuZGxlIGlzIGNsb3NlciB0byB0aGUgbW91c2UgcG9pbnRlciB0aGFuIHRoZSBoYW5kbGUgYmVsb3cgdGhlIGN1cnNvclxuICAgIGNvbnN0IHsgeCwgeSB9ID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3QgZG9tTm9kZXMgPSBkb2MuZWxlbWVudHNGcm9tUG9pbnQoeCwgeSk7XG4gICAgY29uc3QgaGFuZGxlQmVsb3cgPSBkb21Ob2Rlcy5maW5kKChlbCkgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWFjdC1mbG93X19oYW5kbGUnKSk7XG4gICAgaWYgKGhhbmRsZUJlbG93KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZU5vZGVJZCA9IGhhbmRsZUJlbG93LmdldEF0dHJpYnV0ZSgnZGF0YS1ub2RlaWQnKTtcbiAgICAgICAgaWYgKGhhbmRsZU5vZGVJZCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlVHlwZSA9IGdldEhhbmRsZVR5cGUodW5kZWZpbmVkLCBoYW5kbGVCZWxvdyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVJZCA9IGhhbmRsZUJlbG93LmdldEF0dHJpYnV0ZSgnZGF0YS1oYW5kbGVpZCcpO1xuICAgICAgICAgICAgY29uc3QgdmFsaWRIYW5kbGVSZXN1bHQgPSB2YWxpZGF0b3IoeyBub2RlSWQ6IGhhbmRsZU5vZGVJZCwgaWQ6IGhhbmRsZUlkLCB0eXBlOiBoYW5kbGVUeXBlIH0pO1xuICAgICAgICAgICAgaWYgKHZhbGlkSGFuZGxlUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gaGFuZGxlcy5maW5kKChoKSA9PiBoLm5vZGVJZCA9PT0gaGFuZGxlTm9kZUlkICYmIGgudHlwZSA9PT0gaGFuZGxlVHlwZSAmJiBoLmlkID09PSBoYW5kbGVJZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaGFuZGxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoYW5kbGVUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkOiBoYW5kbGVOb2RlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBoYW5kbGU/LnggfHwgcG9zLngsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBoYW5kbGU/LnkgfHwgcG9zLnksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkSGFuZGxlUmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgd2UgY291bGRuJ3QgZmluZCBhIGhhbmRsZSBiZWxvdyB0aGUgbW91c2UgY3Vyc29yIHdlIGxvb2sgZm9yIHRoZSBjbG9zZXN0IGRpc3RhbmNlIGJhc2VkIG9uIHRoZSBjb25uZWN0aW9uUmFkaXVzXG4gICAgbGV0IGNsb3Nlc3RIYW5kbGVzID0gW107XG4gICAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUpID0+IHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoKGhhbmRsZS54IC0gcG9zLngpICoqIDIgKyAoaGFuZGxlLnkgLSBwb3MueSkgKiogMik7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8PSBjb25uZWN0aW9uUmFkaXVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEhhbmRsZVJlc3VsdCA9IHZhbGlkYXRvcihoYW5kbGUpO1xuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEhhbmRsZXMgPSBbeyBoYW5kbGUsIHZhbGlkSGFuZGxlUmVzdWx0IH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXN0YW5jZSA9PT0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBoYW5kbGVzIGFyZSBvbiB0aGUgc2FtZSBkaXN0YW5jZSB3ZSBjb2xsZWN0IGFsbCBvZiB0aGVtXG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RIYW5kbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRIYW5kbGVSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjbG9zZXN0SGFuZGxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgaGFuZGxlOiBudWxsLCB2YWxpZEhhbmRsZVJlc3VsdDogZGVmYXVsdFJlc3VsdCgpIH07XG4gICAgfVxuICAgIGlmIChjbG9zZXN0SGFuZGxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGNsb3Nlc3RIYW5kbGVzWzBdO1xuICAgIH1cbiAgICBjb25zdCBoYXNWYWxpZEhhbmRsZSA9IGNsb3Nlc3RIYW5kbGVzLnNvbWUoKHsgdmFsaWRIYW5kbGVSZXN1bHQgfSkgPT4gdmFsaWRIYW5kbGVSZXN1bHQuaXNWYWxpZCk7XG4gICAgY29uc3QgaGFzVGFyZ2V0SGFuZGxlID0gY2xvc2VzdEhhbmRsZXMuc29tZSgoeyBoYW5kbGUgfSkgPT4gaGFuZGxlLnR5cGUgPT09ICd0YXJnZXQnKTtcbiAgICAvLyBpZiBtdWx0aXBsZSBoYW5kbGVzIGFyZSBsYXlvdXRlZCBvbiB0b3Agb2YgZWFjaCBvdGhlciB3ZSBwcmVmZXIgdGhlIG9uZSB3aXRoIHR5cGUgPSB0YXJnZXQgYW5kIHRoZSBvbmUgdGhhdCBpcyB2YWxpZFxuICAgIHJldHVybiAoY2xvc2VzdEhhbmRsZXMuZmluZCgoeyBoYW5kbGUsIHZhbGlkSGFuZGxlUmVzdWx0IH0pID0+IGhhc1RhcmdldEhhbmRsZSA/IGhhbmRsZS50eXBlID09PSAndGFyZ2V0JyA6IChoYXNWYWxpZEhhbmRsZSA/IHZhbGlkSGFuZGxlUmVzdWx0LmlzVmFsaWQgOiB0cnVlKSkgfHwgY2xvc2VzdEhhbmRsZXNbMF0pO1xufVxuY29uc3QgbnVsbENvbm5lY3Rpb24gPSB7IHNvdXJjZTogbnVsbCwgdGFyZ2V0OiBudWxsLCBzb3VyY2VIYW5kbGU6IG51bGwsIHRhcmdldEhhbmRsZTogbnVsbCB9O1xuY29uc3QgZGVmYXVsdFJlc3VsdCA9ICgpID0+ICh7XG4gICAgaGFuZGxlRG9tTm9kZTogbnVsbCxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICBjb25uZWN0aW9uOiBudWxsQ29ubmVjdGlvbixcbiAgICBlbmRIYW5kbGU6IG51bGwsXG59KTtcbi8vIGNoZWNrcyBpZiAgYW5kIHJldHVybnMgY29ubmVjdGlvbiBpbiBmb20gb2YgYW4gb2JqZWN0IHsgc291cmNlOiAxMjMsIHRhcmdldDogMzEyIH1cbmZ1bmN0aW9uIGlzVmFsaWRIYW5kbGUoaGFuZGxlLCBjb25uZWN0aW9uTW9kZSwgZnJvbU5vZGVJZCwgZnJvbUhhbmRsZUlkLCBmcm9tVHlwZSwgaXNWYWxpZENvbm5lY3Rpb24sIGRvYykge1xuICAgIGNvbnN0IGlzVGFyZ2V0ID0gZnJvbVR5cGUgPT09ICd0YXJnZXQnO1xuICAgIGNvbnN0IGhhbmRsZVRvQ2hlY2sgPSBkb2MucXVlcnlTZWxlY3RvcihgLnJlYWN0LWZsb3dfX2hhbmRsZVtkYXRhLWlkPVwiJHtoYW5kbGU/Lm5vZGVJZH0tJHtoYW5kbGU/LmlkfS0ke2hhbmRsZT8udHlwZX1cIl1gKTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRSZXN1bHQoKSxcbiAgICAgICAgaGFuZGxlRG9tTm9kZTogaGFuZGxlVG9DaGVjayxcbiAgICB9O1xuICAgIGlmIChoYW5kbGVUb0NoZWNrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVR5cGUgPSBnZXRIYW5kbGVUeXBlKHVuZGVmaW5lZCwgaGFuZGxlVG9DaGVjayk7XG4gICAgICAgIGNvbnN0IGhhbmRsZU5vZGVJZCA9IGhhbmRsZVRvQ2hlY2suZ2V0QXR0cmlidXRlKCdkYXRhLW5vZGVpZCcpO1xuICAgICAgICBjb25zdCBoYW5kbGVJZCA9IGhhbmRsZVRvQ2hlY2suZ2V0QXR0cmlidXRlKCdkYXRhLWhhbmRsZWlkJyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gaGFuZGxlVG9DaGVjay5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvbm5lY3RhYmxlJyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlRW5kID0gaGFuZGxlVG9DaGVjay5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvbm5lY3RhYmxlZW5kJyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICBzb3VyY2U6IGlzVGFyZ2V0ID8gaGFuZGxlTm9kZUlkIDogZnJvbU5vZGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUhhbmRsZTogaXNUYXJnZXQgPyBoYW5kbGVJZCA6IGZyb21IYW5kbGVJZCxcbiAgICAgICAgICAgIHRhcmdldDogaXNUYXJnZXQgPyBmcm9tTm9kZUlkIDogaGFuZGxlTm9kZUlkLFxuICAgICAgICAgICAgdGFyZ2V0SGFuZGxlOiBpc1RhcmdldCA/IGZyb21IYW5kbGVJZCA6IGhhbmRsZUlkLFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQuY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGFibGUgPSBjb25uZWN0YWJsZSAmJiBjb25uZWN0YWJsZUVuZDtcbiAgICAgICAgLy8gaW4gc3RyaWN0IG1vZGUgd2UgZG9uJ3QgYWxsb3cgdGFyZ2V0IHRvIHRhcmdldCBvciBzb3VyY2UgdG8gc291cmNlIGNvbm5lY3Rpb25zXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBpc0Nvbm5lY3RhYmxlICYmXG4gICAgICAgICAgICAoY29ubmVjdGlvbk1vZGUgPT09IENvbm5lY3Rpb25Nb2RlLlN0cmljdFxuICAgICAgICAgICAgICAgID8gKGlzVGFyZ2V0ICYmIGhhbmRsZVR5cGUgPT09ICdzb3VyY2UnKSB8fCAoIWlzVGFyZ2V0ICYmIGhhbmRsZVR5cGUgPT09ICd0YXJnZXQnKVxuICAgICAgICAgICAgICAgIDogaGFuZGxlTm9kZUlkICE9PSBmcm9tTm9kZUlkIHx8IGhhbmRsZUlkICE9PSBmcm9tSGFuZGxlSWQpO1xuICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZEhhbmRsZSA9IHtcbiAgICAgICAgICAgICAgICBub2RlSWQ6IGhhbmRsZU5vZGVJZCxcbiAgICAgICAgICAgICAgICBoYW5kbGVJZCxcbiAgICAgICAgICAgICAgICB0eXBlOiBoYW5kbGVUeXBlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gaXNWYWxpZENvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldEhhbmRsZUxvb2t1cCh7IG5vZGVzLCBub2RlSWQsIGhhbmRsZUlkLCBoYW5kbGVUeXBlIH0pIHtcbiAgICByZXR1cm4gbm9kZXMucmVkdWNlKChyZXMsIG5vZGUpID0+IHtcbiAgICAgICAgaWYgKG5vZGVbaW50ZXJuYWxzU3ltYm9sXSkge1xuICAgICAgICAgICAgY29uc3QgeyBoYW5kbGVCb3VuZHMgfSA9IG5vZGVbaW50ZXJuYWxzU3ltYm9sXTtcbiAgICAgICAgICAgIGxldCBzb3VyY2VIYW5kbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFyZ2V0SGFuZGxlcyA9IFtdO1xuICAgICAgICAgICAgaWYgKGhhbmRsZUJvdW5kcykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUhhbmRsZXMgPSBnZXRIYW5kbGVzKG5vZGUsIGhhbmRsZUJvdW5kcywgJ3NvdXJjZScsIGAke25vZGVJZH0tJHtoYW5kbGVJZH0tJHtoYW5kbGVUeXBlfWApO1xuICAgICAgICAgICAgICAgIHRhcmdldEhhbmRsZXMgPSBnZXRIYW5kbGVzKG5vZGUsIGhhbmRsZUJvdW5kcywgJ3RhcmdldCcsIGAke25vZGVJZH0tJHtoYW5kbGVJZH0tJHtoYW5kbGVUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnB1c2goLi4uc291cmNlSGFuZGxlcywgLi4udGFyZ2V0SGFuZGxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCBbXSk7XG59XG5mdW5jdGlvbiBnZXRIYW5kbGVUeXBlKGVkZ2VVcGRhdGVyVHlwZSwgaGFuZGxlRG9tTm9kZSkge1xuICAgIGlmIChlZGdlVXBkYXRlclR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2VVcGRhdGVyVHlwZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaGFuZGxlRG9tTm9kZT8uY2xhc3NMaXN0LmNvbnRhaW5zKCd0YXJnZXQnKSkge1xuICAgICAgICByZXR1cm4gJ3RhcmdldCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGhhbmRsZURvbU5vZGU/LmNsYXNzTGlzdC5jb250YWlucygnc291cmNlJykpIHtcbiAgICAgICAgcmV0dXJuICdzb3VyY2UnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc2V0UmVjZW50SGFuZGxlKGhhbmRsZURvbU5vZGUpIHtcbiAgICBoYW5kbGVEb21Ob2RlPy5jbGFzc0xpc3QucmVtb3ZlKCd2YWxpZCcsICdjb25uZWN0aW5nJywgJ3JlYWN0LWZsb3dfX2hhbmRsZS12YWxpZCcsICdyZWFjdC1mbG93X19oYW5kbGUtY29ubmVjdGluZycpO1xufVxuZnVuY3Rpb24gZ2V0Q29ubmVjdGlvblN0YXR1cyhpc0luc2lkZUNvbm5lY3Rpb25SYWRpdXMsIGlzSGFuZGxlVmFsaWQpIHtcbiAgICBsZXQgY29ubmVjdGlvblN0YXR1cyA9IG51bGw7XG4gICAgaWYgKGlzSGFuZGxlVmFsaWQpIHtcbiAgICAgICAgY29ubmVjdGlvblN0YXR1cyA9ICd2YWxpZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzSW5zaWRlQ29ubmVjdGlvblJhZGl1cyAmJiAhaXNIYW5kbGVWYWxpZCkge1xuICAgICAgICBjb25uZWN0aW9uU3RhdHVzID0gJ2ludmFsaWQnO1xuICAgIH1cbiAgICByZXR1cm4gY29ubmVjdGlvblN0YXR1cztcbn1cblxuZnVuY3Rpb24gaGFuZGxlUG9pbnRlckRvd24oeyBldmVudCwgaGFuZGxlSWQsIG5vZGVJZCwgb25Db25uZWN0LCBpc1RhcmdldCwgZ2V0U3RhdGUsIHNldFN0YXRlLCBpc1ZhbGlkQ29ubmVjdGlvbiwgZWRnZVVwZGF0ZXJUeXBlLCBvblJlY29ubmVjdEVuZCwgfSkge1xuICAgIC8vIHdoZW4gcmVhY3QtZmxvdyBpcyB1c2VkIGluc2lkZSBhIHNoYWRvdyByb290IHdlIGNhbid0IHVzZSBkb2N1bWVudFxuICAgIGNvbnN0IGRvYyA9IGdldEhvc3RGb3JFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgY29uc3QgeyBjb25uZWN0aW9uTW9kZSwgZG9tTm9kZSwgYXV0b1Bhbk9uQ29ubmVjdCwgY29ubmVjdGlvblJhZGl1cywgb25Db25uZWN0U3RhcnQsIHBhbkJ5LCBnZXROb2RlcywgY2FuY2VsQ29ubmVjdGlvbiwgfSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IGF1dG9QYW5JZCA9IDA7XG4gICAgbGV0IGNsb3Nlc3RIYW5kbGU7XG4gICAgY29uc3QgeyB4LCB5IH0gPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zdCBjbGlja2VkSGFuZGxlID0gZG9jPy5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgIGNvbnN0IGhhbmRsZVR5cGUgPSBnZXRIYW5kbGVUeXBlKGVkZ2VVcGRhdGVyVHlwZSwgY2xpY2tlZEhhbmRsZSk7XG4gICAgY29uc3QgY29udGFpbmVyQm91bmRzID0gZG9tTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgaWYgKCFjb250YWluZXJCb3VuZHMgfHwgIWhhbmRsZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcHJldkFjdGl2ZUhhbmRsZTtcbiAgICBsZXQgY29ubmVjdGlvblBvc2l0aW9uID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudCwgY29udGFpbmVyQm91bmRzKTtcbiAgICBsZXQgYXV0b1BhblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBsZXQgY29ubmVjdGlvbiA9IG51bGw7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBsZXQgaGFuZGxlRG9tTm9kZSA9IG51bGw7XG4gICAgY29uc3QgaGFuZGxlTG9va3VwID0gZ2V0SGFuZGxlTG9va3VwKHtcbiAgICAgICAgbm9kZXM6IGdldE5vZGVzKCksXG4gICAgICAgIG5vZGVJZCxcbiAgICAgICAgaGFuZGxlSWQsXG4gICAgICAgIGhhbmRsZVR5cGUsXG4gICAgfSk7XG4gICAgLy8gd2hlbiB0aGUgdXNlciBpcyBtb3ZpbmcgdGhlIG1vdXNlIGNsb3NlIHRvIHRoZSBlZGdlIG9mIHRoZSBjYW52YXMgd2hpbGUgY29ubmVjdGluZyB3ZSBtb3ZlIHRoZSBjYW52YXNcbiAgICBjb25zdCBhdXRvUGFuID0gKCkgPT4ge1xuICAgICAgICBpZiAoIWF1dG9QYW5PbkNvbm5lY3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbeE1vdmVtZW50LCB5TW92ZW1lbnRdID0gY2FsY0F1dG9QYW4oY29ubmVjdGlvblBvc2l0aW9uLCBjb250YWluZXJCb3VuZHMpO1xuICAgICAgICBwYW5CeSh7IHg6IHhNb3ZlbWVudCwgeTogeU1vdmVtZW50IH0pO1xuICAgICAgICBhdXRvUGFuSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYXV0b1Bhbik7XG4gICAgfTtcbiAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGNvbm5lY3Rpb25Qb3NpdGlvbixcbiAgICAgICAgY29ubmVjdGlvblN0YXR1czogbnVsbCxcbiAgICAgICAgLy8gY29ubmVjdGlvbk5vZGVJZCBldGMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIGluIGZhdm9yIG9mIGNvbm5lY3Rpb25TdGFydEhhbmRsZVxuICAgICAgICBjb25uZWN0aW9uTm9kZUlkOiBub2RlSWQsXG4gICAgICAgIGNvbm5lY3Rpb25IYW5kbGVJZDogaGFuZGxlSWQsXG4gICAgICAgIGNvbm5lY3Rpb25IYW5kbGVUeXBlOiBoYW5kbGVUeXBlLFxuICAgICAgICBjb25uZWN0aW9uU3RhcnRIYW5kbGU6IHtcbiAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgIGhhbmRsZUlkLFxuICAgICAgICAgICAgdHlwZTogaGFuZGxlVHlwZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvbkVuZEhhbmRsZTogbnVsbCxcbiAgICB9KTtcbiAgICBvbkNvbm5lY3RTdGFydD8uKGV2ZW50LCB7IG5vZGVJZCwgaGFuZGxlSWQsIGhhbmRsZVR5cGUgfSk7XG4gICAgZnVuY3Rpb24gb25Qb2ludGVyTW92ZShldmVudCkge1xuICAgICAgICBjb25zdCB7IHRyYW5zZm9ybSB9ID0gZ2V0U3RhdGUoKTtcbiAgICAgICAgY29ubmVjdGlvblBvc2l0aW9uID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudCwgY29udGFpbmVyQm91bmRzKTtcbiAgICAgICAgY29uc3QgeyBoYW5kbGUsIHZhbGlkSGFuZGxlUmVzdWx0IH0gPSBnZXRDbG9zZXN0SGFuZGxlKGV2ZW50LCBkb2MsIHBvaW50VG9SZW5kZXJlclBvaW50KGNvbm5lY3Rpb25Qb3NpdGlvbiwgdHJhbnNmb3JtLCBmYWxzZSwgWzEsIDFdKSwgY29ubmVjdGlvblJhZGl1cywgaGFuZGxlTG9va3VwLCAoaGFuZGxlKSA9PiBpc1ZhbGlkSGFuZGxlKGhhbmRsZSwgY29ubmVjdGlvbk1vZGUsIG5vZGVJZCwgaGFuZGxlSWQsIGlzVGFyZ2V0ID8gJ3RhcmdldCcgOiAnc291cmNlJywgaXNWYWxpZENvbm5lY3Rpb24sIGRvYykpO1xuICAgICAgICBjbG9zZXN0SGFuZGxlID0gaGFuZGxlO1xuICAgICAgICBpZiAoIWF1dG9QYW5TdGFydGVkKSB7XG4gICAgICAgICAgICBhdXRvUGFuKCk7XG4gICAgICAgICAgICBhdXRvUGFuU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlRG9tTm9kZSA9IHZhbGlkSGFuZGxlUmVzdWx0LmhhbmRsZURvbU5vZGU7XG4gICAgICAgIGNvbm5lY3Rpb24gPSB2YWxpZEhhbmRsZVJlc3VsdC5jb25uZWN0aW9uO1xuICAgICAgICBpc1ZhbGlkID0gdmFsaWRIYW5kbGVSZXN1bHQuaXNWYWxpZDtcbiAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgY29ubmVjdGlvblBvc2l0aW9uOiBjbG9zZXN0SGFuZGxlICYmIGlzVmFsaWRcbiAgICAgICAgICAgICAgICA/IHJlbmRlcmVyUG9pbnRUb1BvaW50KHtcbiAgICAgICAgICAgICAgICAgICAgeDogY2xvc2VzdEhhbmRsZS54LFxuICAgICAgICAgICAgICAgICAgICB5OiBjbG9zZXN0SGFuZGxlLnksXG4gICAgICAgICAgICAgICAgfSwgdHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgIDogY29ubmVjdGlvblBvc2l0aW9uLFxuICAgICAgICAgICAgY29ubmVjdGlvblN0YXR1czogZ2V0Q29ubmVjdGlvblN0YXR1cyghIWNsb3Nlc3RIYW5kbGUsIGlzVmFsaWQpLFxuICAgICAgICAgICAgY29ubmVjdGlvbkVuZEhhbmRsZTogdmFsaWRIYW5kbGVSZXN1bHQuZW5kSGFuZGxlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjbG9zZXN0SGFuZGxlICYmICFpc1ZhbGlkICYmICFoYW5kbGVEb21Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzZXRSZWNlbnRIYW5kbGUocHJldkFjdGl2ZUhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc291cmNlICE9PSBjb25uZWN0aW9uLnRhcmdldCAmJiBoYW5kbGVEb21Ob2RlKSB7XG4gICAgICAgICAgICByZXNldFJlY2VudEhhbmRsZShwcmV2QWN0aXZlSGFuZGxlKTtcbiAgICAgICAgICAgIHByZXZBY3RpdmVIYW5kbGUgPSBoYW5kbGVEb21Ob2RlO1xuICAgICAgICAgICAgLy8gQHRvZG86IHJlbW92ZSB0aGUgb2xkIGNsYXNzIG5hbWVzIFwicmVhY3QtZmxvd19faGFuZGxlLVwiIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAgICAgICAgICAgIGhhbmRsZURvbU5vZGUuY2xhc3NMaXN0LmFkZCgnY29ubmVjdGluZycsICdyZWFjdC1mbG93X19oYW5kbGUtY29ubmVjdGluZycpO1xuICAgICAgICAgICAgaGFuZGxlRG9tTm9kZS5jbGFzc0xpc3QudG9nZ2xlKCd2YWxpZCcsIGlzVmFsaWQpO1xuICAgICAgICAgICAgaGFuZGxlRG9tTm9kZS5jbGFzc0xpc3QudG9nZ2xlKCdyZWFjdC1mbG93X19oYW5kbGUtdmFsaWQnLCBpc1ZhbGlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvblBvaW50ZXJVcChldmVudCkge1xuICAgICAgICBpZiAoKGNsb3Nlc3RIYW5kbGUgfHwgaGFuZGxlRG9tTm9kZSkgJiYgY29ubmVjdGlvbiAmJiBpc1ZhbGlkKSB7XG4gICAgICAgICAgICBvbkNvbm5lY3Q/Lihjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpdCdzIGltcG9ydGFudCB0byBnZXQgYSBmcmVzaCByZWZlcmVuY2UgZnJvbSB0aGUgc3RvcmUgaGVyZVxuICAgICAgICAvLyBpbiBvcmRlciB0byBnZXQgdGhlIGxhdGVzdCBzdGF0ZSBvZiBvbkNvbm5lY3RFbmRcbiAgICAgICAgZ2V0U3RhdGUoKS5vbkNvbm5lY3RFbmQ/LihldmVudCk7XG4gICAgICAgIGlmIChlZGdlVXBkYXRlclR5cGUpIHtcbiAgICAgICAgICAgIG9uUmVjb25uZWN0RW5kPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc2V0UmVjZW50SGFuZGxlKHByZXZBY3RpdmVIYW5kbGUpO1xuICAgICAgICBjYW5jZWxDb25uZWN0aW9uKCk7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGF1dG9QYW5JZCk7XG4gICAgICAgIGF1dG9QYW5TdGFydGVkID0gZmFsc2U7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIGhhbmRsZURvbU5vZGUgPSBudWxsO1xuICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Qb2ludGVyVXApO1xuICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uUG9pbnRlclVwKTtcbiAgICB9XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Qb2ludGVyVXApO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblBvaW50ZXJVcCk7XG59XG5cbmNvbnN0IGFsd2F5c1ZhbGlkID0gKCkgPT4gdHJ1ZTtcbmNvbnN0IHNlbGVjdG9yJGYgPSAocykgPT4gKHtcbiAgICBjb25uZWN0aW9uU3RhcnRIYW5kbGU6IHMuY29ubmVjdGlvblN0YXJ0SGFuZGxlLFxuICAgIGNvbm5lY3RPbkNsaWNrOiBzLmNvbm5lY3RPbkNsaWNrLFxuICAgIG5vUGFuQ2xhc3NOYW1lOiBzLm5vUGFuQ2xhc3NOYW1lLFxufSk7XG5jb25zdCBjb25uZWN0aW5nU2VsZWN0b3IgPSAobm9kZUlkLCBoYW5kbGVJZCwgdHlwZSkgPT4gKHN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBjb25uZWN0aW9uU3RhcnRIYW5kbGU6IHN0YXJ0SGFuZGxlLCBjb25uZWN0aW9uRW5kSGFuZGxlOiBlbmRIYW5kbGUsIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlOiBjbGlja0hhbmRsZSwgfSA9IHN0YXRlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5lY3Rpbmc6IChzdGFydEhhbmRsZT8ubm9kZUlkID09PSBub2RlSWQgJiYgc3RhcnRIYW5kbGU/LmhhbmRsZUlkID09PSBoYW5kbGVJZCAmJiBzdGFydEhhbmRsZT8udHlwZSA9PT0gdHlwZSkgfHxcbiAgICAgICAgICAgIChlbmRIYW5kbGU/Lm5vZGVJZCA9PT0gbm9kZUlkICYmIGVuZEhhbmRsZT8uaGFuZGxlSWQgPT09IGhhbmRsZUlkICYmIGVuZEhhbmRsZT8udHlwZSA9PT0gdHlwZSksXG4gICAgICAgIGNsaWNrQ29ubmVjdGluZzogY2xpY2tIYW5kbGU/Lm5vZGVJZCA9PT0gbm9kZUlkICYmIGNsaWNrSGFuZGxlPy5oYW5kbGVJZCA9PT0gaGFuZGxlSWQgJiYgY2xpY2tIYW5kbGU/LnR5cGUgPT09IHR5cGUsXG4gICAgfTtcbn07XG5jb25zdCBIYW5kbGUgPSBmb3J3YXJkUmVmKCh7IHR5cGUgPSAnc291cmNlJywgcG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIGlzVmFsaWRDb25uZWN0aW9uLCBpc0Nvbm5lY3RhYmxlID0gdHJ1ZSwgaXNDb25uZWN0YWJsZVN0YXJ0ID0gdHJ1ZSwgaXNDb25uZWN0YWJsZUVuZCA9IHRydWUsIGlkLCBvbkNvbm5lY3QsIGNoaWxkcmVuLCBjbGFzc05hbWUsIG9uTW91c2VEb3duLCBvblRvdWNoU3RhcnQsIC4uLnJlc3QgfSwgcmVmKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlSWQgPSBpZCB8fCBudWxsO1xuICAgIGNvbnN0IGlzVGFyZ2V0ID0gdHlwZSA9PT0gJ3RhcmdldCc7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IG5vZGVJZCA9IHVzZU5vZGVJZCgpO1xuICAgIGNvbnN0IHsgY29ubmVjdE9uQ2xpY2ssIG5vUGFuQ2xhc3NOYW1lIH0gPSB1c2VTdG9yZShzZWxlY3RvciRmLCBzaGFsbG93KTtcbiAgICBjb25zdCB7IGNvbm5lY3RpbmcsIGNsaWNrQ29ubmVjdGluZyB9ID0gdXNlU3RvcmUoY29ubmVjdGluZ1NlbGVjdG9yKG5vZGVJZCwgaGFuZGxlSWQsIHR5cGUpLCBzaGFsbG93KTtcbiAgICBpZiAoIW5vZGVJZCkge1xuICAgICAgICBzdG9yZS5nZXRTdGF0ZSgpLm9uRXJyb3I/LignMDEwJywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMTAnXSgpKTtcbiAgICB9XG4gICAgY29uc3Qgb25Db25uZWN0RXh0ZW5kZWQgPSAocGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdEVkZ2VPcHRpb25zLCBvbkNvbm5lY3Q6IG9uQ29ubmVjdEFjdGlvbiwgaGFzRGVmYXVsdEVkZ2VzIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBlZGdlUGFyYW1zID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdEVkZ2VPcHRpb25zLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGVkZ2VzLCBzZXRFZGdlcyB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIHNldEVkZ2VzKGFkZEVkZ2UoZWRnZVBhcmFtcywgZWRnZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBvbkNvbm5lY3RBY3Rpb24/LihlZGdlUGFyYW1zKTtcbiAgICAgICAgb25Db25uZWN0Py4oZWRnZVBhcmFtcyk7XG4gICAgfTtcbiAgICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghbm9kZUlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNNb3VzZVRyaWdnZXJlZCA9IGlzTW91c2VFdmVudChldmVudCk7XG4gICAgICAgIGlmIChpc0Nvbm5lY3RhYmxlU3RhcnQgJiYgKChpc01vdXNlVHJpZ2dlcmVkICYmIGV2ZW50LmJ1dHRvbiA9PT0gMCkgfHwgIWlzTW91c2VUcmlnZ2VyZWQpKSB7XG4gICAgICAgICAgICBoYW5kbGVQb2ludGVyRG93bih7XG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgaGFuZGxlSWQsXG4gICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgICAgIG9uQ29ubmVjdDogb25Db25uZWN0RXh0ZW5kZWQsXG4gICAgICAgICAgICAgICAgaXNUYXJnZXQsXG4gICAgICAgICAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICAgICAgICAgIHNldFN0YXRlOiBzdG9yZS5zZXRTdGF0ZSxcbiAgICAgICAgICAgICAgICBpc1ZhbGlkQ29ubmVjdGlvbjogaXNWYWxpZENvbm5lY3Rpb24gfHwgc3RvcmUuZ2V0U3RhdGUoKS5pc1ZhbGlkQ29ubmVjdGlvbiB8fCBhbHdheXNWYWxpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc01vdXNlVHJpZ2dlcmVkKSB7XG4gICAgICAgICAgICBvbk1vdXNlRG93bj8uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uVG91Y2hTdGFydD8uKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgb25DbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9uQ2xpY2tDb25uZWN0U3RhcnQsIG9uQ2xpY2tDb25uZWN0RW5kLCBjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZSwgY29ubmVjdGlvbk1vZGUsIGlzVmFsaWRDb25uZWN0aW9uOiBpc1ZhbGlkQ29ubmVjdGlvblN0b3JlLCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKCFub2RlSWQgfHwgKCFjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZSAmJiAhaXNDb25uZWN0YWJsZVN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29ubmVjdGlvbkNsaWNrU3RhcnRIYW5kbGUpIHtcbiAgICAgICAgICAgIG9uQ2xpY2tDb25uZWN0U3RhcnQ/LihldmVudCwgeyBub2RlSWQsIGhhbmRsZUlkLCBoYW5kbGVUeXBlOiB0eXBlIH0pO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZTogeyBub2RlSWQsIHR5cGUsIGhhbmRsZUlkIH0gfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jID0gZ2V0SG9zdEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgY29uc3QgaXNWYWxpZENvbm5lY3Rpb25IYW5kbGVyID0gaXNWYWxpZENvbm5lY3Rpb24gfHwgaXNWYWxpZENvbm5lY3Rpb25TdG9yZSB8fCBhbHdheXNWYWxpZDtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uLCBpc1ZhbGlkIH0gPSBpc1ZhbGlkSGFuZGxlKHtcbiAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgIGlkOiBoYW5kbGVJZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgIH0sIGNvbm5lY3Rpb25Nb2RlLCBjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZS5ub2RlSWQsIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlLmhhbmRsZUlkIHx8IG51bGwsIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlLnR5cGUsIGlzVmFsaWRDb25uZWN0aW9uSGFuZGxlciwgZG9jKTtcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgIG9uQ29ubmVjdEV4dGVuZGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIG9uQ2xpY2tDb25uZWN0RW5kPy4oZXZlbnQpO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlOiBudWxsIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgXCJkYXRhLWhhbmRsZWlkXCI6IGhhbmRsZUlkLCBcImRhdGEtbm9kZWlkXCI6IG5vZGVJZCwgXCJkYXRhLWhhbmRsZXBvc1wiOiBwb3NpdGlvbiwgXCJkYXRhLWlkXCI6IGAke25vZGVJZH0tJHtoYW5kbGVJZH0tJHt0eXBlfWAsIGNsYXNzTmFtZTogY2MoW1xuICAgICAgICAgICAgJ3JlYWN0LWZsb3dfX2hhbmRsZScsXG4gICAgICAgICAgICBgcmVhY3QtZmxvd19faGFuZGxlLSR7cG9zaXRpb259YCxcbiAgICAgICAgICAgICdub2RyYWcnLFxuICAgICAgICAgICAgbm9QYW5DbGFzc05hbWUsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAhaXNUYXJnZXQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBpc1RhcmdldCxcbiAgICAgICAgICAgICAgICBjb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSxcbiAgICAgICAgICAgICAgICBjb25uZWN0YWJsZXN0YXJ0OiBpc0Nvbm5lY3RhYmxlU3RhcnQsXG4gICAgICAgICAgICAgICAgY29ubmVjdGFibGVlbmQ6IGlzQ29ubmVjdGFibGVFbmQsXG4gICAgICAgICAgICAgICAgY29ubmVjdGluZzogY2xpY2tDb25uZWN0aW5nLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdHlsZSB0aGUgaGFuZGxlIHdoZW4gdGhlIHVzZXIgaXMgY29ubmVjdGluZ1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25pbmRpY2F0b3I6IGlzQ29ubmVjdGFibGUgJiYgKChpc0Nvbm5lY3RhYmxlU3RhcnQgJiYgIWNvbm5lY3RpbmcpIHx8IChpc0Nvbm5lY3RhYmxlRW5kICYmIGNvbm5lY3RpbmcpKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0pLCBvbk1vdXNlRG93bjogb25Qb2ludGVyRG93biwgb25Ub3VjaFN0YXJ0OiBvblBvaW50ZXJEb3duLCBvbkNsaWNrOiBjb25uZWN0T25DbGljayA/IG9uQ2xpY2sgOiB1bmRlZmluZWQsIHJlZjogcmVmLCAuLi5yZXN0IH0sIGNoaWxkcmVuKSk7XG59KTtcbkhhbmRsZS5kaXNwbGF5TmFtZSA9ICdIYW5kbGUnO1xudmFyIEhhbmRsZSQxID0gbWVtbyhIYW5kbGUpO1xuXG5jb25zdCBEZWZhdWx0Tm9kZSA9ICh7IGRhdGEsIGlzQ29ubmVjdGFibGUsIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgfSkgPT4ge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChIYW5kbGUkMSwgeyB0eXBlOiBcInRhcmdldFwiLCBwb3NpdGlvbjogdGFyZ2V0UG9zaXRpb24sIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUgfSksXG4gICAgICAgIGRhdGE/LmxhYmVsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZSQxLCB7IHR5cGU6IFwic291cmNlXCIsIHBvc2l0aW9uOiBzb3VyY2VQb3NpdGlvbiwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSB9KSkpO1xufTtcbkRlZmF1bHROb2RlLmRpc3BsYXlOYW1lID0gJ0RlZmF1bHROb2RlJztcbnZhciBEZWZhdWx0Tm9kZSQxID0gbWVtbyhEZWZhdWx0Tm9kZSk7XG5cbmNvbnN0IElucHV0Tm9kZSA9ICh7IGRhdGEsIGlzQ29ubmVjdGFibGUsIHNvdXJjZVBvc2l0aW9uID0gUG9zaXRpb24uQm90dG9tIH0pID0+IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgIGRhdGE/LmxhYmVsLFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlJDEsIHsgdHlwZTogXCJzb3VyY2VcIiwgcG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0pKSk7XG5JbnB1dE5vZGUuZGlzcGxheU5hbWUgPSAnSW5wdXROb2RlJztcbnZhciBJbnB1dE5vZGUkMSA9IG1lbW8oSW5wdXROb2RlKTtcblxuY29uc3QgT3V0cHV0Tm9kZSA9ICh7IGRhdGEsIGlzQ29ubmVjdGFibGUsIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wIH0pID0+IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlJDEsIHsgdHlwZTogXCJ0YXJnZXRcIiwgcG9zaXRpb246IHRhcmdldFBvc2l0aW9uLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0pLFxuICAgIGRhdGE/LmxhYmVsKSk7XG5PdXRwdXROb2RlLmRpc3BsYXlOYW1lID0gJ091dHB1dE5vZGUnO1xudmFyIE91dHB1dE5vZGUkMSA9IG1lbW8oT3V0cHV0Tm9kZSk7XG5cbmNvbnN0IEdyb3VwTm9kZSA9ICgpID0+IG51bGw7XG5Hcm91cE5vZGUuZGlzcGxheU5hbWUgPSAnR3JvdXBOb2RlJztcblxuY29uc3Qgc2VsZWN0b3IkZSA9IChzKSA9PiAoe1xuICAgIHNlbGVjdGVkTm9kZXM6IHMuZ2V0Tm9kZXMoKS5maWx0ZXIoKG4pID0+IG4uc2VsZWN0ZWQpLFxuICAgIHNlbGVjdGVkRWRnZXM6IHMuZWRnZXMuZmlsdGVyKChlKSA9PiBlLnNlbGVjdGVkKS5tYXAoKGUpID0+ICh7IC4uLmUgfSkpLFxufSk7XG5jb25zdCBzZWxlY3RJZCA9IChvYmopID0+IG9iai5pZDtcbmZ1bmN0aW9uIGFyZUVxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gKHNoYWxsb3coYS5zZWxlY3RlZE5vZGVzLm1hcChzZWxlY3RJZCksIGIuc2VsZWN0ZWROb2Rlcy5tYXAoc2VsZWN0SWQpKSAmJlxuICAgICAgICBzaGFsbG93KGEuc2VsZWN0ZWRFZGdlcy5tYXAoc2VsZWN0SWQpLCBiLnNlbGVjdGVkRWRnZXMubWFwKHNlbGVjdElkKSkpO1xufVxuLy8gVGhpcyBpcyBqdXN0IGEgaGVscGVyIGNvbXBvbmVudCBmb3IgY2FsbGluZyB0aGUgb25TZWxlY3Rpb25DaGFuZ2UgbGlzdGVuZXIuXG4vLyBAVE9ETzogTm93IHRoYXQgd2UgaGF2ZSB0aGUgb25Ob2Rlc0NoYW5nZSBhbmQgb24gRWRnZXNDaGFuZ2UgbGlzdGVuZXJzLCBkbyB3ZSBzdGlsbCBuZWVkIHRoaXMgY29tcG9uZW50P1xuY29uc3QgU2VsZWN0aW9uTGlzdGVuZXIgPSBtZW1vKCh7IG9uU2VsZWN0aW9uQ2hhbmdlIH0pID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgeyBzZWxlY3RlZE5vZGVzLCBzZWxlY3RlZEVkZ2VzIH0gPSB1c2VTdG9yZShzZWxlY3RvciRlLCBhcmVFcXVhbCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBub2Rlczogc2VsZWN0ZWROb2RlcywgZWRnZXM6IHNlbGVjdGVkRWRnZXMgfTtcbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2U/LihwYXJhbXMpO1xuICAgICAgICBzdG9yZS5nZXRTdGF0ZSgpLm9uU2VsZWN0aW9uQ2hhbmdlLmZvckVhY2goKGZuKSA9PiBmbihwYXJhbXMpKTtcbiAgICB9LCBbc2VsZWN0ZWROb2Rlcywgc2VsZWN0ZWRFZGdlcywgb25TZWxlY3Rpb25DaGFuZ2VdKTtcbiAgICByZXR1cm4gbnVsbDtcbn0pO1xuU2VsZWN0aW9uTGlzdGVuZXIuZGlzcGxheU5hbWUgPSAnU2VsZWN0aW9uTGlzdGVuZXInO1xuY29uc3QgY2hhbmdlU2VsZWN0b3IgPSAocykgPT4gISFzLm9uU2VsZWN0aW9uQ2hhbmdlO1xuZnVuY3Rpb24gV3JhcHBlciQxKHsgb25TZWxlY3Rpb25DaGFuZ2UgfSkge1xuICAgIGNvbnN0IHN0b3JlSGFzU2VsZWN0aW9uQ2hhbmdlID0gdXNlU3RvcmUoY2hhbmdlU2VsZWN0b3IpO1xuICAgIGlmIChvblNlbGVjdGlvbkNoYW5nZSB8fCBzdG9yZUhhc1NlbGVjdGlvbkNoYW5nZSkge1xuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTZWxlY3Rpb25MaXN0ZW5lciwgeyBvblNlbGVjdGlvbkNoYW5nZTogb25TZWxlY3Rpb25DaGFuZ2UgfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBzZWxlY3RvciRkID0gKHMpID0+ICh7XG4gICAgc2V0Tm9kZXM6IHMuc2V0Tm9kZXMsXG4gICAgc2V0RWRnZXM6IHMuc2V0RWRnZXMsXG4gICAgc2V0RGVmYXVsdE5vZGVzQW5kRWRnZXM6IHMuc2V0RGVmYXVsdE5vZGVzQW5kRWRnZXMsXG4gICAgc2V0TWluWm9vbTogcy5zZXRNaW5ab29tLFxuICAgIHNldE1heFpvb206IHMuc2V0TWF4Wm9vbSxcbiAgICBzZXRUcmFuc2xhdGVFeHRlbnQ6IHMuc2V0VHJhbnNsYXRlRXh0ZW50LFxuICAgIHNldE5vZGVFeHRlbnQ6IHMuc2V0Tm9kZUV4dGVudCxcbiAgICByZXNldDogcy5yZXNldCxcbn0pO1xuZnVuY3Rpb24gdXNlU3RvcmVVcGRhdGVyKHZhbHVlLCBzZXRTdG9yZVN0YXRlKSB7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFN0b3JlU3RhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSwgW3ZhbHVlXSk7XG59XG4vLyB1cGRhdGVzIHdpdGggdmFsdWVzIGluIHN0b3JlIHRoYXQgZG9uJ3QgaGF2ZSBhIGRlZGljYXRlZCBzZXR0ZXIgZnVuY3Rpb25cbmZ1bmN0aW9uIHVzZURpcmVjdFN0b3JlVXBkYXRlcihrZXksIHZhbHVlLCBzZXRTdGF0ZSkge1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzZXRTdGF0ZSh7IFtrZXldOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgIH0sIFt2YWx1ZV0pO1xufVxuY29uc3QgU3RvcmVVcGRhdGVyID0gKHsgbm9kZXMsIGVkZ2VzLCBkZWZhdWx0Tm9kZXMsIGRlZmF1bHRFZGdlcywgb25Db25uZWN0LCBvbkNvbm5lY3RTdGFydCwgb25Db25uZWN0RW5kLCBvbkNsaWNrQ29ubmVjdFN0YXJ0LCBvbkNsaWNrQ29ubmVjdEVuZCwgbm9kZXNEcmFnZ2FibGUsIG5vZGVzQ29ubmVjdGFibGUsIG5vZGVzRm9jdXNhYmxlLCBlZGdlc0ZvY3VzYWJsZSwgZWRnZXNVcGRhdGFibGUsIGVsZXZhdGVOb2Rlc09uU2VsZWN0LCBtaW5ab29tLCBtYXhab29tLCBub2RlRXh0ZW50LCBvbk5vZGVzQ2hhbmdlLCBvbkVkZ2VzQ2hhbmdlLCBlbGVtZW50c1NlbGVjdGFibGUsIGNvbm5lY3Rpb25Nb2RlLCBzbmFwR3JpZCwgc25hcFRvR3JpZCwgdHJhbnNsYXRlRXh0ZW50LCBjb25uZWN0T25DbGljaywgZGVmYXVsdEVkZ2VPcHRpb25zLCBmaXRWaWV3LCBmaXRWaWV3T3B0aW9ucywgb25Ob2Rlc0RlbGV0ZSwgb25FZGdlc0RlbGV0ZSwgb25Ob2RlRHJhZywgb25Ob2RlRHJhZ1N0YXJ0LCBvbk5vZGVEcmFnU3RvcCwgb25TZWxlY3Rpb25EcmFnLCBvblNlbGVjdGlvbkRyYWdTdGFydCwgb25TZWxlY3Rpb25EcmFnU3RvcCwgbm9QYW5DbGFzc05hbWUsIG5vZGVPcmlnaW4sIHJmSWQsIGF1dG9QYW5PbkNvbm5lY3QsIGF1dG9QYW5Pbk5vZGVEcmFnLCBvbkVycm9yLCBjb25uZWN0aW9uUmFkaXVzLCBpc1ZhbGlkQ29ubmVjdGlvbiwgbm9kZURyYWdUaHJlc2hvbGQsIH0pID0+IHtcbiAgICBjb25zdCB7IHNldE5vZGVzLCBzZXRFZGdlcywgc2V0RGVmYXVsdE5vZGVzQW5kRWRnZXMsIHNldE1pblpvb20sIHNldE1heFpvb20sIHNldFRyYW5zbGF0ZUV4dGVudCwgc2V0Tm9kZUV4dGVudCwgcmVzZXQsIH0gPSB1c2VTdG9yZShzZWxlY3RvciRkLCBzaGFsbG93KTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZWRnZXNXaXRoRGVmYXVsdHMgPSBkZWZhdWx0RWRnZXM/Lm1hcCgoZSkgPT4gKHsgLi4uZSwgLi4uZGVmYXVsdEVkZ2VPcHRpb25zIH0pKTtcbiAgICAgICAgc2V0RGVmYXVsdE5vZGVzQW5kRWRnZXMoZGVmYXVsdE5vZGVzLCBlZGdlc1dpdGhEZWZhdWx0cyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2RlZmF1bHRFZGdlT3B0aW9ucycsIGRlZmF1bHRFZGdlT3B0aW9ucywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignY29ubmVjdGlvbk1vZGUnLCBjb25uZWN0aW9uTW9kZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25Db25uZWN0Jywgb25Db25uZWN0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbkNvbm5lY3RTdGFydCcsIG9uQ29ubmVjdFN0YXJ0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbkNvbm5lY3RFbmQnLCBvbkNvbm5lY3RFbmQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uQ2xpY2tDb25uZWN0U3RhcnQnLCBvbkNsaWNrQ29ubmVjdFN0YXJ0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbkNsaWNrQ29ubmVjdEVuZCcsIG9uQ2xpY2tDb25uZWN0RW5kLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdub2Rlc0RyYWdnYWJsZScsIG5vZGVzRHJhZ2dhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdub2Rlc0Nvbm5lY3RhYmxlJywgbm9kZXNDb25uZWN0YWJsZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignbm9kZXNGb2N1c2FibGUnLCBub2Rlc0ZvY3VzYWJsZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignZWRnZXNGb2N1c2FibGUnLCBlZGdlc0ZvY3VzYWJsZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignZWRnZXNVcGRhdGFibGUnLCBlZGdlc1VwZGF0YWJsZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignZWxlbWVudHNTZWxlY3RhYmxlJywgZWxlbWVudHNTZWxlY3RhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdlbGV2YXRlTm9kZXNPblNlbGVjdCcsIGVsZXZhdGVOb2Rlc09uU2VsZWN0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdzbmFwVG9HcmlkJywgc25hcFRvR3JpZCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignc25hcEdyaWQnLCBzbmFwR3JpZCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25Ob2Rlc0NoYW5nZScsIG9uTm9kZXNDaGFuZ2UsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uRWRnZXNDaGFuZ2UnLCBvbkVkZ2VzQ2hhbmdlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdjb25uZWN0T25DbGljaycsIGNvbm5lY3RPbkNsaWNrLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdmaXRWaWV3T25Jbml0JywgZml0Vmlldywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignZml0Vmlld09uSW5pdE9wdGlvbnMnLCBmaXRWaWV3T3B0aW9ucywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25Ob2Rlc0RlbGV0ZScsIG9uTm9kZXNEZWxldGUsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uRWRnZXNEZWxldGUnLCBvbkVkZ2VzRGVsZXRlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbk5vZGVEcmFnJywgb25Ob2RlRHJhZywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25Ob2RlRHJhZ1N0YXJ0Jywgb25Ob2RlRHJhZ1N0YXJ0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbk5vZGVEcmFnU3RvcCcsIG9uTm9kZURyYWdTdG9wLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvblNlbGVjdGlvbkRyYWcnLCBvblNlbGVjdGlvbkRyYWcsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uU2VsZWN0aW9uRHJhZ1N0YXJ0Jywgb25TZWxlY3Rpb25EcmFnU3RhcnQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uU2VsZWN0aW9uRHJhZ1N0b3AnLCBvblNlbGVjdGlvbkRyYWdTdG9wLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdub1BhbkNsYXNzTmFtZScsIG5vUGFuQ2xhc3NOYW1lLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdub2RlT3JpZ2luJywgbm9kZU9yaWdpbiwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcigncmZJZCcsIHJmSWQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2F1dG9QYW5PbkNvbm5lY3QnLCBhdXRvUGFuT25Db25uZWN0LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdhdXRvUGFuT25Ob2RlRHJhZycsIGF1dG9QYW5Pbk5vZGVEcmFnLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbkVycm9yJywgb25FcnJvciwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignY29ubmVjdGlvblJhZGl1cycsIGNvbm5lY3Rpb25SYWRpdXMsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2lzVmFsaWRDb25uZWN0aW9uJywgaXNWYWxpZENvbm5lY3Rpb24sIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ25vZGVEcmFnVGhyZXNob2xkJywgbm9kZURyYWdUaHJlc2hvbGQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VTdG9yZVVwZGF0ZXIobm9kZXMsIHNldE5vZGVzKTtcbiAgICB1c2VTdG9yZVVwZGF0ZXIoZWRnZXMsIHNldEVkZ2VzKTtcbiAgICB1c2VTdG9yZVVwZGF0ZXIobWluWm9vbSwgc2V0TWluWm9vbSk7XG4gICAgdXNlU3RvcmVVcGRhdGVyKG1heFpvb20sIHNldE1heFpvb20pO1xuICAgIHVzZVN0b3JlVXBkYXRlcih0cmFuc2xhdGVFeHRlbnQsIHNldFRyYW5zbGF0ZUV4dGVudCk7XG4gICAgdXNlU3RvcmVVcGRhdGVyKG5vZGVFeHRlbnQsIHNldE5vZGVFeHRlbnQpO1xuICAgIHJldHVybiBudWxsO1xufTtcblxuY29uc3Qgc3R5bGUgPSB7IGRpc3BsYXk6ICdub25lJyB9O1xuY29uc3QgYXJpYUxpdmVTdHlsZSA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB3aWR0aDogMSxcbiAgICBoZWlnaHQ6IDEsXG4gICAgbWFyZ2luOiAtMSxcbiAgICBib3JkZXI6IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgY2xpcDogJ3JlY3QoMHB4LCAwcHgsIDBweCwgMHB4KScsXG4gICAgY2xpcFBhdGg6ICdpbnNldCgxMDAlKScsXG59O1xuY29uc3QgQVJJQV9OT0RFX0RFU0NfS0VZID0gJ3JlYWN0LWZsb3dfX25vZGUtZGVzYyc7XG5jb25zdCBBUklBX0VER0VfREVTQ19LRVkgPSAncmVhY3QtZmxvd19fZWRnZS1kZXNjJztcbmNvbnN0IEFSSUFfTElWRV9NRVNTQUdFID0gJ3JlYWN0LWZsb3dfX2FyaWEtbGl2ZSc7XG5jb25zdCBzZWxlY3RvciRjID0gKHMpID0+IHMuYXJpYUxpdmVNZXNzYWdlO1xuZnVuY3Rpb24gQXJpYUxpdmVNZXNzYWdlKHsgcmZJZCB9KSB7XG4gICAgY29uc3QgYXJpYUxpdmVNZXNzYWdlID0gdXNlU3RvcmUoc2VsZWN0b3IkYyk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgaWQ6IGAke0FSSUFfTElWRV9NRVNTQUdFfS0ke3JmSWR9YCwgXCJhcmlhLWxpdmVcIjogXCJhc3NlcnRpdmVcIiwgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIiwgc3R5bGU6IGFyaWFMaXZlU3R5bGUgfSwgYXJpYUxpdmVNZXNzYWdlKSk7XG59XG5mdW5jdGlvbiBBMTF5RGVzY3JpcHRpb25zKHsgcmZJZCwgZGlzYWJsZUtleWJvYXJkQTExeSB9KSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgaWQ6IGAke0FSSUFfTk9ERV9ERVNDX0tFWX0tJHtyZklkfWAsIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgICAgICAgXCJQcmVzcyBlbnRlciBvciBzcGFjZSB0byBzZWxlY3QgYSBub2RlLlwiLFxuICAgICAgICAgICAgIWRpc2FibGVLZXlib2FyZEExMXkgJiYgJ1lvdSBjYW4gdGhlbiB1c2UgdGhlIGFycm93IGtleXMgdG8gbW92ZSB0aGUgbm9kZSBhcm91bmQuJyxcbiAgICAgICAgICAgIFwiIFByZXNzIGRlbGV0ZSB0byByZW1vdmUgaXQgYW5kIGVzY2FwZSB0byBjYW5jZWwuXCIsXG4gICAgICAgICAgICAnICcpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgaWQ6IGAke0FSSUFfRURHRV9ERVNDX0tFWX0tJHtyZklkfWAsIHN0eWxlOiBzdHlsZSB9LCBcIlByZXNzIGVudGVyIG9yIHNwYWNlIHRvIHNlbGVjdCBhbiBlZGdlLiBZb3UgY2FuIHRoZW4gcHJlc3MgZGVsZXRlIHRvIHJlbW92ZSBpdCBvciBlc2NhcGUgdG8gY2FuY2VsLlwiKSxcbiAgICAgICAgIWRpc2FibGVLZXlib2FyZEExMXkgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChBcmlhTGl2ZU1lc3NhZ2UsIHsgcmZJZDogcmZJZCB9KSkpO1xufVxuXG4vLyB0aGUga2V5Y29kZSBjYW4gYmUgYSBzdHJpbmcgJ2EnIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgWydhJywgJ2ErZCddXG4vLyBhIHN0cmluZyBtZWFucyBhIHNpbmdsZSBrZXkgJ2EnIG9yIGEgY29tYmluYXRpb24gd2hlbiAnKycgaXMgdXNlZCAnYStkJ1xuLy8gYW4gYXJyYXkgbWVhbnMgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMuIEV4cGxhaW5lcjogWydhJywgJ2QrcyddIGhlcmUgdGhlXG4vLyB1c2VyIGNhbiB1c2UgdGhlIHNpbmdsZSBrZXkgJ2EnIG9yIHRoZSBjb21iaW5hdGlvbiAnZCcgKyAncydcbnZhciB1c2VLZXlQcmVzcyA9IChrZXlDb2RlID0gbnVsbCwgb3B0aW9ucyA9IHsgYWN0SW5zaWRlSW5wdXRXaXRoTW9kaWZpZXI6IHRydWUgfSkgPT4ge1xuICAgIGNvbnN0IFtrZXlQcmVzc2VkLCBzZXRLZXlQcmVzc2VkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICAvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIGlmIGEgbW9kaWZpZXIga2V5IGlzIHByZXNzZWQgaW4gb3JkZXIgdG8gdHJhY2sgaXRcbiAgICBjb25zdCBtb2RpZmllclByZXNzZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgIC8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHByZXNzZWQga2V5cyBpbiBvcmRlciB0byBzdXBwb3J0IGNvbWJpbmF0aW9uc1xuICAgIGNvbnN0IHByZXNzZWRLZXlzID0gdXNlUmVmKG5ldyBTZXQoW10pKTtcbiAgICAvLyBrZXlDb2RlcyA9IGFycmF5IHdpdGggc2luZ2xlIGtleXMgW1snYSddXSBvciBrZXkgY29tYmluYXRpb25zIFtbJ2EnLCAncyddXVxuICAgIC8vIGtleXNUb1dhdGNoID0gYXJyYXkgd2l0aCBhbGwga2V5cyBmbGF0dGVuZWQgWydhJywgJ2QnLCAnU2hpZnRMZWZ0J11cbiAgICAvLyB1c2VkIHRvIGNoZWNrIGlmIHdlIHN0b3JlIGV2ZW50LmNvZGUgb3IgZXZlbnQua2V5LiBXaGVuIHRoZSBjb2RlIGlzIGluIHRoZSBsaXN0IG9mIGtleXNUb1dhdGNoXG4gICAgLy8gd2UgdXNlIHRoZSBjb2RlIG90aGVyd2lzZSB0aGUga2V5LiBFeHBsYWluZXI6IFdoZW4geW91IHByZXNzIHRoZSBsZWZ0IFwiY29tbWFuZFwiIGtleSwgdGhlIGNvZGUgaXMgXCJNZXRhTGVmdFwiXG4gICAgLy8gYW5kIHRoZSBrZXkgaXMgXCJNZXRhXCIuIFdlIHdhbnQgdXNlcnMgdG8gYmUgYWJsZSB0byBwYXNzIGtleXMgYW5kIGNvZGVzIHNvIHdlIGFzc3VtZSB0aGF0IHRoZSBrZXkgaXMgbWVhbnQgd2hlblxuICAgIC8vIHdlIGNhbid0IGZpbmQgaXQgaW4gdGhlIGxpc3Qgb2Yga2V5c1RvV2F0Y2guXG4gICAgY29uc3QgW2tleUNvZGVzLCBrZXlzVG9XYXRjaF0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGtleUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGVBcnIgPSBBcnJheS5pc0FycmF5KGtleUNvZGUpID8ga2V5Q29kZSA6IFtrZXlDb2RlXTtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBrZXlDb2RlQXJyLmZpbHRlcigoa2MpID0+IHR5cGVvZiBrYyA9PT0gJ3N0cmluZycpLm1hcCgoa2MpID0+IGtjLnNwbGl0KCcrJykpO1xuICAgICAgICAgICAgY29uc3Qga2V5c0ZsYXQgPSBrZXlzLnJlZHVjZSgocmVzLCBpdGVtKSA9PiByZXMuY29uY2F0KC4uLml0ZW0pLCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gW2tleXMsIGtleXNGbGF0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1tdLCBbXV07XG4gICAgfSwgW2tleUNvZGVdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiBudWxsO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zPy50YXJnZXQgfHwgZG9jO1xuICAgICAgICBpZiAoa2V5Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZG93bkhhbmRsZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBtb2RpZmllclByZXNzZWQuY3VycmVudCA9IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ZW50QWN0aW9uID0gKCFtb2RpZmllclByZXNzZWQuY3VycmVudCB8fCAobW9kaWZpZXJQcmVzc2VkLmN1cnJlbnQgJiYgIW9wdGlvbnMuYWN0SW5zaWRlSW5wdXRXaXRoTW9kaWZpZXIpKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc0lucHV0RE9NTm9kZShldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBrZXlPckNvZGUgPSB1c2VLZXlPckNvZGUoZXZlbnQuY29kZSwga2V5c1RvV2F0Y2gpO1xuICAgICAgICAgICAgICAgIHByZXNzZWRLZXlzLmN1cnJlbnQuYWRkKGV2ZW50W2tleU9yQ29kZV0pO1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nS2V5KGtleUNvZGVzLCBwcmVzc2VkS2V5cy5jdXJyZW50LCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5UHJlc3NlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdXBIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmVudEFjdGlvbiA9ICghbW9kaWZpZXJQcmVzc2VkLmN1cnJlbnQgfHwgKG1vZGlmaWVyUHJlc3NlZC5jdXJyZW50ICYmICFvcHRpb25zLmFjdEluc2lkZUlucHV0V2l0aE1vZGlmaWVyKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNJbnB1dERPTU5vZGUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ZW50QWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5T3JDb2RlID0gdXNlS2V5T3JDb2RlKGV2ZW50LmNvZGUsIGtleXNUb1dhdGNoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ0tleShrZXlDb2RlcywgcHJlc3NlZEtleXMuY3VycmVudCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5UHJlc3NlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXlzLmN1cnJlbnQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXlzLmN1cnJlbnQuZGVsZXRlKGV2ZW50W2tleU9yQ29kZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXggZm9yIE1hYzogd2hlbiBjbWQga2V5IGlzIHByZXNzZWQsIGtleXVwIGlzIG5vdCB0cmlnZ2VyZWQgZm9yIGFueSBvdGhlciBrZXksIHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjczODAwMTgvd2hlbi1jbWQta2V5LWlzLWtlcHQtcHJlc3NlZC1rZXl1cC1pcy1ub3QtdHJpZ2dlcmVkLWZvci1hbnktb3RoZXIta2V5XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXNzZWRLZXlzLmN1cnJlbnQuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbW9kaWZpZXJQcmVzc2VkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXNldEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJlc3NlZEtleXMuY3VycmVudC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHNldEtleVByZXNzZWQoZmFsc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhcmdldD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRvd25IYW5kbGVyKTtcbiAgICAgICAgICAgIHRhcmdldD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB1cEhhbmRsZXIpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCByZXNldEhhbmRsZXIpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkb3duSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCByZXNldEhhbmRsZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sIFtrZXlDb2RlLCBzZXRLZXlQcmVzc2VkXSk7XG4gICAgcmV0dXJuIGtleVByZXNzZWQ7XG59O1xuLy8gdXRpbHNcbmZ1bmN0aW9uIGlzTWF0Y2hpbmdLZXkoa2V5Q29kZXMsIHByZXNzZWRLZXlzLCBpc1VwKSB7XG4gICAgcmV0dXJuIChrZXlDb2Rlc1xuICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gY29tcGFyZSBzYW1lIHNpemVzIG9mIGtleUNvZGUgZGVmaW5pdGlvbnNcbiAgICAgICAgLy8gYW5kIHByZXNzZWQga2V5cy4gV2hlbiB0aGUgdXNlciBzcGVjaWZpZWQgJ01ldGEnIGFzIGEga2V5IHNvbWV3aGVyZVxuICAgICAgICAvLyB0aGlzIHdvdWxkIGFsc28gYmUgdHJ1dGh5IHdpdGhvdXQgdGhpcyBmaWx0ZXIgd2hlbiB1c2VyIHByZXNzZXMgJ01ldGEnICsgJ3InXG4gICAgICAgIC5maWx0ZXIoKGtleXMpID0+IGlzVXAgfHwga2V5cy5sZW5ndGggPT09IHByZXNzZWRLZXlzLnNpemUpXG4gICAgICAgIC8vIHNpbmNlIHdlIHdhbnQgdG8gc3VwcG9ydCBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzIG9ubHkgb25lIG9mIHRoZVxuICAgICAgICAvLyBjb21iaW5hdGlvbnMgbmVlZCB0byBiZSBwYXJ0IG9mIHRoZSBwcmVzc2VkIGtleXNcbiAgICAgICAgLnNvbWUoKGtleXMpID0+IGtleXMuZXZlcnkoKGspID0+IHByZXNzZWRLZXlzLmhhcyhrKSkpKTtcbn1cbmZ1bmN0aW9uIHVzZUtleU9yQ29kZShldmVudENvZGUsIGtleXNUb1dhdGNoKSB7XG4gICAgcmV0dXJuIGtleXNUb1dhdGNoLmluY2x1ZGVzKGV2ZW50Q29kZSkgPyAnY29kZScgOiAna2V5Jztcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlWFlaUG9zaXRpb24obm9kZSwgbm9kZUludGVybmFscywgcmVzdWx0LCBub2RlT3JpZ2luKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSBub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnRJZDtcbiAgICBpZiAoIXBhcmVudElkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChwYXJlbnRJZCk7XG4gICAgY29uc3QgcGFyZW50Tm9kZVBvc2l0aW9uID0gZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbihwYXJlbnROb2RlLCBub2RlT3JpZ2luKTtcbiAgICByZXR1cm4gY2FsY3VsYXRlWFlaUG9zaXRpb24ocGFyZW50Tm9kZSwgbm9kZUludGVybmFscywge1xuICAgICAgICB4OiAocmVzdWx0LnggPz8gMCkgKyBwYXJlbnROb2RlUG9zaXRpb24ueCxcbiAgICAgICAgeTogKHJlc3VsdC55ID8/IDApICsgcGFyZW50Tm9kZVBvc2l0aW9uLnksXG4gICAgICAgIHo6IChwYXJlbnROb2RlW2ludGVybmFsc1N5bWJvbF0/LnogPz8gMCkgPiAocmVzdWx0LnogPz8gMCkgPyBwYXJlbnROb2RlW2ludGVybmFsc1N5bWJvbF0/LnogPz8gMCA6IHJlc3VsdC56ID8/IDAsXG4gICAgfSwgbm9kZU9yaWdpbik7XG59XG5mdW5jdGlvbiB1cGRhdGVBYnNvbHV0ZU5vZGVQb3NpdGlvbnMobm9kZUludGVybmFscywgbm9kZU9yaWdpbiwgcGFyZW50Tm9kZXMpIHtcbiAgICBub2RlSW50ZXJuYWxzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnRJZDtcbiAgICAgICAgaWYgKHBhcmVudElkICYmICFub2RlSW50ZXJuYWxzLmhhcyhwYXJlbnRJZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyZW50IG5vZGUgJHtwYXJlbnRJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudElkIHx8IHBhcmVudE5vZGVzPy5bbm9kZS5pZF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gY2FsY3VsYXRlWFlaUG9zaXRpb24obm9kZSwgbm9kZUludGVybmFscywge1xuICAgICAgICAgICAgICAgIC4uLm5vZGUucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgejogbm9kZVtpbnRlcm5hbHNTeW1ib2xdPy56ID8/IDAsXG4gICAgICAgICAgICB9LCBub2RlT3JpZ2luKTtcbiAgICAgICAgICAgIG5vZGUucG9zaXRpb25BYnNvbHV0ZSA9IHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbm9kZVtpbnRlcm5hbHNTeW1ib2xdLnogPSB6O1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGVzPy5bbm9kZS5pZF0pIHtcbiAgICAgICAgICAgICAgICBub2RlW2ludGVybmFsc1N5bWJvbF0uaXNQYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlSW50ZXJuYWxzKG5vZGVzLCBub2RlSW50ZXJuYWxzLCBub2RlT3JpZ2luLCBlbGV2YXRlTm9kZXNPblNlbGVjdCkge1xuICAgIGNvbnN0IG5leHROb2RlSW50ZXJuYWxzID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IHBhcmVudE5vZGVzID0ge307XG4gICAgY29uc3Qgc2VsZWN0ZWROb2RlWiA9IGVsZXZhdGVOb2Rlc09uU2VsZWN0ID8gMTAwMCA6IDA7XG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCB6ID0gKGlzTnVtZXJpYyhub2RlLnpJbmRleCkgPyBub2RlLnpJbmRleCA6IDApICsgKG5vZGUuc2VsZWN0ZWQgPyBzZWxlY3RlZE5vZGVaIDogMCk7XG4gICAgICAgIGNvbnN0IGN1cnJJbnRlcm5hbHMgPSBub2RlSW50ZXJuYWxzLmdldChub2RlLmlkKTtcbiAgICAgICAgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHBvc2l0aW9uQWJzb2x1dGU6IHtcbiAgICAgICAgICAgICAgICB4OiBub2RlLnBvc2l0aW9uLngsXG4gICAgICAgICAgICAgICAgeTogbm9kZS5wb3NpdGlvbi55LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnRJZDtcbiAgICAgICAgaWYgKHBhcmVudElkKSB7XG4gICAgICAgICAgICBwYXJlbnROb2Rlc1twYXJlbnRJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc2V0SGFuZGxlQm91bmRzID0gY3VyckludGVybmFscz8udHlwZSAmJiBjdXJySW50ZXJuYWxzPy50eXBlICE9PSBub2RlLnR5cGU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnRlcm5hbHMsIGludGVybmFsc1N5bWJvbCwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvdW5kczogcmVzZXRIYW5kbGVCb3VuZHMgPyB1bmRlZmluZWQgOiBjdXJySW50ZXJuYWxzPy5baW50ZXJuYWxzU3ltYm9sXT8uaGFuZGxlQm91bmRzLFxuICAgICAgICAgICAgICAgIHosXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgbmV4dE5vZGVJbnRlcm5hbHMuc2V0KG5vZGUuaWQsIGludGVybmFscyk7XG4gICAgfSk7XG4gICAgdXBkYXRlQWJzb2x1dGVOb2RlUG9zaXRpb25zKG5leHROb2RlSW50ZXJuYWxzLCBub2RlT3JpZ2luLCBwYXJlbnROb2Rlcyk7XG4gICAgcmV0dXJuIG5leHROb2RlSW50ZXJuYWxzO1xufVxuZnVuY3Rpb24gZml0VmlldyhnZXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgZ2V0Tm9kZXMsIHdpZHRoLCBoZWlnaHQsIG1pblpvb20sIG1heFpvb20sIGQzWm9vbSwgZDNTZWxlY3Rpb24sIGZpdFZpZXdPbkluaXREb25lLCBmaXRWaWV3T25Jbml0LCBub2RlT3JpZ2luLCB9ID0gZ2V0KCk7XG4gICAgY29uc3QgaXNJbml0aWFsRml0VmlldyA9IG9wdGlvbnMuaW5pdGlhbCAmJiAhZml0Vmlld09uSW5pdERvbmUgJiYgZml0Vmlld09uSW5pdDtcbiAgICBjb25zdCBkM2luaXRpYWxpemVkID0gZDNab29tICYmIGQzU2VsZWN0aW9uO1xuICAgIGlmIChkM2luaXRpYWxpemVkICYmIChpc0luaXRpYWxGaXRWaWV3IHx8ICFvcHRpb25zLmluaXRpYWwpKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gZ2V0Tm9kZXMoKS5maWx0ZXIoKG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUhpZGRlbk5vZGVzID8gbi53aWR0aCAmJiBuLmhlaWdodCA6ICFuLmhpZGRlbjtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlICYmIG9wdGlvbnMubm9kZXMuc29tZSgob3B0aW9uTm9kZSkgPT4gb3B0aW9uTm9kZS5pZCA9PT0gbi5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgbm9kZXNJbml0aWFsaXplZCA9IG5vZGVzLmV2ZXJ5KChuKSA9PiBuLndpZHRoICYmIG4uaGVpZ2h0KTtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDAgJiYgbm9kZXNJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHMobm9kZXMsIG5vZGVPcmlnaW4pO1xuICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB6b29tIH0gPSBnZXRWaWV3cG9ydEZvckJvdW5kcyhib3VuZHMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMubWluWm9vbSA/PyBtaW5ab29tLCBvcHRpb25zLm1heFpvb20gPz8gbWF4Wm9vbSwgb3B0aW9ucy5wYWRkaW5nID8/IDAuMSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0VHJhbnNmb3JtID0gem9vbUlkZW50aXR5LnRyYW5zbGF0ZSh4LCB5KS5zY2FsZSh6b29tKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kdXJhdGlvbiA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICBkM1pvb20udHJhbnNmb3JtKGdldEQzVHJhbnNpdGlvbihkM1NlbGVjdGlvbiwgb3B0aW9ucy5kdXJhdGlvbiksIG5leHRUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZDNab29tLnRyYW5zZm9ybShkM1NlbGVjdGlvbiwgbmV4dFRyYW5zZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkTm9kZVNlbGVjdGlvbkNoYW5nZShub2RlQ2hhbmdlcywgbm9kZUludGVybmFscykge1xuICAgIG5vZGVDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZUludGVybmFscy5nZXQoY2hhbmdlLmlkKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVJbnRlcm5hbHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgICAgIFtpbnRlcm5hbHNTeW1ib2xdOiBub2RlW2ludGVybmFsc1N5bWJvbF0sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGNoYW5nZS5zZWxlY3RlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBNYXAobm9kZUludGVybmFscyk7XG59XG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkRWRnZVNlbGVjdGlvbkNoYW5nZShlZGdlQ2hhbmdlcywgZWRnZXMpIHtcbiAgICByZXR1cm4gZWRnZXMubWFwKChlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IGVkZ2VDaGFuZ2VzLmZpbmQoKGNoYW5nZSkgPT4gY2hhbmdlLmlkID09PSBlLmlkKTtcbiAgICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICAgICAgZS5zZWxlY3RlZCA9IGNoYW5nZS5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZU5vZGVzQW5kRWRnZXNTZWxlY3Rpb25zKHsgY2hhbmdlZE5vZGVzLCBjaGFuZ2VkRWRnZXMsIGdldCwgc2V0IH0pIHtcbiAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIGVkZ2VzLCBvbk5vZGVzQ2hhbmdlLCBvbkVkZ2VzQ2hhbmdlLCBoYXNEZWZhdWx0Tm9kZXMsIGhhc0RlZmF1bHRFZGdlcyB9ID0gZ2V0KCk7XG4gICAgaWYgKGNoYW5nZWROb2Rlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGlmIChoYXNEZWZhdWx0Tm9kZXMpIHtcbiAgICAgICAgICAgIHNldCh7IG5vZGVJbnRlcm5hbHM6IGhhbmRsZUNvbnRyb2xsZWROb2RlU2VsZWN0aW9uQ2hhbmdlKGNoYW5nZWROb2Rlcywgbm9kZUludGVybmFscykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgb25Ob2Rlc0NoYW5nZT8uKGNoYW5nZWROb2Rlcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkRWRnZXM/Lmxlbmd0aCkge1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEVkZ2VzKSB7XG4gICAgICAgICAgICBzZXQoeyBlZGdlczogaGFuZGxlQ29udHJvbGxlZEVkZ2VTZWxlY3Rpb25DaGFuZ2UoY2hhbmdlZEVkZ2VzLCBlZGdlcykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgb25FZGdlc0NoYW5nZT8uKGNoYW5nZWRFZGdlcyk7XG4gICAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuY29uc3QgaW5pdGlhbFZpZXdwb3J0SGVscGVyID0ge1xuICAgIHpvb21Jbjogbm9vcCxcbiAgICB6b29tT3V0OiBub29wLFxuICAgIHpvb21Ubzogbm9vcCxcbiAgICBnZXRab29tOiAoKSA9PiAxLFxuICAgIHNldFZpZXdwb3J0OiBub29wLFxuICAgIGdldFZpZXdwb3J0OiAoKSA9PiAoeyB4OiAwLCB5OiAwLCB6b29tOiAxIH0pLFxuICAgIGZpdFZpZXc6ICgpID0+IGZhbHNlLFxuICAgIHNldENlbnRlcjogbm9vcCxcbiAgICBmaXRCb3VuZHM6IG5vb3AsXG4gICAgcHJvamVjdDogKHBvc2l0aW9uKSA9PiBwb3NpdGlvbixcbiAgICBzY3JlZW5Ub0Zsb3dQb3NpdGlvbjogKHBvc2l0aW9uKSA9PiBwb3NpdGlvbixcbiAgICBmbG93VG9TY3JlZW5Qb3NpdGlvbjogKHBvc2l0aW9uKSA9PiBwb3NpdGlvbixcbiAgICB2aWV3cG9ydEluaXRpYWxpemVkOiBmYWxzZSxcbn07XG5jb25zdCBzZWxlY3RvciRiID0gKHMpID0+ICh7XG4gICAgZDNab29tOiBzLmQzWm9vbSxcbiAgICBkM1NlbGVjdGlvbjogcy5kM1NlbGVjdGlvbixcbn0pO1xuY29uc3QgdXNlVmlld3BvcnRIZWxwZXIgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IHsgZDNab29tLCBkM1NlbGVjdGlvbiB9ID0gdXNlU3RvcmUoc2VsZWN0b3IkYiwgc2hhbGxvdyk7XG4gICAgY29uc3Qgdmlld3BvcnRIZWxwZXJGdW5jdGlvbnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKGQzU2VsZWN0aW9uICYmIGQzWm9vbSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB6b29tSW46IChvcHRpb25zKSA9PiBkM1pvb20uc2NhbGVCeShnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgMS4yKSxcbiAgICAgICAgICAgICAgICB6b29tT3V0OiAob3B0aW9ucykgPT4gZDNab29tLnNjYWxlQnkoZ2V0RDNUcmFuc2l0aW9uKGQzU2VsZWN0aW9uLCBvcHRpb25zPy5kdXJhdGlvbiksIDEgLyAxLjIpLFxuICAgICAgICAgICAgICAgIHpvb21UbzogKHpvb21MZXZlbCwgb3B0aW9ucykgPT4gZDNab29tLnNjYWxlVG8oZ2V0RDNUcmFuc2l0aW9uKGQzU2VsZWN0aW9uLCBvcHRpb25zPy5kdXJhdGlvbiksIHpvb21MZXZlbCksXG4gICAgICAgICAgICAgICAgZ2V0Wm9vbTogKCkgPT4gc3RvcmUuZ2V0U3RhdGUoKS50cmFuc2Zvcm1bMl0sXG4gICAgICAgICAgICAgICAgc2V0Vmlld3BvcnQ6ICh0cmFuc2Zvcm0sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW3gsIHksIHpvb21dID0gc3RvcmUuZ2V0U3RhdGUoKS50cmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRUcmFuc2Zvcm0gPSB6b29tSWRlbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2xhdGUodHJhbnNmb3JtLnggPz8geCwgdHJhbnNmb3JtLnkgPz8geSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zY2FsZSh0cmFuc2Zvcm0uem9vbSA/PyB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgZDNab29tLnRyYW5zZm9ybShnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgbmV4dFRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgem9vbV0gPSBzdG9yZS5nZXRTdGF0ZSgpLnRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeCwgeSwgem9vbSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZml0VmlldzogKG9wdGlvbnMpID0+IGZpdFZpZXcoc3RvcmUuZ2V0U3RhdGUsIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIHNldENlbnRlcjogKHgsIHksIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBtYXhab29tIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Wm9vbSA9IHR5cGVvZiBvcHRpb25zPy56b29tICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuem9vbSA6IG1heFpvb207XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlclggPSB3aWR0aCAvIDIgLSB4ICogbmV4dFpvb207XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlclkgPSBoZWlnaHQgLyAyIC0geSAqIG5leHRab29tO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB6b29tSWRlbnRpdHkudHJhbnNsYXRlKGNlbnRlclgsIGNlbnRlclkpLnNjYWxlKG5leHRab29tKTtcbiAgICAgICAgICAgICAgICAgICAgZDNab29tLnRyYW5zZm9ybShnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgdHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpdEJvdW5kczogKGJvdW5kcywgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIG1pblpvb20sIG1heFpvb20gfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgem9vbSB9ID0gZ2V0Vmlld3BvcnRGb3JCb3VuZHMoYm91bmRzLCB3aWR0aCwgaGVpZ2h0LCBtaW5ab29tLCBtYXhab29tLCBvcHRpb25zPy5wYWRkaW5nID8/IDAuMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHpvb21JZGVudGl0eS50cmFuc2xhdGUoeCwgeSkuc2NhbGUoem9vbSk7XG4gICAgICAgICAgICAgICAgICAgIGQzWm9vbS50cmFuc2Zvcm0oZ2V0RDNUcmFuc2l0aW9uKGQzU2VsZWN0aW9uLCBvcHRpb25zPy5kdXJhdGlvbiksIHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBAZGVwcmVjYXRlZCBVc2UgYHNjcmVlblRvRmxvd1Bvc2l0aW9uYC5cbiAgICAgICAgICAgICAgICBwcm9qZWN0OiAocG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm0sIHNuYXBUb0dyaWQsIHNuYXBHcmlkIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tERVBSRUNBVEVEXSBgcHJvamVjdGAgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgYHNjcmVlblRvRmxvd1Bvc2l0aW9uYC4gVGhlcmUgaXMgbm8gbmVlZCB0byBzdWJ0cmFjdCB0aGUgcmVhY3QgZmxvdyBib3VuZHMgYW55bW9yZSEgaHR0cHM6Ly9yZWFjdGZsb3cuZGV2L2FwaS1yZWZlcmVuY2UvdHlwZXMvcmVhY3QtZmxvdy1pbnN0YW5jZSNzY3JlZW4tdG8tZmxvdy1wb3NpdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRUb1JlbmRlcmVyUG9pbnQocG9zaXRpb24sIHRyYW5zZm9ybSwgc25hcFRvR3JpZCwgc25hcEdyaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2NyZWVuVG9GbG93UG9zaXRpb246IChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybSwgc25hcFRvR3JpZCwgc25hcEdyaWQsIGRvbU5vZGUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeDogZG9tWCwgeTogZG9tWSB9ID0gZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHBvc2l0aW9uLnggLSBkb21YLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogcG9zaXRpb24ueSAtIGRvbVksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb2ludFRvUmVuZGVyZXJQb2ludChyZWxhdGl2ZVBvc2l0aW9uLCB0cmFuc2Zvcm0sIHNuYXBUb0dyaWQsIHNuYXBHcmlkKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZsb3dUb1NjcmVlblBvc2l0aW9uOiAocG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm0sIGRvbU5vZGUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeDogZG9tWCwgeTogZG9tWSB9ID0gZG9tTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZXJQb3NpdGlvbiA9IHJlbmRlcmVyUG9pbnRUb1BvaW50KHBvc2l0aW9uLCB0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogcmVuZGVyZXJQb3NpdGlvbi54ICsgZG9tWCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHJlbmRlcmVyUG9zaXRpb24ueSArIGRvbVksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydEluaXRpYWxpemVkOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5pdGlhbFZpZXdwb3J0SGVscGVyO1xuICAgIH0sIFtkM1pvb20sIGQzU2VsZWN0aW9uXSk7XG4gICAgcmV0dXJuIHZpZXdwb3J0SGVscGVyRnVuY3Rpb25zO1xufTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmZ1bmN0aW9uIHVzZVJlYWN0RmxvdygpIHtcbiAgICBjb25zdCB2aWV3cG9ydEhlbHBlciA9IHVzZVZpZXdwb3J0SGVscGVyKCk7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IGdldE5vZGVzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICByZXR1cm4gc3RvcmVcbiAgICAgICAgICAgIC5nZXRTdGF0ZSgpXG4gICAgICAgICAgICAuZ2V0Tm9kZXMoKVxuICAgICAgICAgICAgLm1hcCgobikgPT4gKHsgLi4ubiB9KSk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGdldE5vZGUgPSB1c2VDYWxsYmFjaygoaWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmdldFN0YXRlKCkubm9kZUludGVybmFscy5nZXQoaWQpO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBnZXRFZGdlcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgY29uc3QgeyBlZGdlcyA9IFtdIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gZWRnZXMubWFwKChlKSA9PiAoeyAuLi5lIH0pKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgZ2V0RWRnZSA9IHVzZUNhbGxiYWNrKChpZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVkZ2VzID0gW10gfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBlZGdlcy5maW5kKChlKSA9PiBlLmlkID09PSBpZCk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IHNldE5vZGVzID0gdXNlQ2FsbGJhY2soKHBheWxvYWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBnZXROb2Rlcywgc2V0Tm9kZXMsIGhhc0RlZmF1bHROb2Rlcywgb25Ob2Rlc0NoYW5nZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBnZXROb2RlcygpO1xuICAgICAgICBjb25zdCBuZXh0Tm9kZXMgPSB0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyA/IHBheWxvYWQobm9kZXMpIDogcGF5bG9hZDtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHROb2Rlcykge1xuICAgICAgICAgICAgc2V0Tm9kZXMobmV4dE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvbk5vZGVzQ2hhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gbmV4dE5vZGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gbm9kZXMubWFwKChub2RlKSA9PiAoeyB0eXBlOiAncmVtb3ZlJywgaWQ6IG5vZGUuaWQgfSkpXG4gICAgICAgICAgICAgICAgOiBuZXh0Tm9kZXMubWFwKChub2RlKSA9PiAoeyBpdGVtOiBub2RlLCB0eXBlOiAncmVzZXQnIH0pKTtcbiAgICAgICAgICAgIG9uTm9kZXNDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgY29uc3Qgc2V0RWRnZXMgPSB1c2VDYWxsYmFjaygocGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVkZ2VzID0gW10sIHNldEVkZ2VzLCBoYXNEZWZhdWx0RWRnZXMsIG9uRWRnZXNDaGFuZ2UgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5leHRFZGdlcyA9IHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nID8gcGF5bG9hZChlZGdlcykgOiBwYXlsb2FkO1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEVkZ2VzKSB7XG4gICAgICAgICAgICBzZXRFZGdlcyhuZXh0RWRnZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9uRWRnZXNDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBuZXh0RWRnZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBlZGdlcy5tYXAoKGVkZ2UpID0+ICh7IHR5cGU6ICdyZW1vdmUnLCBpZDogZWRnZS5pZCB9KSlcbiAgICAgICAgICAgICAgICA6IG5leHRFZGdlcy5tYXAoKGVkZ2UpID0+ICh7IGl0ZW06IGVkZ2UsIHR5cGU6ICdyZXNldCcgfSkpO1xuICAgICAgICAgICAgb25FZGdlc0NoYW5nZShjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICBjb25zdCBhZGROb2RlcyA9IHVzZUNhbGxiYWNrKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF07XG4gICAgICAgIGNvbnN0IHsgZ2V0Tm9kZXMsIHNldE5vZGVzLCBoYXNEZWZhdWx0Tm9kZXMsIG9uTm9kZXNDaGFuZ2UgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGlmIChoYXNEZWZhdWx0Tm9kZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlcyA9IGdldE5vZGVzKCk7XG4gICAgICAgICAgICBjb25zdCBuZXh0Tm9kZXMgPSBbLi4uY3VycmVudE5vZGVzLCAuLi5ub2Rlc107XG4gICAgICAgICAgICBzZXROb2RlcyhuZXh0Tm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9uTm9kZXNDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub2Rlcy5tYXAoKG5vZGUpID0+ICh7IGl0ZW06IG5vZGUsIHR5cGU6ICdhZGQnIH0pKTtcbiAgICAgICAgICAgIG9uTm9kZXNDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgY29uc3QgYWRkRWRnZXMgPSB1c2VDYWxsYmFjaygocGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0RWRnZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXTtcbiAgICAgICAgY29uc3QgeyBlZGdlcyA9IFtdLCBzZXRFZGdlcywgaGFzRGVmYXVsdEVkZ2VzLCBvbkVkZ2VzQ2hhbmdlIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoaGFzRGVmYXVsdEVkZ2VzKSB7XG4gICAgICAgICAgICBzZXRFZGdlcyhbLi4uZWRnZXMsIC4uLm5leHRFZGdlc10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9uRWRnZXNDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBuZXh0RWRnZXMubWFwKChlZGdlKSA9PiAoeyBpdGVtOiBlZGdlLCB0eXBlOiAnYWRkJyB9KSk7XG4gICAgICAgICAgICBvbkVkZ2VzQ2hhbmdlKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IHRvT2JqZWN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGdldE5vZGVzLCBlZGdlcyA9IFtdLCB0cmFuc2Zvcm0gfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IFt4LCB5LCB6b29tXSA9IHRyYW5zZm9ybTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVzOiBnZXROb2RlcygpLm1hcCgobikgPT4gKHsgLi4ubiB9KSksXG4gICAgICAgICAgICBlZGdlczogZWRnZXMubWFwKChlKSA9PiAoeyAuLi5lIH0pKSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBkZWxldGVFbGVtZW50cyA9IHVzZUNhbGxiYWNrKCh7IG5vZGVzOiBub2Rlc0RlbGV0ZWQsIGVkZ2VzOiBlZGdlc0RlbGV0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIGdldE5vZGVzLCBlZGdlcywgaGFzRGVmYXVsdE5vZGVzLCBoYXNEZWZhdWx0RWRnZXMsIG9uTm9kZXNEZWxldGUsIG9uRWRnZXNEZWxldGUsIG9uTm9kZXNDaGFuZ2UsIG9uRWRnZXNDaGFuZ2UsIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBub2RlSWRzID0gKG5vZGVzRGVsZXRlZCB8fCBbXSkubWFwKChub2RlKSA9PiBub2RlLmlkKTtcbiAgICAgICAgY29uc3QgZWRnZUlkcyA9IChlZGdlc0RlbGV0ZWQgfHwgW10pLm1hcCgoZWRnZSkgPT4gZWRnZS5pZCk7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9SZW1vdmUgPSBnZXROb2RlcygpLnJlZHVjZSgocmVzLCBub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudElkO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50SGl0ID0gIW5vZGVJZHMuaW5jbHVkZXMobm9kZS5pZCkgJiYgcGFyZW50SWQgJiYgcmVzLmZpbmQoKG4pID0+IG4uaWQgPT09IHBhcmVudElkKTtcbiAgICAgICAgICAgIGNvbnN0IGRlbGV0YWJsZSA9IHR5cGVvZiBub2RlLmRlbGV0YWJsZSA9PT0gJ2Jvb2xlYW4nID8gbm9kZS5kZWxldGFibGUgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGRlbGV0YWJsZSAmJiAobm9kZUlkcy5pbmNsdWRlcyhub2RlLmlkKSB8fCBwYXJlbnRIaXQpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGNvbnN0IGRlbGV0YWJsZUVkZ2VzID0gZWRnZXMuZmlsdGVyKChlKSA9PiAodHlwZW9mIGUuZGVsZXRhYmxlID09PSAnYm9vbGVhbicgPyBlLmRlbGV0YWJsZSA6IHRydWUpKTtcbiAgICAgICAgY29uc3QgaW5pdGlhbEhpdEVkZ2VzID0gZGVsZXRhYmxlRWRnZXMuZmlsdGVyKChlKSA9PiBlZGdlSWRzLmluY2x1ZGVzKGUuaWQpKTtcbiAgICAgICAgaWYgKG5vZGVzVG9SZW1vdmUgfHwgaW5pdGlhbEhpdEVkZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0ZWRFZGdlcyA9IGdldENvbm5lY3RlZEVkZ2VzKG5vZGVzVG9SZW1vdmUsIGRlbGV0YWJsZUVkZ2VzKTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VzVG9SZW1vdmUgPSBbLi4uaW5pdGlhbEhpdEVkZ2VzLCAuLi5jb25uZWN0ZWRFZGdlc107XG4gICAgICAgICAgICBjb25zdCBlZGdlSWRzVG9SZW1vdmUgPSBlZGdlc1RvUmVtb3ZlLnJlZHVjZSgocmVzLCBlZGdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMuaW5jbHVkZXMoZWRnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goZWRnZS5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICBpZiAoaGFzRGVmYXVsdEVkZ2VzIHx8IGhhc0RlZmF1bHROb2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZWRnZXM6IGVkZ2VzLmZpbHRlcigoZSkgPT4gIWVkZ2VJZHNUb1JlbW92ZS5pbmNsdWRlcyhlLmlkKSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVmYXVsdE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzVG9SZW1vdmUuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUludGVybmFscy5kZWxldGUobm9kZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzOiBuZXcgTWFwKG5vZGVJbnRlcm5hbHMpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWRnZUlkc1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBvbkVkZ2VzRGVsZXRlPy4oZWRnZXNUb1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9uRWRnZXNDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FZGdlc0NoYW5nZShlZGdlSWRzVG9SZW1vdmUubWFwKChpZCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlbW92ZScsXG4gICAgICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVzVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG9uTm9kZXNEZWxldGU/Lihub2Rlc1RvUmVtb3ZlKTtcbiAgICAgICAgICAgICAgICBpZiAob25Ob2Rlc0NoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlQ2hhbmdlcyA9IG5vZGVzVG9SZW1vdmUubWFwKChuKSA9PiAoeyBpZDogbi5pZCwgdHlwZTogJ3JlbW92ZScgfSkpO1xuICAgICAgICAgICAgICAgICAgICBvbk5vZGVzQ2hhbmdlKG5vZGVDaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgY29uc3QgZ2V0Tm9kZVJlY3QgPSB1c2VDYWxsYmFjaygobm9kZU9yUmVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpc1JlY3QgPSBpc1JlY3RPYmplY3Qobm9kZU9yUmVjdCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBpc1JlY3QgPyBudWxsIDogc3RvcmUuZ2V0U3RhdGUoKS5ub2RlSW50ZXJuYWxzLmdldChub2RlT3JSZWN0LmlkKTtcbiAgICAgICAgaWYgKCFpc1JlY3QgJiYgIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbCwgaXNSZWN0XTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlUmVjdCA9IGlzUmVjdCA/IG5vZGVPclJlY3QgOiBub2RlVG9SZWN0KG5vZGUpO1xuICAgICAgICByZXR1cm4gW25vZGVSZWN0LCBub2RlLCBpc1JlY3RdO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBnZXRJbnRlcnNlY3RpbmdOb2RlcyA9IHVzZUNhbGxiYWNrKChub2RlT3JSZWN0LCBwYXJ0aWFsbHkgPSB0cnVlLCBub2RlcykgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZVJlY3QsIG5vZGUsIGlzUmVjdF0gPSBnZXROb2RlUmVjdChub2RlT3JSZWN0KTtcbiAgICAgICAgaWYgKCFub2RlUmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobm9kZXMgfHwgc3RvcmUuZ2V0U3RhdGUoKS5nZXROb2RlcygpKS5maWx0ZXIoKG4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNSZWN0ICYmIChuLmlkID09PSBub2RlLmlkIHx8ICFuLnBvc2l0aW9uQWJzb2x1dGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3Vyck5vZGVSZWN0ID0gbm9kZVRvUmVjdChuKTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQXJlYSA9IGdldE92ZXJsYXBwaW5nQXJlYShjdXJyTm9kZVJlY3QsIG5vZGVSZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxseVZpc2libGUgPSBwYXJ0aWFsbHkgJiYgb3ZlcmxhcHBpbmdBcmVhID4gMDtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsbHlWaXNpYmxlIHx8IG92ZXJsYXBwaW5nQXJlYSA+PSBub2RlUmVjdC53aWR0aCAqIG5vZGVSZWN0LmhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGlzTm9kZUludGVyc2VjdGluZyA9IHVzZUNhbGxiYWNrKChub2RlT3JSZWN0LCBhcmVhLCBwYXJ0aWFsbHkgPSB0cnVlKSA9PiB7XG4gICAgICAgIGNvbnN0IFtub2RlUmVjdF0gPSBnZXROb2RlUmVjdChub2RlT3JSZWN0KTtcbiAgICAgICAgaWYgKCFub2RlUmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQXJlYSA9IGdldE92ZXJsYXBwaW5nQXJlYShub2RlUmVjdCwgYXJlYSk7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxseVZpc2libGUgPSBwYXJ0aWFsbHkgJiYgb3ZlcmxhcHBpbmdBcmVhID4gMDtcbiAgICAgICAgcmV0dXJuIHBhcnRpYWxseVZpc2libGUgfHwgb3ZlcmxhcHBpbmdBcmVhID49IG5vZGVSZWN0LndpZHRoICogbm9kZVJlY3QuaGVpZ2h0O1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi52aWV3cG9ydEhlbHBlcixcbiAgICAgICAgICAgIGdldE5vZGVzLFxuICAgICAgICAgICAgZ2V0Tm9kZSxcbiAgICAgICAgICAgIGdldEVkZ2VzLFxuICAgICAgICAgICAgZ2V0RWRnZSxcbiAgICAgICAgICAgIHNldE5vZGVzLFxuICAgICAgICAgICAgc2V0RWRnZXMsXG4gICAgICAgICAgICBhZGROb2RlcyxcbiAgICAgICAgICAgIGFkZEVkZ2VzLFxuICAgICAgICAgICAgdG9PYmplY3QsXG4gICAgICAgICAgICBkZWxldGVFbGVtZW50cyxcbiAgICAgICAgICAgIGdldEludGVyc2VjdGluZ05vZGVzLFxuICAgICAgICAgICAgaXNOb2RlSW50ZXJzZWN0aW5nLFxuICAgICAgICB9O1xuICAgIH0sIFtcbiAgICAgICAgdmlld3BvcnRIZWxwZXIsXG4gICAgICAgIGdldE5vZGVzLFxuICAgICAgICBnZXROb2RlLFxuICAgICAgICBnZXRFZGdlcyxcbiAgICAgICAgZ2V0RWRnZSxcbiAgICAgICAgc2V0Tm9kZXMsXG4gICAgICAgIHNldEVkZ2VzLFxuICAgICAgICBhZGROb2RlcyxcbiAgICAgICAgYWRkRWRnZXMsXG4gICAgICAgIHRvT2JqZWN0LFxuICAgICAgICBkZWxldGVFbGVtZW50cyxcbiAgICAgICAgZ2V0SW50ZXJzZWN0aW5nTm9kZXMsXG4gICAgICAgIGlzTm9kZUludGVyc2VjdGluZyxcbiAgICBdKTtcbn1cblxuY29uc3QgZGVsZXRlS2V5T3B0aW9ucyA9IHsgYWN0SW5zaWRlSW5wdXRXaXRoTW9kaWZpZXI6IGZhbHNlIH07XG52YXIgdXNlR2xvYmFsS2V5SGFuZGxlciA9ICh7IGRlbGV0ZUtleUNvZGUsIG11bHRpU2VsZWN0aW9uS2V5Q29kZSB9KSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IHsgZGVsZXRlRWxlbWVudHMgfSA9IHVzZVJlYWN0RmxvdygpO1xuICAgIGNvbnN0IGRlbGV0ZUtleVByZXNzZWQgPSB1c2VLZXlQcmVzcyhkZWxldGVLZXlDb2RlLCBkZWxldGVLZXlPcHRpb25zKTtcbiAgICBjb25zdCBtdWx0aVNlbGVjdGlvbktleVByZXNzZWQgPSB1c2VLZXlQcmVzcyhtdWx0aVNlbGVjdGlvbktleUNvZGUpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChkZWxldGVLZXlQcmVzc2VkKSB7XG4gICAgICAgICAgICBjb25zdCB7IGVkZ2VzLCBnZXROb2RlcyB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSBnZXROb2RlcygpLmZpbHRlcigobm9kZSkgPT4gbm9kZS5zZWxlY3RlZCk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVkZ2VzID0gZWRnZXMuZmlsdGVyKChlZGdlKSA9PiBlZGdlLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIGRlbGV0ZUVsZW1lbnRzKHsgbm9kZXM6IHNlbGVjdGVkTm9kZXMsIGVkZ2VzOiBzZWxlY3RlZEVkZ2VzIH0pO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbZGVsZXRlS2V5UHJlc3NlZF0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgbXVsdGlTZWxlY3Rpb25BY3RpdmU6IG11bHRpU2VsZWN0aW9uS2V5UHJlc3NlZCB9KTtcbiAgICB9LCBbbXVsdGlTZWxlY3Rpb25LZXlQcmVzc2VkXSk7XG59O1xuXG5mdW5jdGlvbiB1c2VSZXNpemVIYW5kbGVyKHJlbmRlcmVyTm9kZSkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsZXQgcmVzaXplT2JzZXJ2ZXI7XG4gICAgICAgIGNvbnN0IHVwZGF0ZURpbWVuc2lvbnMgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlbmRlcmVyTm9kZS5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGdldERpbWVuc2lvbnMocmVuZGVyZXJOb2RlLmN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKHNpemUuaGVpZ2h0ID09PSAwIHx8IHNpemUud2lkdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5nZXRTdGF0ZSgpLm9uRXJyb3I/LignMDA0JywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDQnXSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgd2lkdGg6IHNpemUud2lkdGggfHwgNTAwLCBoZWlnaHQ6IHNpemUuaGVpZ2h0IHx8IDUwMCB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlRGltZW5zaW9ucygpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlRGltZW5zaW9ucyk7XG4gICAgICAgIGlmIChyZW5kZXJlck5vZGUuY3VycmVudCkge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlRGltZW5zaW9ucygpKTtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVuZGVyZXJOb2RlLmN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlRGltZW5zaW9ucyk7XG4gICAgICAgICAgICBpZiAocmVzaXplT2JzZXJ2ZXIgJiYgcmVuZGVyZXJOb2RlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUocmVuZGVyZXJOb2RlLmN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbn1cblxuY29uc3QgY29udGFpbmVyU3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuY29uc3Qgdmlld0NoYW5nZWQgPSAocHJldlZpZXdwb3J0LCBldmVudFRyYW5zZm9ybSkgPT4gcHJldlZpZXdwb3J0LnggIT09IGV2ZW50VHJhbnNmb3JtLnggfHwgcHJldlZpZXdwb3J0LnkgIT09IGV2ZW50VHJhbnNmb3JtLnkgfHwgcHJldlZpZXdwb3J0Lnpvb20gIT09IGV2ZW50VHJhbnNmb3JtLms7XG5jb25zdCBldmVudFRvRmxvd1RyYW5zZm9ybSA9IChldmVudFRyYW5zZm9ybSkgPT4gKHtcbiAgICB4OiBldmVudFRyYW5zZm9ybS54LFxuICAgIHk6IGV2ZW50VHJhbnNmb3JtLnksXG4gICAgem9vbTogZXZlbnRUcmFuc2Zvcm0uayxcbn0pO1xuY29uc3QgaXNXcmFwcGVkV2l0aENsYXNzID0gKGV2ZW50LCBjbGFzc05hbWUpID0+IGV2ZW50LnRhcmdldC5jbG9zZXN0KGAuJHtjbGFzc05hbWV9YCk7XG5jb25zdCBpc1JpZ2h0Q2xpY2tQYW4gPSAocGFuT25EcmFnLCB1c2VkQnV0dG9uKSA9PiB1c2VkQnV0dG9uID09PSAyICYmIEFycmF5LmlzQXJyYXkocGFuT25EcmFnKSAmJiBwYW5PbkRyYWcuaW5jbHVkZXMoMik7XG5jb25zdCB3aGVlbERlbHRhID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmFjdG9yID0gZXZlbnQuY3RybEtleSAmJiBpc01hY09zKCkgPyAxMCA6IDE7XG4gICAgcmV0dXJuIC1ldmVudC5kZWx0YVkgKiAoZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMC4wNSA6IGV2ZW50LmRlbHRhTW9kZSA/IDEgOiAwLjAwMikgKiBmYWN0b3I7XG59O1xuY29uc3Qgc2VsZWN0b3IkYSA9IChzKSA9PiAoe1xuICAgIGQzWm9vbTogcy5kM1pvb20sXG4gICAgZDNTZWxlY3Rpb246IHMuZDNTZWxlY3Rpb24sXG4gICAgZDNab29tSGFuZGxlcjogcy5kM1pvb21IYW5kbGVyLFxuICAgIHVzZXJTZWxlY3Rpb25BY3RpdmU6IHMudXNlclNlbGVjdGlvbkFjdGl2ZSxcbn0pO1xuY29uc3QgWm9vbVBhbmUgPSAoeyBvbk1vdmUsIG9uTW92ZVN0YXJ0LCBvbk1vdmVFbmQsIG9uUGFuZUNvbnRleHRNZW51LCB6b29tT25TY3JvbGwgPSB0cnVlLCB6b29tT25QaW5jaCA9IHRydWUsIHBhbk9uU2Nyb2xsID0gZmFsc2UsIHBhbk9uU2Nyb2xsU3BlZWQgPSAwLjUsIHBhbk9uU2Nyb2xsTW9kZSA9IFBhbk9uU2Nyb2xsTW9kZS5GcmVlLCB6b29tT25Eb3VibGVDbGljayA9IHRydWUsIGVsZW1lbnRzU2VsZWN0YWJsZSwgcGFuT25EcmFnID0gdHJ1ZSwgZGVmYXVsdFZpZXdwb3J0LCB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb20sIG1heFpvb20sIHpvb21BY3RpdmF0aW9uS2V5Q29kZSwgcHJldmVudFNjcm9sbGluZyA9IHRydWUsIGNoaWxkcmVuLCBub1doZWVsQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZSwgfSkgPT4ge1xuICAgIGNvbnN0IHRpbWVySWQgPSB1c2VSZWYoKTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgaXNab29taW5nT3JQYW5uaW5nID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCB6b29tZWRXaXRoUmlnaHRNb3VzZUJ1dHRvbiA9IHVzZVJlZihmYWxzZSk7XG4gICAgY29uc3Qgem9vbVBhbmUgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgcHJldlRyYW5zZm9ybSA9IHVzZVJlZih7IHg6IDAsIHk6IDAsIHpvb206IDAgfSk7XG4gICAgY29uc3QgeyBkM1pvb20sIGQzU2VsZWN0aW9uLCBkM1pvb21IYW5kbGVyLCB1c2VyU2VsZWN0aW9uQWN0aXZlIH0gPSB1c2VTdG9yZShzZWxlY3RvciRhLCBzaGFsbG93KTtcbiAgICBjb25zdCB6b29tQWN0aXZhdGlvbktleVByZXNzZWQgPSB1c2VLZXlQcmVzcyh6b29tQWN0aXZhdGlvbktleUNvZGUpO1xuICAgIGNvbnN0IG1vdXNlQnV0dG9uID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IGlzUGFuU2Nyb2xsaW5nID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBwYW5TY3JvbGxUaW1lb3V0ID0gdXNlUmVmKCk7XG4gICAgdXNlUmVzaXplSGFuZGxlcih6b29tUGFuZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHpvb21QYW5lLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSB6b29tUGFuZS5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgZDNab29tSW5zdGFuY2UgPSB6b29tKCkuc2NhbGVFeHRlbnQoW21pblpvb20sIG1heFpvb21dKS50cmFuc2xhdGVFeHRlbnQodHJhbnNsYXRlRXh0ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdCh6b29tUGFuZS5jdXJyZW50KS5jYWxsKGQzWm9vbUluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUcmFuc2Zvcm0gPSB6b29tSWRlbnRpdHlcbiAgICAgICAgICAgICAgICAudHJhbnNsYXRlKGRlZmF1bHRWaWV3cG9ydC54LCBkZWZhdWx0Vmlld3BvcnQueSlcbiAgICAgICAgICAgICAgICAuc2NhbGUoY2xhbXAoZGVmYXVsdFZpZXdwb3J0Lnpvb20sIG1pblpvb20sIG1heFpvb20pKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVudCA9IFtcbiAgICAgICAgICAgICAgICBbMCwgMF0sXG4gICAgICAgICAgICAgICAgW2Jib3gud2lkdGgsIGJib3guaGVpZ2h0XSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBjb25zdHJhaW5lZFRyYW5zZm9ybSA9IGQzWm9vbUluc3RhbmNlLmNvbnN0cmFpbigpKHVwZGF0ZWRUcmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICAgICAgICAgIGQzWm9vbUluc3RhbmNlLnRyYW5zZm9ybShzZWxlY3Rpb24sIGNvbnN0cmFpbmVkVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIGQzWm9vbUluc3RhbmNlLndoZWVsRGVsdGEod2hlZWxEZWx0YSk7XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZDNab29tOiBkM1pvb21JbnN0YW5jZSxcbiAgICAgICAgICAgICAgICBkM1NlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGQzWm9vbUhhbmRsZXI6IHNlbGVjdGlvbi5vbignd2hlZWwuem9vbScpLFxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcGFzcyB0cmFuc2Zvcm0gYmVjYXVzZSB6b29tIGhhbmRsZXIgaXMgbm90IHJlZ2lzdGVyZWQgd2hlbiB3ZSBzZXQgdGhlIGluaXRpYWwgdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBbY29uc3RyYWluZWRUcmFuc2Zvcm0ueCwgY29uc3RyYWluZWRUcmFuc2Zvcm0ueSwgY29uc3RyYWluZWRUcmFuc2Zvcm0ua10sXG4gICAgICAgICAgICAgICAgZG9tTm9kZTogem9vbVBhbmUuY3VycmVudC5jbG9zZXN0KCcucmVhY3QtZmxvdycpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGQzU2VsZWN0aW9uICYmIGQzWm9vbSkge1xuICAgICAgICAgICAgaWYgKHBhbk9uU2Nyb2xsICYmICF6b29tQWN0aXZhdGlvbktleVByZXNzZWQgJiYgIXVzZXJTZWxlY3Rpb25BY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBkM1NlbGVjdGlvbi5vbignd2hlZWwuem9vbScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNXcmFwcGVkV2l0aENsYXNzKGV2ZW50LCBub1doZWVsQ2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Wm9vbSA9IGQzU2VsZWN0aW9uLnByb3BlcnR5KCdfX3pvb20nKS5rIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1hY29zIGFuZCB3aW4gc2V0IGN0cmxLZXk9dHJ1ZSBmb3IgcGluY2ggZ2VzdHVyZSBvbiBhIHRyYWNrcGFkXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5ICYmIHpvb21PblBpbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludCA9IHBvaW50ZXIoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGluY2hEZWx0YSA9IHdoZWVsRGVsdGEoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgem9vbSA9IGN1cnJlbnRab29tICogTWF0aC5wb3coMiwgcGluY2hEZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBkM1pvb20uc2NhbGVUbyhkM1NlbGVjdGlvbiwgem9vbSwgcG9pbnQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSBzY3JvbGwgc3BlZWQgaW4gZmlyZWZveFxuICAgICAgICAgICAgICAgICAgICAvLyBmaXJlZm94OiBkZWx0YU1vZGUgPT09IDE7IGNocm9tZTogZGVsdGFNb2RlID09PSAwXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhTm9ybWFsaXplID0gZXZlbnQuZGVsdGFNb2RlID09PSAxID8gMjAgOiAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVsdGFYID0gcGFuT25TY3JvbGxNb2RlID09PSBQYW5PblNjcm9sbE1vZGUuVmVydGljYWwgPyAwIDogZXZlbnQuZGVsdGFYICogZGVsdGFOb3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWx0YVkgPSBwYW5PblNjcm9sbE1vZGUgPT09IFBhbk9uU2Nyb2xsTW9kZS5Ib3Jpem9udGFsID8gMCA6IGV2ZW50LmRlbHRhWSAqIGRlbHRhTm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGVuYWJsZXMgdmVydGljYWwgc2Nyb2xsaW5nIHdpdGggc2hpZnQgKyBzY3JvbGwgb24gd2luZG93c1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTWFjT3MoKSAmJiBldmVudC5zaGlmdEtleSAmJiBwYW5PblNjcm9sbE1vZGUgIT09IFBhbk9uU2Nyb2xsTW9kZS5WZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFYID0gZXZlbnQuZGVsdGFZICogZGVsdGFOb3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGQzWm9vbS50cmFuc2xhdGVCeShkM1NlbGVjdGlvbiwgLShkZWx0YVggLyBjdXJyZW50Wm9vbSkgKiBwYW5PblNjcm9sbFNwZWVkLCAtKGRlbHRhWSAvIGN1cnJlbnRab29tKSAqIHBhbk9uU2Nyb2xsU3BlZWQsIFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHsgaW50ZXJuYWw6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRWaWV3cG9ydCA9IGV2ZW50VG9GbG93VHJhbnNmb3JtKGQzU2VsZWN0aW9uLnByb3BlcnR5KCdfX3pvb20nKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb25WaWV3cG9ydENoYW5nZVN0YXJ0LCBvblZpZXdwb3J0Q2hhbmdlLCBvblZpZXdwb3J0Q2hhbmdlRW5kIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocGFuU2Nyb2xsVGltZW91dC5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBhbiBvbiBzY3JvbGwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGV2ZW50IGNhbGxzIG9uIG91ciBvd25cbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIHRoZSBzdGFydCwgem9vbSBhbmQgZW5kIGV2ZW50cyBmcm9tIGQzLXpvb21cbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBzdGFydCBhbmQgbW92ZSBnZXRzIGNhbGxlZCBvbiBldmVyeSBzY3JvbGwgZXZlbnQgYW5kIG5vdCBvbmNlIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BhblNjcm9sbGluZy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1BhblNjcm9sbGluZy5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW92ZVN0YXJ0Py4oZXZlbnQsIG5leHRWaWV3cG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZpZXdwb3J0Q2hhbmdlU3RhcnQ/LihuZXh0Vmlld3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1BhblNjcm9sbGluZy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdmU/LihldmVudCwgbmV4dFZpZXdwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmlld3BvcnRDaGFuZ2U/LihuZXh0Vmlld3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuU2Nyb2xsVGltZW91dC5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3ZlRW5kPy4oZXZlbnQsIG5leHRWaWV3cG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WaWV3cG9ydENoYW5nZUVuZD8uKG5leHRWaWV3cG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYW5TY3JvbGxpbmcuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTUwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZDNab29tSGFuZGxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBkM1NlbGVjdGlvbi5vbignd2hlZWwuem9vbScsIGZ1bmN0aW9uIChldmVudCwgZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzdGlsbCB3YW50IHRvIGVuYWJsZSBwaW5jaCB6b29taW5nIGV2ZW4gaWYgcHJldmVudFNjcm9sbGluZyBpcyBzZXQgdG8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52YWxpZEV2ZW50ID0gIXByZXZlbnRTY3JvbGxpbmcgJiYgZXZlbnQudHlwZSA9PT0gJ3doZWVsJyAmJiAhZXZlbnQuY3RybEtleTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludmFsaWRFdmVudCB8fCBpc1dyYXBwZWRXaXRoQ2xhc3MoZXZlbnQsIG5vV2hlZWxDbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBkM1pvb21IYW5kbGVyLmNhbGwodGhpcywgZXZlbnQsIGQpO1xuICAgICAgICAgICAgICAgIH0sIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIHVzZXJTZWxlY3Rpb25BY3RpdmUsXG4gICAgICAgIHBhbk9uU2Nyb2xsLFxuICAgICAgICBwYW5PblNjcm9sbE1vZGUsXG4gICAgICAgIGQzU2VsZWN0aW9uLFxuICAgICAgICBkM1pvb20sXG4gICAgICAgIGQzWm9vbUhhbmRsZXIsXG4gICAgICAgIHpvb21BY3RpdmF0aW9uS2V5UHJlc3NlZCxcbiAgICAgICAgem9vbU9uUGluY2gsXG4gICAgICAgIHByZXZlbnRTY3JvbGxpbmcsXG4gICAgICAgIG5vV2hlZWxDbGFzc05hbWUsXG4gICAgICAgIG9uTW92ZVN0YXJ0LFxuICAgICAgICBvbk1vdmUsXG4gICAgICAgIG9uTW92ZUVuZCxcbiAgICBdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZDNab29tKSB7XG4gICAgICAgICAgICBkM1pvb20ub24oJ3N0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5zb3VyY2VFdmVudCB8fCBldmVudC5zb3VyY2VFdmVudC5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZW1lbWJlciBpdCBoZXJlLCBiZWNhdXNlIGl0J3MgYWx3YXlzIDAgaW4gdGhlIFwiem9vbVwiIGV2ZW50XG4gICAgICAgICAgICAgICAgbW91c2VCdXR0b24uY3VycmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50Py5idXR0b247XG4gICAgICAgICAgICAgICAgY29uc3QgeyBvblZpZXdwb3J0Q2hhbmdlU3RhcnQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxvd1RyYW5zZm9ybSA9IGV2ZW50VG9GbG93VHJhbnNmb3JtKGV2ZW50LnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgaXNab29taW5nT3JQYW5uaW5nLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByZXZUcmFuc2Zvcm0uY3VycmVudCA9IGZsb3dUcmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZUV2ZW50Py50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHBhbmVEcmFnZ2luZzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb25WaWV3cG9ydENoYW5nZVN0YXJ0Py4oZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgb25Nb3ZlU3RhcnQ/LihldmVudC5zb3VyY2VFdmVudCwgZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtkM1pvb20sIG9uTW92ZVN0YXJ0XSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGQzWm9vbSkge1xuICAgICAgICAgICAgaWYgKHVzZXJTZWxlY3Rpb25BY3RpdmUgJiYgIWlzWm9vbWluZ09yUGFubmluZy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgZDNab29tLm9uKCd6b29tJywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdXNlclNlbGVjdGlvbkFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGQzWm9vbS5vbignem9vbScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG9uVmlld3BvcnRDaGFuZ2UgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdHJhbnNmb3JtOiBbZXZlbnQudHJhbnNmb3JtLngsIGV2ZW50LnRyYW5zZm9ybS55LCBldmVudC50cmFuc2Zvcm0ua10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHpvb21lZFdpdGhSaWdodE1vdXNlQnV0dG9uLmN1cnJlbnQgPSAhIShvblBhbmVDb250ZXh0TWVudSAmJiBpc1JpZ2h0Q2xpY2tQYW4ocGFuT25EcmFnLCBtb3VzZUJ1dHRvbi5jdXJyZW50ID8/IDApKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChvbk1vdmUgfHwgb25WaWV3cG9ydENoYW5nZSkgJiYgIWV2ZW50LnNvdXJjZUV2ZW50Py5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvd1RyYW5zZm9ybSA9IGV2ZW50VG9GbG93VHJhbnNmb3JtKGV2ZW50LnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZpZXdwb3J0Q2hhbmdlPy4oZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdmU/LihldmVudC5zb3VyY2VFdmVudCwgZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFt1c2VyU2VsZWN0aW9uQWN0aXZlLCBkM1pvb20sIG9uTW92ZSwgcGFuT25EcmFnLCBvblBhbmVDb250ZXh0TWVudV0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChkM1pvb20pIHtcbiAgICAgICAgICAgIGQzWm9vbS5vbignZW5kJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFldmVudC5zb3VyY2VFdmVudCB8fCBldmVudC5zb3VyY2VFdmVudC5pbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBvblZpZXdwb3J0Q2hhbmdlRW5kIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGlzWm9vbWluZ09yUGFubmluZy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBwYW5lRHJhZ2dpbmc6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvblBhbmVDb250ZXh0TWVudSAmJlxuICAgICAgICAgICAgICAgICAgICBpc1JpZ2h0Q2xpY2tQYW4ocGFuT25EcmFnLCBtb3VzZUJ1dHRvbi5jdXJyZW50ID8/IDApICYmXG4gICAgICAgICAgICAgICAgICAgICF6b29tZWRXaXRoUmlnaHRNb3VzZUJ1dHRvbi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIG9uUGFuZUNvbnRleHRNZW51KGV2ZW50LnNvdXJjZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgem9vbWVkV2l0aFJpZ2h0TW91c2VCdXR0b24uY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICgob25Nb3ZlRW5kIHx8IG9uVmlld3BvcnRDaGFuZ2VFbmQpICYmIHZpZXdDaGFuZ2VkKHByZXZUcmFuc2Zvcm0uY3VycmVudCwgZXZlbnQudHJhbnNmb3JtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93VHJhbnNmb3JtID0gZXZlbnRUb0Zsb3dUcmFuc2Zvcm0oZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRyYW5zZm9ybS5jdXJyZW50ID0gZmxvd1RyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVySWQuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25WaWV3cG9ydENoYW5nZUVuZD8uKGZsb3dUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3ZlRW5kPy4oZXZlbnQuc291cmNlRXZlbnQsIGZsb3dUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICB9LCBwYW5PblNjcm9sbCA/IDE1MCA6IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwgW2QzWm9vbSwgcGFuT25TY3JvbGwsIHBhbk9uRHJhZywgb25Nb3ZlRW5kLCBvblBhbmVDb250ZXh0TWVudV0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChkM1pvb20pIHtcbiAgICAgICAgICAgIGQzWm9vbS5maWx0ZXIoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbVNjcm9sbCA9IHpvb21BY3RpdmF0aW9uS2V5UHJlc3NlZCB8fCB6b29tT25TY3JvbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcGluY2hab29tID0gem9vbU9uUGluY2ggJiYgZXZlbnQuY3RybEtleTtcbiAgICAgICAgICAgICAgICBpZiAoKHBhbk9uRHJhZyA9PT0gdHJ1ZSB8fCAoQXJyYXkuaXNBcnJheShwYW5PbkRyYWcpICYmIHBhbk9uRHJhZy5pbmNsdWRlcygxKSkpICYmXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmJ1dHRvbiA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBldmVudC50eXBlID09PSAnbW91c2Vkb3duJyAmJlxuICAgICAgICAgICAgICAgICAgICAoaXNXcmFwcGVkV2l0aENsYXNzKGV2ZW50LCAncmVhY3QtZmxvd19fbm9kZScpIHx8IGlzV3JhcHBlZFdpdGhDbGFzcyhldmVudCwgJ3JlYWN0LWZsb3dfX2VkZ2UnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIGFsbCBpbnRlcmFjdGlvbnMgYXJlIGRpc2FibGVkLCB3ZSBwcmV2ZW50IGFsbCB6b29tIGV2ZW50c1xuICAgICAgICAgICAgICAgIGlmICghcGFuT25EcmFnICYmICF6b29tU2Nyb2xsICYmICFwYW5PblNjcm9sbCAmJiAhem9vbU9uRG91YmxlQ2xpY2sgJiYgIXpvb21PblBpbmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZHVyaW5nIGEgc2VsZWN0aW9uIHdlIHByZXZlbnQgYWxsIG90aGVyIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIGlmICh1c2VyU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgem9vbSBvbiBkb3VibGUgY2xpY2sgaXMgZGlzYWJsZWQsIHdlIHByZXZlbnQgdGhlIGRvdWJsZSBjbGljayBldmVudFxuICAgICAgICAgICAgICAgIGlmICghem9vbU9uRG91YmxlQ2xpY2sgJiYgZXZlbnQudHlwZSA9PT0gJ2RibGNsaWNrJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBpbnNpZGUgYW4gZWxlbWVudCB3aXRoIHRoZSBub3doZWVsIGNsYXNzLCB3ZSBwcmV2ZW50IHpvb21pbmdcbiAgICAgICAgICAgICAgICBpZiAoaXNXcmFwcGVkV2l0aENsYXNzKGV2ZW50LCBub1doZWVsQ2xhc3NOYW1lKSAmJiBldmVudC50eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggdGhlIG5vcGFuIGNsYXNzLCB3ZSBwcmV2ZW50IHBhbm5pbmdcbiAgICAgICAgICAgICAgICBpZiAoaXNXcmFwcGVkV2l0aENsYXNzKGV2ZW50LCBub1BhbkNsYXNzTmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LnR5cGUgIT09ICd3aGVlbCcgfHwgKHBhbk9uU2Nyb2xsICYmIGV2ZW50LnR5cGUgPT09ICd3aGVlbCcgJiYgIXpvb21BY3RpdmF0aW9uS2V5UHJlc3NlZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF6b29tT25QaW5jaCAmJiBldmVudC5jdHJsS2V5ICYmIGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIG5vIHNjcm9sbCBoYW5kbGluZyBlbmFibGVkLCB3ZSBwcmV2ZW50IGFsbCB3aGVlbCBldmVudHNcbiAgICAgICAgICAgICAgICBpZiAoIXpvb21TY3JvbGwgJiYgIXBhbk9uU2Nyb2xsICYmICFwaW5jaFpvb20gJiYgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYW5lIGlzIG5vdCBtb3ZhYmxlLCB3ZSBwcmV2ZW50IGRyYWdnaW5nIGl0IHdpdGggbW91c2VzdGFydCBvciB0b3VjaHN0YXJ0XG4gICAgICAgICAgICAgICAgaWYgKCFwYW5PbkRyYWcgJiYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICd0b3VjaHN0YXJ0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFuZSBpcyBvbmx5IG1vdmFibGUgdXNpbmcgYWxsb3dlZCBjbGlja3NcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYW5PbkRyYWcpICYmICFwYW5PbkRyYWcuaW5jbHVkZXMoZXZlbnQuYnV0dG9uKSAmJiBldmVudC50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgcmlnaHQgY2xpY2tzIGlmIHBhbiBvbiBkcmFnIGlzIHNldCB0byByaWdodCBjbGlja1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkFsbG93ZWQgPSAoQXJyYXkuaXNBcnJheShwYW5PbkRyYWcpICYmIHBhbk9uRHJhZy5pbmNsdWRlcyhldmVudC5idXR0b24pKSB8fCAhZXZlbnQuYnV0dG9uIHx8IGV2ZW50LmJ1dHRvbiA8PSAxO1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmlsdGVyIGZvciBkMy16b29tXG4gICAgICAgICAgICAgICAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiBidXR0b25BbGxvd2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIHVzZXJTZWxlY3Rpb25BY3RpdmUsXG4gICAgICAgIGQzWm9vbSxcbiAgICAgICAgem9vbU9uU2Nyb2xsLFxuICAgICAgICB6b29tT25QaW5jaCxcbiAgICAgICAgcGFuT25TY3JvbGwsXG4gICAgICAgIHpvb21PbkRvdWJsZUNsaWNrLFxuICAgICAgICBwYW5PbkRyYWcsXG4gICAgICAgIGVsZW1lbnRzU2VsZWN0YWJsZSxcbiAgICAgICAgem9vbUFjdGl2YXRpb25LZXlQcmVzc2VkLFxuICAgIF0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19yZW5kZXJlclwiLCByZWY6IHpvb21QYW5lLCBzdHlsZTogY29udGFpbmVyU3R5bGUgfSwgY2hpbGRyZW4pKTtcbn07XG5cbmNvbnN0IHNlbGVjdG9yJDkgPSAocykgPT4gKHtcbiAgICB1c2VyU2VsZWN0aW9uQWN0aXZlOiBzLnVzZXJTZWxlY3Rpb25BY3RpdmUsXG4gICAgdXNlclNlbGVjdGlvblJlY3Q6IHMudXNlclNlbGVjdGlvblJlY3QsXG59KTtcbmZ1bmN0aW9uIFVzZXJTZWxlY3Rpb24oKSB7XG4gICAgY29uc3QgeyB1c2VyU2VsZWN0aW9uQWN0aXZlLCB1c2VyU2VsZWN0aW9uUmVjdCB9ID0gdXNlU3RvcmUoc2VsZWN0b3IkOSwgc2hhbGxvdyk7XG4gICAgY29uc3QgaXNBY3RpdmUgPSB1c2VyU2VsZWN0aW9uQWN0aXZlICYmIHVzZXJTZWxlY3Rpb25SZWN0O1xuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19zZWxlY3Rpb24gcmVhY3QtZmxvd19fY29udGFpbmVyXCIsIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogdXNlclNlbGVjdGlvblJlY3Qud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHVzZXJTZWxlY3Rpb25SZWN0LmhlaWdodCxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3VzZXJTZWxlY3Rpb25SZWN0Lnh9cHgsICR7dXNlclNlbGVjdGlvblJlY3QueX1weClgLFxuICAgICAgICB9IH0pKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUGFyZW50RXhwYW5kKHJlcywgdXBkYXRlSXRlbSkge1xuICAgIGNvbnN0IHBhcmVudElkID0gdXBkYXRlSXRlbS5wYXJlbnROb2RlIHx8IHVwZGF0ZUl0ZW0ucGFyZW50SWQ7XG4gICAgY29uc3QgcGFyZW50ID0gcmVzLmZpbmQoKGUpID0+IGUuaWQgPT09IHBhcmVudElkKTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGV4dGVuZFdpZHRoID0gdXBkYXRlSXRlbS5wb3NpdGlvbi54ICsgdXBkYXRlSXRlbS53aWR0aCAtIHBhcmVudC53aWR0aDtcbiAgICAgICAgY29uc3QgZXh0ZW5kSGVpZ2h0ID0gdXBkYXRlSXRlbS5wb3NpdGlvbi55ICsgdXBkYXRlSXRlbS5oZWlnaHQgLSBwYXJlbnQuaGVpZ2h0O1xuICAgICAgICBpZiAoZXh0ZW5kV2lkdGggPiAwIHx8IGV4dGVuZEhlaWdodCA+IDAgfHwgdXBkYXRlSXRlbS5wb3NpdGlvbi54IDwgMCB8fCB1cGRhdGVJdGVtLnBvc2l0aW9uLnkgPCAwKSB7XG4gICAgICAgICAgICBwYXJlbnQuc3R5bGUgPSB7IC4uLnBhcmVudC5zdHlsZSB9IHx8IHt9O1xuICAgICAgICAgICAgcGFyZW50LnN0eWxlLndpZHRoID0gcGFyZW50LnN0eWxlLndpZHRoID8/IHBhcmVudC53aWR0aDtcbiAgICAgICAgICAgIHBhcmVudC5zdHlsZS5oZWlnaHQgPSBwYXJlbnQuc3R5bGUuaGVpZ2h0ID8/IHBhcmVudC5oZWlnaHQ7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LnN0eWxlLndpZHRoICs9IGV4dGVuZFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4dGVuZEhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc3R5bGUuaGVpZ2h0ICs9IGV4dGVuZEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVJdGVtLnBvc2l0aW9uLnggPCAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeERpZmYgPSBNYXRoLmFicyh1cGRhdGVJdGVtLnBvc2l0aW9uLngpO1xuICAgICAgICAgICAgICAgIHBhcmVudC5wb3NpdGlvbi54ID0gcGFyZW50LnBvc2l0aW9uLnggLSB4RGlmZjtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc3R5bGUud2lkdGggKz0geERpZmY7XG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5wb3NpdGlvbi54ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1cGRhdGVJdGVtLnBvc2l0aW9uLnkgPCAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeURpZmYgPSBNYXRoLmFicyh1cGRhdGVJdGVtLnBvc2l0aW9uLnkpO1xuICAgICAgICAgICAgICAgIHBhcmVudC5wb3NpdGlvbi55ID0gcGFyZW50LnBvc2l0aW9uLnkgLSB5RGlmZjtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc3R5bGUuaGVpZ2h0ICs9IHlEaWZmO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0ucG9zaXRpb24ueSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQud2lkdGggPSBwYXJlbnQuc3R5bGUud2lkdGg7XG4gICAgICAgICAgICBwYXJlbnQuaGVpZ2h0ID0gcGFyZW50LnN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5Q2hhbmdlcyhjaGFuZ2VzLCBlbGVtZW50cykge1xuICAgIC8vIHdlIG5lZWQgdGhpcyBoYWNrIHRvIGhhbmRsZSB0aGUgc2V0Tm9kZXMgYW5kIHNldEVkZ2VzIGZ1bmN0aW9uIG9mIHRoZSB1c2VSZWFjdEZsb3cgaG9vayBmb3IgY29udHJvbGxlZCBmbG93c1xuICAgIGlmIChjaGFuZ2VzLnNvbWUoKGMpID0+IGMudHlwZSA9PT0gJ3Jlc2V0JykpIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09ICdyZXNldCcpLm1hcCgoYykgPT4gYy5pdGVtKTtcbiAgICB9XG4gICAgY29uc3QgaW5pdEVsZW1lbnRzID0gY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMudHlwZSA9PT0gJ2FkZCcpLm1hcCgoYykgPT4gYy5pdGVtKTtcbiAgICByZXR1cm4gZWxlbWVudHMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudENoYW5nZXMgPSBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5pZCA9PT0gaXRlbS5pZCk7XG4gICAgICAgIGlmIChjdXJyZW50Q2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVJdGVtID0geyAuLi5pdGVtIH07XG4gICAgICAgIGZvciAoY29uc3QgY3VycmVudENoYW5nZSBvZiBjdXJyZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnRDaGFuZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLnNlbGVjdGVkID0gY3VycmVudENoYW5nZS5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bvc2l0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2hhbmdlLnBvc2l0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0ucG9zaXRpb24gPSBjdXJyZW50Q2hhbmdlLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2hhbmdlLnBvc2l0aW9uQWJzb2x1dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5wb3NpdGlvbkFic29sdXRlID0gY3VycmVudENoYW5nZS5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2hhbmdlLmRyYWdnaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0uZHJhZ2dpbmcgPSBjdXJyZW50Q2hhbmdlLmRyYWdnaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUl0ZW0uZXhwYW5kUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGFyZW50RXhwYW5kKHJlcywgdXBkYXRlSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2hhbmdlLmRpbWVuc2lvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS53aWR0aCA9IGN1cnJlbnRDaGFuZ2UuZGltZW5zaW9ucy53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLmhlaWdodCA9IGN1cnJlbnRDaGFuZ2UuZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRDaGFuZ2UudXBkYXRlU3R5bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5zdHlsZSA9IHsgLi4uKHVwZGF0ZUl0ZW0uc3R5bGUgfHwge30pLCAuLi5jdXJyZW50Q2hhbmdlLmRpbWVuc2lvbnMgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudENoYW5nZS5yZXNpemluZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5yZXNpemluZyA9IGN1cnJlbnRDaGFuZ2UucmVzaXppbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlSXRlbS5leHBhbmRQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJlbnRFeHBhbmQocmVzLCB1cGRhdGVJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2godXBkYXRlSXRlbSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfSwgaW5pdEVsZW1lbnRzKTtcbn1cbmZ1bmN0aW9uIGFwcGx5Tm9kZUNoYW5nZXMoY2hhbmdlcywgbm9kZXMpIHtcbiAgICByZXR1cm4gYXBwbHlDaGFuZ2VzKGNoYW5nZXMsIG5vZGVzKTtcbn1cbmZ1bmN0aW9uIGFwcGx5RWRnZUNoYW5nZXMoY2hhbmdlcywgZWRnZXMpIHtcbiAgICByZXR1cm4gYXBwbHlDaGFuZ2VzKGNoYW5nZXMsIGVkZ2VzKTtcbn1cbmNvbnN0IGNyZWF0ZVNlbGVjdGlvbkNoYW5nZSA9IChpZCwgc2VsZWN0ZWQpID0+ICh7XG4gICAgaWQsXG4gICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgc2VsZWN0ZWQsXG59KTtcbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkNoYW5nZXMoaXRlbXMsIHNlbGVjdGVkSWRzKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgocmVzLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHdpbGxCZVNlbGVjdGVkID0gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaXRlbS5pZCk7XG4gICAgICAgIGlmICghaXRlbS5zZWxlY3RlZCAmJiB3aWxsQmVTZWxlY3RlZCkge1xuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICByZXMucHVzaChjcmVhdGVTZWxlY3Rpb25DaGFuZ2UoaXRlbS5pZCwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uc2VsZWN0ZWQgJiYgIXdpbGxCZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXMucHVzaChjcmVhdGVTZWxlY3Rpb25DaGFuZ2UoaXRlbS5pZCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBUaGUgdXNlciBzZWxlY3Rpb24gcmVjdGFuZ2xlIGdldHMgZGlzcGxheWVkIHdoZW4gYSB1c2VyIGRyYWdzIHRoZSBtb3VzZSB3aGlsZSBwcmVzc2luZyBzaGlmdFxuICovXG5jb25zdCB3cmFwSGFuZGxlciA9IChoYW5kbGVyLCBjb250YWluZXJSZWYpID0+IHtcbiAgICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IGNvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9O1xufTtcbmNvbnN0IHNlbGVjdG9yJDggPSAocykgPT4gKHtcbiAgICB1c2VyU2VsZWN0aW9uQWN0aXZlOiBzLnVzZXJTZWxlY3Rpb25BY3RpdmUsXG4gICAgZWxlbWVudHNTZWxlY3RhYmxlOiBzLmVsZW1lbnRzU2VsZWN0YWJsZSxcbiAgICBkcmFnZ2luZzogcy5wYW5lRHJhZ2dpbmcsXG59KTtcbmNvbnN0IFBhbmUgPSBtZW1vKCh7IGlzU2VsZWN0aW5nLCBzZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5GdWxsLCBwYW5PbkRyYWcsIG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kLCBvblBhbmVDbGljaywgb25QYW5lQ29udGV4dE1lbnUsIG9uUGFuZVNjcm9sbCwgb25QYW5lTW91c2VFbnRlciwgb25QYW5lTW91c2VNb3ZlLCBvblBhbmVNb3VzZUxlYXZlLCBjaGlsZHJlbiwgfSkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgcHJldlNlbGVjdGVkTm9kZXNDb3VudCA9IHVzZVJlZigwKTtcbiAgICBjb25zdCBwcmV2U2VsZWN0ZWRFZGdlc0NvdW50ID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IGNvbnRhaW5lckJvdW5kcyA9IHVzZVJlZigpO1xuICAgIGNvbnN0IHsgdXNlclNlbGVjdGlvbkFjdGl2ZSwgZWxlbWVudHNTZWxlY3RhYmxlLCBkcmFnZ2luZyB9ID0gdXNlU3RvcmUoc2VsZWN0b3IkOCwgc2hhbGxvdyk7XG4gICAgY29uc3QgcmVzZXRVc2VyU2VsZWN0aW9uID0gKCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHVzZXJTZWxlY3Rpb25BY3RpdmU6IGZhbHNlLCB1c2VyU2VsZWN0aW9uUmVjdDogbnVsbCB9KTtcbiAgICAgICAgcHJldlNlbGVjdGVkTm9kZXNDb3VudC5jdXJyZW50ID0gMDtcbiAgICAgICAgcHJldlNlbGVjdGVkRWRnZXNDb3VudC5jdXJyZW50ID0gMDtcbiAgICB9O1xuICAgIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgb25QYW5lQ2xpY2s/LihldmVudCk7XG4gICAgICAgIHN0b3JlLmdldFN0YXRlKCkucmVzZXRTZWxlY3RlZEVsZW1lbnRzKCk7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgbm9kZXNTZWxlY3Rpb25BY3RpdmU6IGZhbHNlIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25Db250ZXh0TWVudSA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYW5PbkRyYWcpICYmIHBhbk9uRHJhZz8uaW5jbHVkZXMoMikpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb25QYW5lQ29udGV4dE1lbnU/LihldmVudCk7XG4gICAgfTtcbiAgICBjb25zdCBvbldoZWVsID0gb25QYW5lU2Nyb2xsID8gKGV2ZW50KSA9PiBvblBhbmVTY3JvbGwoZXZlbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9uTW91c2VEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmVzZXRTZWxlY3RlZEVsZW1lbnRzLCBkb21Ob2RlIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb250YWluZXJCb3VuZHMuY3VycmVudCA9IGRvbU5vZGU/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzU2VsZWN0YWJsZSB8fFxuICAgICAgICAgICAgIWlzU2VsZWN0aW5nIHx8XG4gICAgICAgICAgICBldmVudC5idXR0b24gIT09IDAgfHxcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldCAhPT0gY29udGFpbmVyLmN1cnJlbnQgfHxcbiAgICAgICAgICAgICFjb250YWluZXJCb3VuZHMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudCwgY29udGFpbmVyQm91bmRzLmN1cnJlbnQpO1xuICAgICAgICByZXNldFNlbGVjdGVkRWxlbWVudHMoKTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdXNlclNlbGVjdGlvblJlY3Q6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSxcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgb25TZWxlY3Rpb25TdGFydD8uKGV2ZW50KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdXNlclNlbGVjdGlvblJlY3QsIG5vZGVJbnRlcm5hbHMsIGVkZ2VzLCB0cmFuc2Zvcm0sIG9uTm9kZXNDaGFuZ2UsIG9uRWRnZXNDaGFuZ2UsIG5vZGVPcmlnaW4sIGdldE5vZGVzIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIWlzU2VsZWN0aW5nIHx8ICFjb250YWluZXJCb3VuZHMuY3VycmVudCB8fCAhdXNlclNlbGVjdGlvblJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHVzZXJTZWxlY3Rpb25BY3RpdmU6IHRydWUsIG5vZGVzU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgICAgY29uc3QgbW91c2VQb3MgPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LCBjb250YWluZXJCb3VuZHMuY3VycmVudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IHVzZXJTZWxlY3Rpb25SZWN0LnN0YXJ0WCA/PyAwO1xuICAgICAgICBjb25zdCBzdGFydFkgPSB1c2VyU2VsZWN0aW9uUmVjdC5zdGFydFkgPz8gMDtcbiAgICAgICAgY29uc3QgbmV4dFVzZXJTZWxlY3RSZWN0ID0ge1xuICAgICAgICAgICAgLi4udXNlclNlbGVjdGlvblJlY3QsXG4gICAgICAgICAgICB4OiBtb3VzZVBvcy54IDwgc3RhcnRYID8gbW91c2VQb3MueCA6IHN0YXJ0WCxcbiAgICAgICAgICAgIHk6IG1vdXNlUG9zLnkgPCBzdGFydFkgPyBtb3VzZVBvcy55IDogc3RhcnRZLFxuICAgICAgICAgICAgd2lkdGg6IE1hdGguYWJzKG1vdXNlUG9zLnggLSBzdGFydFgpLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhtb3VzZVBvcy55IC0gc3RhcnRZKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBnZXROb2RlcygpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZE5vZGVzID0gZ2V0Tm9kZXNJbnNpZGUobm9kZUludGVybmFscywgbmV4dFVzZXJTZWxlY3RSZWN0LCB0cmFuc2Zvcm0sIHNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuUGFydGlhbCwgdHJ1ZSwgbm9kZU9yaWdpbik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWRnZUlkcyA9IGdldENvbm5lY3RlZEVkZ2VzKHNlbGVjdGVkTm9kZXMsIGVkZ2VzKS5tYXAoKGUpID0+IGUuaWQpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZE5vZGVJZHMgPSBzZWxlY3RlZE5vZGVzLm1hcCgobikgPT4gbi5pZCk7XG4gICAgICAgIGlmIChwcmV2U2VsZWN0ZWROb2Rlc0NvdW50LmN1cnJlbnQgIT09IHNlbGVjdGVkTm9kZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZXZTZWxlY3RlZE5vZGVzQ291bnQuY3VycmVudCA9IHNlbGVjdGVkTm9kZUlkcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhub2Rlcywgc2VsZWN0ZWROb2RlSWRzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG9uTm9kZXNDaGFuZ2U/LihjaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldlNlbGVjdGVkRWRnZXNDb3VudC5jdXJyZW50ICE9PSBzZWxlY3RlZEVkZ2VJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmV2U2VsZWN0ZWRFZGdlc0NvdW50LmN1cnJlbnQgPSBzZWxlY3RlZEVkZ2VJZHMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IGdldFNlbGVjdGlvbkNoYW5nZXMoZWRnZXMsIHNlbGVjdGVkRWRnZUlkcyk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvbkVkZ2VzQ2hhbmdlPy4oY2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdXNlclNlbGVjdGlvblJlY3Q6IG5leHRVc2VyU2VsZWN0UmVjdCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbk1vdXNlVXAgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdXNlclNlbGVjdGlvblJlY3QgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byB0cmlnZ2VyIGNsaWNrIGZ1bmN0aW9ucyB3aGVuIGluIHNlbGVjdGlvbiBtb2RlIGlmXG4gICAgICAgIC8vIHRoZSB1c2VyIGRpZCBub3QgbW92ZSB0aGUgbW91c2UuXG4gICAgICAgIGlmICghdXNlclNlbGVjdGlvbkFjdGl2ZSAmJiB1c2VyU2VsZWN0aW9uUmVjdCAmJiBldmVudC50YXJnZXQgPT09IGNvbnRhaW5lci5jdXJyZW50KSB7XG4gICAgICAgICAgICBvbkNsaWNrPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgbm9kZXNTZWxlY3Rpb25BY3RpdmU6IHByZXZTZWxlY3RlZE5vZGVzQ291bnQuY3VycmVudCA+IDAgfSk7XG4gICAgICAgIHJlc2V0VXNlclNlbGVjdGlvbigpO1xuICAgICAgICBvblNlbGVjdGlvbkVuZD8uKGV2ZW50KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTW91c2VMZWF2ZSA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodXNlclNlbGVjdGlvbkFjdGl2ZSkge1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogcHJldlNlbGVjdGVkTm9kZXNDb3VudC5jdXJyZW50ID4gMCB9KTtcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uRW5kPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc2V0VXNlclNlbGVjdGlvbigpO1xuICAgIH07XG4gICAgY29uc3QgaGFzQWN0aXZlU2VsZWN0aW9uID0gZWxlbWVudHNTZWxlY3RhYmxlICYmIChpc1NlbGVjdGluZyB8fCB1c2VyU2VsZWN0aW9uQWN0aXZlKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fcGFuZScsIHsgZHJhZ2dpbmcsIHNlbGVjdGlvbjogaXNTZWxlY3RpbmcgfV0pLCBvbkNsaWNrOiBoYXNBY3RpdmVTZWxlY3Rpb24gPyB1bmRlZmluZWQgOiB3cmFwSGFuZGxlcihvbkNsaWNrLCBjb250YWluZXIpLCBvbkNvbnRleHRNZW51OiB3cmFwSGFuZGxlcihvbkNvbnRleHRNZW51LCBjb250YWluZXIpLCBvbldoZWVsOiB3cmFwSGFuZGxlcihvbldoZWVsLCBjb250YWluZXIpLCBvbk1vdXNlRW50ZXI6IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IHVuZGVmaW5lZCA6IG9uUGFuZU1vdXNlRW50ZXIsIG9uTW91c2VEb3duOiBoYXNBY3RpdmVTZWxlY3Rpb24gPyBvbk1vdXNlRG93biA6IHVuZGVmaW5lZCwgb25Nb3VzZU1vdmU6IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IG9uTW91c2VNb3ZlIDogb25QYW5lTW91c2VNb3ZlLCBvbk1vdXNlVXA6IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IG9uTW91c2VVcCA6IHVuZGVmaW5lZCwgb25Nb3VzZUxlYXZlOiBoYXNBY3RpdmVTZWxlY3Rpb24gPyBvbk1vdXNlTGVhdmUgOiBvblBhbmVNb3VzZUxlYXZlLCByZWY6IGNvbnRhaW5lciwgc3R5bGU6IGNvbnRhaW5lclN0eWxlIH0sXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFVzZXJTZWxlY3Rpb24sIG51bGwpKSk7XG59KTtcblBhbmUuZGlzcGxheU5hbWUgPSAnUGFuZSc7XG5cbmZ1bmN0aW9uIGlzUGFyZW50U2VsZWN0ZWQobm9kZSwgbm9kZUludGVybmFscykge1xuICAgIGNvbnN0IHBhcmVudElkID0gbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50SWQ7XG4gICAgaWYgKCFwYXJlbnRJZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBhcmVudE5vZGUuc2VsZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc1BhcmVudFNlbGVjdGVkKHBhcmVudE5vZGUsIG5vZGVJbnRlcm5hbHMpO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0b3IodGFyZ2V0LCBzZWxlY3Rvciwgbm9kZVJlZikge1xuICAgIGxldCBjdXJyZW50ID0gdGFyZ2V0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKGN1cnJlbnQ/Lm1hdGNoZXMoc2VsZWN0b3IpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChjdXJyZW50ID09PSBub2RlUmVmLmN1cnJlbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfSB3aGlsZSAoY3VycmVudCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gbG9va3MgZm9yIGFsbCBzZWxlY3RlZCBub2RlcyBhbmQgY3JlYXRlZCBhIE5vZGVEcmFnSXRlbSBmb3IgZWFjaCBvZiB0aGVtXG5mdW5jdGlvbiBnZXREcmFnSXRlbXMobm9kZUludGVybmFscywgbm9kZXNEcmFnZ2FibGUsIG1vdXNlUG9zLCBub2RlSWQpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlSW50ZXJuYWxzLnZhbHVlcygpKVxuICAgICAgICAuZmlsdGVyKChuKSA9PiAobi5zZWxlY3RlZCB8fCBuLmlkID09PSBub2RlSWQpICYmXG4gICAgICAgICghbi5wYXJlbnROb2RlIHx8IG4ucGFyZW50SWQgfHwgIWlzUGFyZW50U2VsZWN0ZWQobiwgbm9kZUludGVybmFscykpICYmXG4gICAgICAgIChuLmRyYWdnYWJsZSB8fCAobm9kZXNEcmFnZ2FibGUgJiYgdHlwZW9mIG4uZHJhZ2dhYmxlID09PSAndW5kZWZpbmVkJykpKVxuICAgICAgICAubWFwKChuKSA9PiAoe1xuICAgICAgICBpZDogbi5pZCxcbiAgICAgICAgcG9zaXRpb246IG4ucG9zaXRpb24gfHwgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgIHBvc2l0aW9uQWJzb2x1dGU6IG4ucG9zaXRpb25BYnNvbHV0ZSB8fCB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgZGlzdGFuY2U6IHtcbiAgICAgICAgICAgIHg6IG1vdXNlUG9zLnggLSAobi5wb3NpdGlvbkFic29sdXRlPy54ID8/IDApLFxuICAgICAgICAgICAgeTogbW91c2VQb3MueSAtIChuLnBvc2l0aW9uQWJzb2x1dGU/LnkgPz8gMCksXG4gICAgICAgIH0sXG4gICAgICAgIGRlbHRhOiB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgfSxcbiAgICAgICAgZXh0ZW50OiBuLmV4dGVudCxcbiAgICAgICAgcGFyZW50Tm9kZTogbi5wYXJlbnROb2RlIHx8IG4ucGFyZW50SWQsXG4gICAgICAgIHBhcmVudElkOiBuLnBhcmVudE5vZGUgfHwgbi5wYXJlbnRJZCxcbiAgICAgICAgd2lkdGg6IG4ud2lkdGgsXG4gICAgICAgIGhlaWdodDogbi5oZWlnaHQsXG4gICAgICAgIGV4cGFuZFBhcmVudDogbi5leHBhbmRQYXJlbnQsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gY2xhbXBOb2RlRXh0ZW50KG5vZGUsIGV4dGVudCkge1xuICAgIGlmICghZXh0ZW50IHx8IGV4dGVudCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVudDtcbiAgICB9XG4gICAgcmV0dXJuIFtleHRlbnRbMF0sIFtleHRlbnRbMV1bMF0gLSAobm9kZS53aWR0aCB8fCAwKSwgZXh0ZW50WzFdWzFdIC0gKG5vZGUuaGVpZ2h0IHx8IDApXV07XG59XG5mdW5jdGlvbiBjYWxjTmV4dFBvc2l0aW9uKG5vZGUsIG5leHRQb3NpdGlvbiwgbm9kZUludGVybmFscywgbm9kZUV4dGVudCwgbm9kZU9yaWdpbiA9IFswLCAwXSwgb25FcnJvcikge1xuICAgIGNvbnN0IGNsYW1wZWROb2RlRXh0ZW50ID0gY2xhbXBOb2RlRXh0ZW50KG5vZGUsIG5vZGUuZXh0ZW50IHx8IG5vZGVFeHRlbnQpO1xuICAgIGxldCBjdXJyZW50RXh0ZW50ID0gY2xhbXBlZE5vZGVFeHRlbnQ7XG4gICAgY29uc3QgcGFyZW50SWQgPSBub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnRJZDtcbiAgICBpZiAobm9kZS5leHRlbnQgPT09ICdwYXJlbnQnICYmICFub2RlLmV4cGFuZFBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50SWQgJiYgbm9kZS53aWR0aCAmJiBub2RlLmhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZUludGVybmFscy5nZXQocGFyZW50SWQpO1xuICAgICAgICAgICAgY29uc3QgeyB4OiBwYXJlbnRYLCB5OiBwYXJlbnRZIH0gPSBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luKHBhcmVudCwgbm9kZU9yaWdpbikucG9zaXRpb25BYnNvbHV0ZTtcbiAgICAgICAgICAgIGN1cnJlbnRFeHRlbnQgPVxuICAgICAgICAgICAgICAgIHBhcmVudCAmJiBpc051bWVyaWMocGFyZW50WCkgJiYgaXNOdW1lcmljKHBhcmVudFkpICYmIGlzTnVtZXJpYyhwYXJlbnQud2lkdGgpICYmIGlzTnVtZXJpYyhwYXJlbnQuaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJlbnRYICsgbm9kZS53aWR0aCAqIG5vZGVPcmlnaW5bMF0sIHBhcmVudFkgKyBub2RlLmhlaWdodCAqIG5vZGVPcmlnaW5bMV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFggKyBwYXJlbnQud2lkdGggLSBub2RlLndpZHRoICsgbm9kZS53aWR0aCAqIG5vZGVPcmlnaW5bMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50WSArIHBhcmVudC5oZWlnaHQgLSBub2RlLmhlaWdodCArIG5vZGUuaGVpZ2h0ICogbm9kZU9yaWdpblsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50RXh0ZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25FcnJvcj8uKCcwMDUnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwNSddKCkpO1xuICAgICAgICAgICAgY3VycmVudEV4dGVudCA9IGNsYW1wZWROb2RlRXh0ZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGUuZXh0ZW50ICYmIHBhcmVudElkICYmIG5vZGUuZXh0ZW50ICE9PSAncGFyZW50Jykge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlSW50ZXJuYWxzLmdldChwYXJlbnRJZCk7XG4gICAgICAgIGNvbnN0IHsgeDogcGFyZW50WCwgeTogcGFyZW50WSB9ID0gZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbihwYXJlbnQsIG5vZGVPcmlnaW4pLnBvc2l0aW9uQWJzb2x1dGU7XG4gICAgICAgIGN1cnJlbnRFeHRlbnQgPSBbXG4gICAgICAgICAgICBbbm9kZS5leHRlbnRbMF1bMF0gKyBwYXJlbnRYLCBub2RlLmV4dGVudFswXVsxXSArIHBhcmVudFldLFxuICAgICAgICAgICAgW25vZGUuZXh0ZW50WzFdWzBdICsgcGFyZW50WCwgbm9kZS5leHRlbnRbMV1bMV0gKyBwYXJlbnRZXSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgbGV0IHBhcmVudFBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XG4gICAgaWYgKHBhcmVudElkKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChwYXJlbnRJZCk7XG4gICAgICAgIHBhcmVudFBvc2l0aW9uID0gZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbihwYXJlbnROb2RlLCBub2RlT3JpZ2luKS5wb3NpdGlvbkFic29sdXRlO1xuICAgIH1cbiAgICBjb25zdCBwb3NpdGlvbkFic29sdXRlID0gY3VycmVudEV4dGVudCAmJiBjdXJyZW50RXh0ZW50ICE9PSAncGFyZW50J1xuICAgICAgICA/IGNsYW1wUG9zaXRpb24obmV4dFBvc2l0aW9uLCBjdXJyZW50RXh0ZW50KVxuICAgICAgICA6IG5leHRQb3NpdGlvbjtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgeDogcG9zaXRpb25BYnNvbHV0ZS54IC0gcGFyZW50UG9zaXRpb24ueCxcbiAgICAgICAgICAgIHk6IHBvc2l0aW9uQWJzb2x1dGUueSAtIHBhcmVudFBvc2l0aW9uLnksXG4gICAgICAgIH0sXG4gICAgICAgIHBvc2l0aW9uQWJzb2x1dGUsXG4gICAgfTtcbn1cbi8vIHJldHVybnMgdHdvIHBhcmFtczpcbi8vIDEuIHRoZSBkcmFnZ2VkIG5vZGUgKG9yIHRoZSBmaXJzdCBvZiB0aGUgbGlzdCwgaWYgd2UgYXJlIGRyYWdnaW5nIGEgbm9kZSBzZWxlY3Rpb24pXG4vLyAyLiBhcnJheSBvZiBzZWxlY3RlZCBub2RlcyAoZm9yIG11bHRpIHNlbGVjdGlvbnMpXG5mdW5jdGlvbiBnZXRFdmVudEhhbmRsZXJQYXJhbXMoeyBub2RlSWQsIGRyYWdJdGVtcywgbm9kZUludGVybmFscywgfSkge1xuICAgIGNvbnN0IGV4dGVudGVkRHJhZ0l0ZW1zID0gZHJhZ0l0ZW1zLm1hcCgobikgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZUludGVybmFscy5nZXQobi5pZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcG9zaXRpb246IG4ucG9zaXRpb24sXG4gICAgICAgICAgICBwb3NpdGlvbkFic29sdXRlOiBuLnBvc2l0aW9uQWJzb2x1dGUsXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIFtub2RlSWQgPyBleHRlbnRlZERyYWdJdGVtcy5maW5kKChuKSA9PiBuLmlkID09PSBub2RlSWQpIDogZXh0ZW50ZWREcmFnSXRlbXNbMF0sIGV4dGVudGVkRHJhZ0l0ZW1zXTtcbn1cblxuY29uc3QgZ2V0SGFuZGxlQm91bmRzID0gKHNlbGVjdG9yLCBub2RlRWxlbWVudCwgem9vbSwgbm9kZU9yaWdpbikgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXMgPSBub2RlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBpZiAoIWhhbmRsZXMgfHwgIWhhbmRsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVzQXJyYXkgPSBBcnJheS5mcm9tKGhhbmRsZXMpO1xuICAgIGNvbnN0IG5vZGVCb3VuZHMgPSBub2RlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBub2RlT2Zmc2V0ID0ge1xuICAgICAgICB4OiBub2RlQm91bmRzLndpZHRoICogbm9kZU9yaWdpblswXSxcbiAgICAgICAgeTogbm9kZUJvdW5kcy5oZWlnaHQgKiBub2RlT3JpZ2luWzFdLFxuICAgIH07XG4gICAgcmV0dXJuIGhhbmRsZXNBcnJheS5tYXAoKGhhbmRsZSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVCb3VuZHMgPSBoYW5kbGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogaGFuZGxlLmdldEF0dHJpYnV0ZSgnZGF0YS1oYW5kbGVpZCcpLFxuICAgICAgICAgICAgcG9zaXRpb246IGhhbmRsZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuZGxlcG9zJyksXG4gICAgICAgICAgICB4OiAoaGFuZGxlQm91bmRzLmxlZnQgLSBub2RlQm91bmRzLmxlZnQgLSBub2RlT2Zmc2V0LngpIC8gem9vbSxcbiAgICAgICAgICAgIHk6IChoYW5kbGVCb3VuZHMudG9wIC0gbm9kZUJvdW5kcy50b3AgLSBub2RlT2Zmc2V0LnkpIC8gem9vbSxcbiAgICAgICAgICAgIC4uLmdldERpbWVuc2lvbnMoaGFuZGxlKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBnZXRNb3VzZUhhbmRsZXIoaWQsIGdldFN0YXRlLCBoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IGhhbmRsZXJcbiAgICAgICAgOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBnZXRTdGF0ZSgpLm5vZGVJbnRlcm5hbHMuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihldmVudCwgeyAuLi5ub2RlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xufVxuLy8gdGhpcyBoYW5kbGVyIGlzIGNhbGxlZCBieVxuLy8gMS4gdGhlIGNsaWNrIGhhbmRsZXIgd2hlbiBub2RlIGlzIG5vdCBkcmFnZ2FibGUgb3Igc2VsZWN0Tm9kZXNPbkRyYWcgPSBmYWxzZVxuLy8gb3Jcbi8vIDIuIHRoZSBvbiBkcmFnIHN0YXJ0IGhhbmRsZXIgd2hlbiBub2RlIGlzIGRyYWdnYWJsZSBhbmQgc2VsZWN0Tm9kZXNPbkRyYWcgPSB0cnVlXG5mdW5jdGlvbiBoYW5kbGVOb2RlQ2xpY2soeyBpZCwgc3RvcmUsIHVuc2VsZWN0ID0gZmFsc2UsIG5vZGVSZWYsIH0pIHtcbiAgICBjb25zdCB7IGFkZFNlbGVjdGVkTm9kZXMsIHVuc2VsZWN0Tm9kZXNBbmRFZGdlcywgbXVsdGlTZWxlY3Rpb25BY3RpdmUsIG5vZGVJbnRlcm5hbHMsIG9uRXJyb3IgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KGlkKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgb25FcnJvcj8uKCcwMTInLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAxMiddKGlkKSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogZmFsc2UgfSk7XG4gICAgaWYgKCFub2RlLnNlbGVjdGVkKSB7XG4gICAgICAgIGFkZFNlbGVjdGVkTm9kZXMoW2lkXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHVuc2VsZWN0IHx8IChub2RlLnNlbGVjdGVkICYmIG11bHRpU2VsZWN0aW9uQWN0aXZlKSkge1xuICAgICAgICB1bnNlbGVjdE5vZGVzQW5kRWRnZXMoeyBub2RlczogW25vZGVdLCBlZGdlczogW10gfSk7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBub2RlUmVmPy5jdXJyZW50Py5ibHVyKCkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdXNlR2V0UG9pbnRlclBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICAvLyByZXR1cm5zIHRoZSBwb2ludGVyIHBvc2l0aW9uIHByb2plY3RlZCB0byB0aGUgUkYgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICBjb25zdCBnZXRQb2ludGVyUG9zaXRpb24gPSB1c2VDYWxsYmFjaygoeyBzb3VyY2VFdmVudCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtLCBzbmFwR3JpZCwgc25hcFRvR3JpZCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgeCA9IHNvdXJjZUV2ZW50LnRvdWNoZXMgPyBzb3VyY2VFdmVudC50b3VjaGVzWzBdLmNsaWVudFggOiBzb3VyY2VFdmVudC5jbGllbnRYO1xuICAgICAgICBjb25zdCB5ID0gc291cmNlRXZlbnQudG91Y2hlcyA/IHNvdXJjZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSA6IHNvdXJjZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJQb3MgPSB7XG4gICAgICAgICAgICB4OiAoeCAtIHRyYW5zZm9ybVswXSkgLyB0cmFuc2Zvcm1bMl0sXG4gICAgICAgICAgICB5OiAoeSAtIHRyYW5zZm9ybVsxXSkgLyB0cmFuc2Zvcm1bMl0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIHdlIG5lZWQgdGhlIHNuYXBwZWQgcG9zaXRpb24gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBza2lwIHVubmVjZXNzYXJ5IGRyYWcgZXZlbnRzXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4U25hcHBlZDogc25hcFRvR3JpZCA/IHNuYXBHcmlkWzBdICogTWF0aC5yb3VuZChwb2ludGVyUG9zLnggLyBzbmFwR3JpZFswXSkgOiBwb2ludGVyUG9zLngsXG4gICAgICAgICAgICB5U25hcHBlZDogc25hcFRvR3JpZCA/IHNuYXBHcmlkWzFdICogTWF0aC5yb3VuZChwb2ludGVyUG9zLnkgLyBzbmFwR3JpZFsxXSkgOiBwb2ludGVyUG9zLnksXG4gICAgICAgICAgICAuLi5wb2ludGVyUG9zLFxuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gZ2V0UG9pbnRlclBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiB3cmFwU2VsZWN0aW9uRHJhZ0Z1bmMoc2VsZWN0aW9uRnVuYykge1xuICAgIHJldHVybiAoZXZlbnQsIF8sIG5vZGVzKSA9PiBzZWxlY3Rpb25GdW5jPy4oZXZlbnQsIG5vZGVzKTtcbn1cbmZ1bmN0aW9uIHVzZURyYWcoeyBub2RlUmVmLCBkaXNhYmxlZCA9IGZhbHNlLCBub0RyYWdDbGFzc05hbWUsIGhhbmRsZVNlbGVjdG9yLCBub2RlSWQsIGlzU2VsZWN0YWJsZSwgc2VsZWN0Tm9kZXNPbkRyYWcsIH0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgW2RyYWdnaW5nLCBzZXREcmFnZ2luZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgZHJhZ0l0ZW1zID0gdXNlUmVmKFtdKTtcbiAgICBjb25zdCBsYXN0UG9zID0gdXNlUmVmKHsgeDogbnVsbCwgeTogbnVsbCB9KTtcbiAgICBjb25zdCBhdXRvUGFuSWQgPSB1c2VSZWYoMCk7XG4gICAgY29uc3QgY29udGFpbmVyQm91bmRzID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IG1vdXNlUG9zaXRpb24gPSB1c2VSZWYoeyB4OiAwLCB5OiAwIH0pO1xuICAgIGNvbnN0IGRyYWdFdmVudCA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBhdXRvUGFuU3RhcnRlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgZHJhZ1N0YXJ0ZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IGFib3J0RHJhZyA9IHVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgZ2V0UG9pbnRlclBvc2l0aW9uID0gdXNlR2V0UG9pbnRlclBvc2l0aW9uKCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKG5vZGVSZWY/LmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHNlbGVjdChub2RlUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlTm9kZXMgPSAoeyB4LCB5IH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIG9uTm9kZURyYWcsIG9uU2VsZWN0aW9uRHJhZywgdXBkYXRlTm9kZVBvc2l0aW9ucywgbm9kZUV4dGVudCwgc25hcEdyaWQsIHNuYXBUb0dyaWQsIG5vZGVPcmlnaW4sIG9uRXJyb3IsIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGxhc3RQb3MuY3VycmVudCA9IHsgeCwgeSB9O1xuICAgICAgICAgICAgICAgIGxldCBoYXNDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZXNCb3ggPSB7IHg6IDAsIHk6IDAsIHgyOiAwLCB5MjogMCB9O1xuICAgICAgICAgICAgICAgIGlmIChkcmFnSXRlbXMuY3VycmVudC5sZW5ndGggPiAxICYmIG5vZGVFeHRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGdldE5vZGVzQm91bmRzKGRyYWdJdGVtcy5jdXJyZW50LCBub2RlT3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNCb3ggPSByZWN0VG9Cb3gocmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRyYWdJdGVtcy5jdXJyZW50ID0gZHJhZ0l0ZW1zLmN1cnJlbnQubWFwKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IHsgeDogeCAtIG4uZGlzdGFuY2UueCwgeTogeSAtIG4uZGlzdGFuY2UueSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc25hcFRvR3JpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBvc2l0aW9uLnggPSBzbmFwR3JpZFswXSAqIE1hdGgucm91bmQobmV4dFBvc2l0aW9uLnggLyBzbmFwR3JpZFswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UG9zaXRpb24ueSA9IHNuYXBHcmlkWzFdICogTWF0aC5yb3VuZChuZXh0UG9zaXRpb24ueSAvIHNuYXBHcmlkWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBzZWxlY3Rpb24gd2l0aCBtdWx0aXBsZSBub2RlcyBhbmQgYSBub2RlIGV4dGVudCBpcyBzZXQsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBub2RlIGV4dGVudCBmb3IgZWFjaCBub2RlXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBzbyB0aGF0IHRoZSBub2RlIHN0YXlzIGF0IGl0J3MgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWROb2RlRXh0ZW50ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVFeHRlbnRbMF1bMF0sIG5vZGVFeHRlbnRbMF1bMV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVFeHRlbnRbMV1bMF0sIG5vZGVFeHRlbnRbMV1bMV1dLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZHJhZ0l0ZW1zLmN1cnJlbnQubGVuZ3RoID4gMSAmJiBub2RlRXh0ZW50ICYmICFuLmV4dGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWROb2RlRXh0ZW50WzBdWzBdID0gbi5wb3NpdGlvbkFic29sdXRlLnggLSBub2Rlc0JveC54ICsgbm9kZUV4dGVudFswXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkTm9kZUV4dGVudFsxXVswXSA9IG4ucG9zaXRpb25BYnNvbHV0ZS54ICsgKG4ud2lkdGggPz8gMCkgLSBub2Rlc0JveC54MiArIG5vZGVFeHRlbnRbMV1bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZE5vZGVFeHRlbnRbMF1bMV0gPSBuLnBvc2l0aW9uQWJzb2x1dGUueSAtIG5vZGVzQm94LnkgKyBub2RlRXh0ZW50WzBdWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWROb2RlRXh0ZW50WzFdWzFdID0gbi5wb3NpdGlvbkFic29sdXRlLnkgKyAobi5oZWlnaHQgPz8gMCkgLSBub2Rlc0JveC55MiArIG5vZGVFeHRlbnRbMV1bMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZFBvcyA9IGNhbGNOZXh0UG9zaXRpb24obiwgbmV4dFBvc2l0aW9uLCBub2RlSW50ZXJuYWxzLCBhZGp1c3RlZE5vZGVFeHRlbnQsIG5vZGVPcmlnaW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgZmlyZSBhIGNoYW5nZSBldmVudCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIGhhc0NoYW5nZSA9IGhhc0NoYW5nZSB8fCBuLnBvc2l0aW9uLnggIT09IHVwZGF0ZWRQb3MucG9zaXRpb24ueCB8fCBuLnBvc2l0aW9uLnkgIT09IHVwZGF0ZWRQb3MucG9zaXRpb24ueTtcbiAgICAgICAgICAgICAgICAgICAgbi5wb3NpdGlvbiA9IHVwZGF0ZWRQb3MucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIG4ucG9zaXRpb25BYnNvbHV0ZSA9IHVwZGF0ZWRQb3MucG9zaXRpb25BYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVOb2RlUG9zaXRpb25zKGRyYWdJdGVtcy5jdXJyZW50LCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzZXREcmFnZ2luZyh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbkRyYWcgPSBub2RlSWQgPyBvbk5vZGVEcmFnIDogd3JhcFNlbGVjdGlvbkRyYWdGdW5jKG9uU2VsZWN0aW9uRHJhZyk7XG4gICAgICAgICAgICAgICAgaWYgKG9uRHJhZyAmJiBkcmFnRXZlbnQuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY3VycmVudE5vZGUsIG5vZGVzXSA9IGdldEV2ZW50SGFuZGxlclBhcmFtcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnSXRlbXM6IGRyYWdJdGVtcy5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUludGVybmFscyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG9uRHJhZyhkcmFnRXZlbnQuY3VycmVudCwgY3VycmVudE5vZGUsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgYXV0b1BhbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lckJvdW5kcy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgW3hNb3ZlbWVudCwgeU1vdmVtZW50XSA9IGNhbGNBdXRvUGFuKG1vdXNlUG9zaXRpb24uY3VycmVudCwgY29udGFpbmVyQm91bmRzLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmICh4TW92ZW1lbnQgIT09IDAgfHwgeU1vdmVtZW50ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtLCBwYW5CeSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcy5jdXJyZW50LnggPSAobGFzdFBvcy5jdXJyZW50LnggPz8gMCkgLSB4TW92ZW1lbnQgLyB0cmFuc2Zvcm1bMl07XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb3MuY3VycmVudC55ID0gKGxhc3RQb3MuY3VycmVudC55ID8/IDApIC0geU1vdmVtZW50IC8gdHJhbnNmb3JtWzJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFuQnkoeyB4OiB4TW92ZW1lbnQsIHk6IHlNb3ZlbWVudCB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTm9kZXMobGFzdFBvcy5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdXRvUGFuSWQuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhdXRvUGFuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGFydERyYWcgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIG11bHRpU2VsZWN0aW9uQWN0aXZlLCBub2Rlc0RyYWdnYWJsZSwgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzLCBvbk5vZGVEcmFnU3RhcnQsIG9uU2VsZWN0aW9uRHJhZ1N0YXJ0LCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBkcmFnU3RhcnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBvblN0YXJ0ID0gbm9kZUlkID8gb25Ob2RlRHJhZ1N0YXJ0IDogd3JhcFNlbGVjdGlvbkRyYWdGdW5jKG9uU2VsZWN0aW9uRHJhZ1N0YXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoKCFzZWxlY3ROb2Rlc09uRHJhZyB8fCAhaXNTZWxlY3RhYmxlKSAmJiAhbXVsdGlTZWxlY3Rpb25BY3RpdmUgJiYgbm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZUludGVybmFscy5nZXQobm9kZUlkKT8uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVzZXQgc2VsZWN0ZWQgbm9kZXMgd2hlbiBzZWxlY3ROb2Rlc09uRHJhZz1mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJZCAmJiBpc1NlbGVjdGFibGUgJiYgc2VsZWN0Tm9kZXNPbkRyYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlTm9kZUNsaWNrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBub2RlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVSZWY6IG5vZGVSZWYsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludGVyUG9zID0gZ2V0UG9pbnRlclBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBsYXN0UG9zLmN1cnJlbnQgPSBwb2ludGVyUG9zO1xuICAgICAgICAgICAgICAgIGRyYWdJdGVtcy5jdXJyZW50ID0gZ2V0RHJhZ0l0ZW1zKG5vZGVJbnRlcm5hbHMsIG5vZGVzRHJhZ2dhYmxlLCBwb2ludGVyUG9zLCBub2RlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0ICYmIGRyYWdJdGVtcy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjdXJyZW50Tm9kZSwgbm9kZXNdID0gZ2V0RXZlbnRIYW5kbGVyUGFyYW1zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdJdGVtczogZHJhZ0l0ZW1zLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb25TdGFydChldmVudC5zb3VyY2VFdmVudCwgY3VycmVudE5vZGUsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLm9uKCcuZHJhZycsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXIgPSBkcmFnKClcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdzdGFydCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRvbU5vZGUsIG5vZGVEcmFnVGhyZXNob2xkIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZURyYWdUaHJlc2hvbGQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZyhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWJvcnREcmFnLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRlclBvcyA9IGdldFBvaW50ZXJQb3NpdGlvbihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb3MuY3VycmVudCA9IHBvaW50ZXJQb3M7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckJvdW5kcy5jdXJyZW50ID0gZG9tTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jdXJyZW50ID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudC5zb3VyY2VFdmVudCwgY29udGFpbmVyQm91bmRzLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5vbignZHJhZycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludGVyUG9zID0gZ2V0UG9pbnRlclBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdXRvUGFuT25Ob2RlRHJhZywgbm9kZURyYWdUaHJlc2hvbGQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2VFdmVudC50eXBlID09PSAndG91Y2htb3ZlJyAmJiBldmVudC5zb3VyY2VFdmVudC50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0RHJhZy5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnREcmFnLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWF1dG9QYW5TdGFydGVkLmN1cnJlbnQgJiYgZHJhZ1N0YXJ0ZWQuY3VycmVudCAmJiBhdXRvUGFuT25Ob2RlRHJhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1BhblN0YXJ0ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvUGFuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkcmFnU3RhcnRlZC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gcG9pbnRlclBvcy54U25hcHBlZCAtIChsYXN0UG9zPy5jdXJyZW50Py54ID8/IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50ZXJQb3MueVNuYXBwZWQgLSAobGFzdFBvcz8uY3VycmVudD8ueSA/PyAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gbm9kZURyYWdUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERyYWcoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgZXZlbnRzIHdpdGhvdXQgbW92ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0UG9zLmN1cnJlbnQueCAhPT0gcG9pbnRlclBvcy54U25hcHBlZCB8fCBsYXN0UG9zLmN1cnJlbnQueSAhPT0gcG9pbnRlclBvcy55U25hcHBlZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdJdGVtcy5jdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnU3RhcnRlZC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnRXZlbnQuY3VycmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VQb3NpdGlvbi5jdXJyZW50ID0gZ2V0RXZlbnRQb3NpdGlvbihldmVudC5zb3VyY2VFdmVudCwgY29udGFpbmVyQm91bmRzLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTm9kZXMocG9pbnRlclBvcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ2VuZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYWdTdGFydGVkLmN1cnJlbnQgfHwgYWJvcnREcmFnLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXREcmFnZ2luZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9QYW5TdGFydGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZHJhZ1N0YXJ0ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhdXRvUGFuSWQuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnSXRlbXMuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB1cGRhdGVOb2RlUG9zaXRpb25zLCBub2RlSW50ZXJuYWxzLCBvbk5vZGVEcmFnU3RvcCwgb25TZWxlY3Rpb25EcmFnU3RvcCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uU3RvcCA9IG5vZGVJZCA/IG9uTm9kZURyYWdTdG9wIDogd3JhcFNlbGVjdGlvbkRyYWdGdW5jKG9uU2VsZWN0aW9uRHJhZ1N0b3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTm9kZVBvc2l0aW9ucyhkcmFnSXRlbXMuY3VycmVudCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvblN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbY3VycmVudE5vZGUsIG5vZGVzXSA9IGdldEV2ZW50SGFuZGxlclBhcmFtcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0l0ZW1zOiBkcmFnSXRlbXMuY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUludGVybmFscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN0b3AoZXZlbnQuc291cmNlRXZlbnQsIGN1cnJlbnROb2RlLCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRHJhZ2dhYmxlID0gIWV2ZW50LmJ1dHRvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFub0RyYWdDbGFzc05hbWUgfHwgIWhhc1NlbGVjdG9yKHRhcmdldCwgYC4ke25vRHJhZ0NsYXNzTmFtZX1gLCBub2RlUmVmKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghaGFuZGxlU2VsZWN0b3IgfHwgaGFzU2VsZWN0b3IodGFyZ2V0LCBoYW5kbGVTZWxlY3Rvciwgbm9kZVJlZikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNEcmFnZ2FibGU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmNhbGwoZHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5vbignLmRyYWcnLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW1xuICAgICAgICBub2RlUmVmLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgbm9EcmFnQ2xhc3NOYW1lLFxuICAgICAgICBoYW5kbGVTZWxlY3RvcixcbiAgICAgICAgaXNTZWxlY3RhYmxlLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgbm9kZUlkLFxuICAgICAgICBzZWxlY3ROb2Rlc09uRHJhZyxcbiAgICAgICAgZ2V0UG9pbnRlclBvc2l0aW9uLFxuICAgIF0pO1xuICAgIHJldHVybiBkcmFnZ2luZztcbn1cblxuZnVuY3Rpb24gdXNlVXBkYXRlTm9kZVBvc2l0aW9ucygpIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb25zID0gdXNlQ2FsbGJhY2soKHBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIG5vZGVFeHRlbnQsIHVwZGF0ZU5vZGVQb3NpdGlvbnMsIGdldE5vZGVzLCBzbmFwVG9HcmlkLCBzbmFwR3JpZCwgb25FcnJvciwgbm9kZXNEcmFnZ2FibGUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSBnZXROb2RlcygpLmZpbHRlcigobikgPT4gbi5zZWxlY3RlZCAmJiAobi5kcmFnZ2FibGUgfHwgKG5vZGVzRHJhZ2dhYmxlICYmIHR5cGVvZiBuLmRyYWdnYWJsZSA9PT0gJ3VuZGVmaW5lZCcpKSk7XG4gICAgICAgIC8vIGJ5IGRlZmF1bHQgYSBub2RlIG1vdmVzIDVweCBvbiBlYWNoIGtleSBwcmVzcywgb3IgMjBweCBpZiBzaGlmdCBpcyBwcmVzc2VkXG4gICAgICAgIC8vIGlmIHNuYXAgZ3JpZCBpcyBlbmFibGVkLCB3ZSB1c2UgdGhhdCBmb3IgdGhlIHZlbG9jaXR5LlxuICAgICAgICBjb25zdCB4VmVsbyA9IHNuYXBUb0dyaWQgPyBzbmFwR3JpZFswXSA6IDU7XG4gICAgICAgIGNvbnN0IHlWZWxvID0gc25hcFRvR3JpZCA/IHNuYXBHcmlkWzFdIDogNTtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gcGFyYW1zLmlzU2hpZnRQcmVzc2VkID8gNCA6IDE7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uRGlmZlggPSBwYXJhbXMueCAqIHhWZWxvICogZmFjdG9yO1xuICAgICAgICBjb25zdCBwb3NpdGlvbkRpZmZZID0gcGFyYW1zLnkgKiB5VmVsbyAqIGZhY3RvcjtcbiAgICAgICAgY29uc3Qgbm9kZVVwZGF0ZXMgPSBzZWxlY3RlZE5vZGVzLm1hcCgobikgPT4ge1xuICAgICAgICAgICAgaWYgKG4ucG9zaXRpb25BYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IHsgeDogbi5wb3NpdGlvbkFic29sdXRlLnggKyBwb3NpdGlvbkRpZmZYLCB5OiBuLnBvc2l0aW9uQWJzb2x1dGUueSArIHBvc2l0aW9uRGlmZlkgfTtcbiAgICAgICAgICAgICAgICBpZiAoc25hcFRvR3JpZCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0UG9zaXRpb24ueCA9IHNuYXBHcmlkWzBdICogTWF0aC5yb3VuZChuZXh0UG9zaXRpb24ueCAvIHNuYXBHcmlkWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dFBvc2l0aW9uLnkgPSBzbmFwR3JpZFsxXSAqIE1hdGgucm91bmQobmV4dFBvc2l0aW9uLnkgLyBzbmFwR3JpZFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb25BYnNvbHV0ZSwgcG9zaXRpb24gfSA9IGNhbGNOZXh0UG9zaXRpb24obiwgbmV4dFBvc2l0aW9uLCBub2RlSW50ZXJuYWxzLCBub2RlRXh0ZW50LCB1bmRlZmluZWQsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIG4ucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBuLnBvc2l0aW9uQWJzb2x1dGUgPSBwb3NpdGlvbkFic29sdXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGVOb2RlUG9zaXRpb25zKG5vZGVVcGRhdGVzLCB0cnVlLCBmYWxzZSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiB1cGRhdGVQb3NpdGlvbnM7XG59XG5cbmNvbnN0IGFycm93S2V5RGlmZnMgPSB7XG4gICAgQXJyb3dVcDogeyB4OiAwLCB5OiAtMSB9LFxuICAgIEFycm93RG93bjogeyB4OiAwLCB5OiAxIH0sXG4gICAgQXJyb3dMZWZ0OiB7IHg6IC0xLCB5OiAwIH0sXG4gICAgQXJyb3dSaWdodDogeyB4OiAxLCB5OiAwIH0sXG59O1xudmFyIHdyYXBOb2RlID0gKE5vZGVDb21wb25lbnQpID0+IHtcbiAgICBjb25zdCBOb2RlV3JhcHBlciA9ICh7IGlkLCB0eXBlLCBkYXRhLCB4UG9zLCB5UG9zLCB4UG9zT3JpZ2luLCB5UG9zT3JpZ2luLCBzZWxlY3RlZCwgb25DbGljaywgb25Nb3VzZUVudGVyLCBvbk1vdXNlTW92ZSwgb25Nb3VzZUxlYXZlLCBvbkNvbnRleHRNZW51LCBvbkRvdWJsZUNsaWNrLCBzdHlsZSwgY2xhc3NOYW1lLCBpc0RyYWdnYWJsZSwgaXNTZWxlY3RhYmxlLCBpc0Nvbm5lY3RhYmxlLCBpc0ZvY3VzYWJsZSwgc2VsZWN0Tm9kZXNPbkRyYWcsIHNvdXJjZVBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbiwgaGlkZGVuLCByZXNpemVPYnNlcnZlciwgZHJhZ0hhbmRsZSwgekluZGV4LCBpc1BhcmVudCwgbm9EcmFnQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZSwgaW5pdGlhbGl6ZWQsIGRpc2FibGVLZXlib2FyZEExMXksIGFyaWFMYWJlbCwgcmZJZCwgaGFzSGFuZGxlQm91bmRzLCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICAgICAgY29uc3Qgbm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICAgICAgY29uc3QgcHJldk5vZGVSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IHByZXZTb3VyY2VQb3NpdGlvbiA9IHVzZVJlZihzb3VyY2VQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHByZXZUYXJnZXRQb3NpdGlvbiA9IHVzZVJlZih0YXJnZXRQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHByZXZUeXBlID0gdXNlUmVmKHR5cGUpO1xuICAgICAgICBjb25zdCBoYXNQb2ludGVyRXZlbnRzID0gaXNTZWxlY3RhYmxlIHx8IGlzRHJhZ2dhYmxlIHx8IG9uQ2xpY2sgfHwgb25Nb3VzZUVudGVyIHx8IG9uTW91c2VNb3ZlIHx8IG9uTW91c2VMZWF2ZTtcbiAgICAgICAgY29uc3QgdXBkYXRlUG9zaXRpb25zID0gdXNlVXBkYXRlTm9kZVBvc2l0aW9ucygpO1xuICAgICAgICBjb25zdCBvbk1vdXNlRW50ZXJIYW5kbGVyID0gZ2V0TW91c2VIYW5kbGVyKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Nb3VzZUVudGVyKTtcbiAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmVIYW5kbGVyID0gZ2V0TW91c2VIYW5kbGVyKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Nb3VzZU1vdmUpO1xuICAgICAgICBjb25zdCBvbk1vdXNlTGVhdmVIYW5kbGVyID0gZ2V0TW91c2VIYW5kbGVyKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Nb3VzZUxlYXZlKTtcbiAgICAgICAgY29uc3Qgb25Db250ZXh0TWVudUhhbmRsZXIgPSBnZXRNb3VzZUhhbmRsZXIoaWQsIHN0b3JlLmdldFN0YXRlLCBvbkNvbnRleHRNZW51KTtcbiAgICAgICAgY29uc3Qgb25Eb3VibGVDbGlja0hhbmRsZXIgPSBnZXRNb3VzZUhhbmRsZXIoaWQsIHN0b3JlLmdldFN0YXRlLCBvbkRvdWJsZUNsaWNrKTtcbiAgICAgICAgY29uc3Qgb25TZWxlY3ROb2RlSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlRHJhZ1RocmVzaG9sZCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGlmIChpc1NlbGVjdGFibGUgJiYgKCFzZWxlY3ROb2Rlc09uRHJhZyB8fCAhaXNEcmFnZ2FibGUgfHwgbm9kZURyYWdUaHJlc2hvbGQgPiAwKSkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaGFuZGxlciBnZXRzIGNhbGxlZCB3aXRoaW4gdGhlIGRyYWcgc3RhcnQgZXZlbnQgd2hlbiBzZWxlY3ROb2Rlc09uRHJhZz10cnVlXG4gICAgICAgICAgICAgICAgaGFuZGxlTm9kZUNsaWNrKHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICBub2RlUmVmLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gc3RvcmUuZ2V0U3RhdGUoKS5ub2RlSW50ZXJuYWxzLmdldChpZCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb25DbGljayhldmVudCwgeyAuLi5ub2RlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25LZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNJbnB1dERPTU5vZGUoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpc2FibGVLZXlib2FyZEExMXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudFNlbGVjdGlvbktleXMuaW5jbHVkZXMoZXZlbnQua2V5KSAmJiBpc1NlbGVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnNlbGVjdCA9IGV2ZW50LmtleSA9PT0gJ0VzY2FwZSc7XG4gICAgICAgICAgICAgICAgaGFuZGxlTm9kZUNsaWNrKHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRHJhZ2dhYmxlICYmIHNlbGVjdGVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcnJvd0tleURpZmZzLCBldmVudC5rZXkpKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICBhcmlhTGl2ZU1lc3NhZ2U6IGBNb3ZlZCBzZWxlY3RlZCBub2RlICR7ZXZlbnQua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnQXJyb3cnLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpfS4gTmV3IHBvc2l0aW9uLCB4OiAke35+eFBvc30sIHk6ICR7fn55UG9zfWAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgeDogYXJyb3dLZXlEaWZmc1tldmVudC5rZXldLngsXG4gICAgICAgICAgICAgICAgICAgIHk6IGFycm93S2V5RGlmZnNbZXZlbnQua2V5XS55LFxuICAgICAgICAgICAgICAgICAgICBpc1NoaWZ0UHJlc3NlZDogZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyPy51bm9ic2VydmUocHJldk5vZGVSZWYuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZOb2RlUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sIFtdKTtcbiAgICAgICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlUmVmLmN1cnJlbnQgJiYgIWhpZGRlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJOb2RlID0gbm9kZVJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQgfHwgIWhhc0hhbmRsZUJvdW5kcyB8fCBwcmV2Tm9kZVJlZi5jdXJyZW50ICE9PSBjdXJyTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGFsd2F5cyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBub2RlIGdldHMgcmUtbWVhc3VyZWQgLyByZS1pbml0aWFsaXplZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1bm9ic2VydmUgaXQgZmlyc3QgaW4gY2FzZSBpdCBpcyBzdGlsbCBvYnNlcnZlZFxuICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGVSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXI/LnVub2JzZXJ2ZShwcmV2Tm9kZVJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlcj8ub2JzZXJ2ZShjdXJyTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZOb2RlUmVmLmN1cnJlbnQgPSBjdXJyTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFtoaWRkZW4sIGluaXRpYWxpemVkLCBoYXNIYW5kbGVCb3VuZHNdKTtcbiAgICAgICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHVzZXIgcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2VzIHRoZSBzb3VyY2Ugb3IgaGFuZGxlIHBvc2l0aW9uLCB3ZSByZS1pbml0aWFsaXplIHRoZSBub2RlXG4gICAgICAgICAgICBjb25zdCB0eXBlQ2hhbmdlZCA9IHByZXZUeXBlLmN1cnJlbnQgIT09IHR5cGU7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQb3NDaGFuZ2VkID0gcHJldlNvdXJjZVBvc2l0aW9uLmN1cnJlbnQgIT09IHNvdXJjZVBvc2l0aW9uO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9zQ2hhbmdlZCA9IHByZXZUYXJnZXRQb3NpdGlvbi5jdXJyZW50ICE9PSB0YXJnZXRQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmIChub2RlUmVmLmN1cnJlbnQgJiYgKHR5cGVDaGFuZ2VkIHx8IHNvdXJjZVBvc0NoYW5nZWQgfHwgdGFyZ2V0UG9zQ2hhbmdlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZUNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlR5cGUuY3VycmVudCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VQb3NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZTb3VyY2VQb3NpdGlvbi5jdXJyZW50ID0gc291cmNlUG9zaXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRQb3NDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUYXJnZXRQb3NpdGlvbi5jdXJyZW50ID0gdGFyZ2V0UG9zaXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0b3JlLmdldFN0YXRlKCkudXBkYXRlTm9kZURpbWVuc2lvbnMoW3sgaWQsIG5vZGVFbGVtZW50OiBub2RlUmVmLmN1cnJlbnQsIGZvcmNlVXBkYXRlOiB0cnVlIH1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgW2lkLCB0eXBlLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb25dKTtcbiAgICAgICAgY29uc3QgZHJhZ2dpbmcgPSB1c2VEcmFnKHtcbiAgICAgICAgICAgIG5vZGVSZWYsXG4gICAgICAgICAgICBkaXNhYmxlZDogaGlkZGVuIHx8ICFpc0RyYWdnYWJsZSxcbiAgICAgICAgICAgIG5vRHJhZ0NsYXNzTmFtZSxcbiAgICAgICAgICAgIGhhbmRsZVNlbGVjdG9yOiBkcmFnSGFuZGxlLFxuICAgICAgICAgICAgbm9kZUlkOiBpZCxcbiAgICAgICAgICAgIGlzU2VsZWN0YWJsZSxcbiAgICAgICAgICAgIHNlbGVjdE5vZGVzT25EcmFnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjYyhbXG4gICAgICAgICAgICAgICAgJ3JlYWN0LWZsb3dfX25vZGUnLFxuICAgICAgICAgICAgICAgIGByZWFjdC1mbG93X19ub2RlLSR7dHlwZX1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBvdmVyd3JpdGFibGUgYnkgcGFzc2luZyBgbm9wYW5gIGFzIGEgY2xhc3MgbmFtZVxuICAgICAgICAgICAgICAgICAgICBbbm9QYW5DbGFzc05hbWVdOiBpc0RyYWdnYWJsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlOiBpc1NlbGVjdGFibGUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogaXNQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSwgcmVmOiBub2RlUmVmLCBzdHlsZToge1xuICAgICAgICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt4UG9zT3JpZ2lufXB4LCR7eVBvc09yaWdpbn1weClgLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IGhhc1BvaW50ZXJFdmVudHMgPyAnYWxsJyA6ICdub25lJyxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBpbml0aWFsaXplZCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgfSwgXCJkYXRhLWlkXCI6IGlkLCBcImRhdGEtdGVzdGlkXCI6IGByZl9fbm9kZS0ke2lkfWAsIG9uTW91c2VFbnRlcjogb25Nb3VzZUVudGVySGFuZGxlciwgb25Nb3VzZU1vdmU6IG9uTW91c2VNb3ZlSGFuZGxlciwgb25Nb3VzZUxlYXZlOiBvbk1vdXNlTGVhdmVIYW5kbGVyLCBvbkNvbnRleHRNZW51OiBvbkNvbnRleHRNZW51SGFuZGxlciwgb25DbGljazogb25TZWxlY3ROb2RlSGFuZGxlciwgb25Eb3VibGVDbGljazogb25Eb3VibGVDbGlja0hhbmRsZXIsIG9uS2V5RG93bjogaXNGb2N1c2FibGUgPyBvbktleURvd24gOiB1bmRlZmluZWQsIHRhYkluZGV4OiBpc0ZvY3VzYWJsZSA/IDAgOiB1bmRlZmluZWQsIHJvbGU6IGlzRm9jdXNhYmxlID8gJ2J1dHRvbicgOiB1bmRlZmluZWQsIFwiYXJpYS1kZXNjcmliZWRieVwiOiBkaXNhYmxlS2V5Ym9hcmRBMTF5ID8gdW5kZWZpbmVkIDogYCR7QVJJQV9OT0RFX0RFU0NfS0VZfS0ke3JmSWR9YCwgXCJhcmlhLWxhYmVsXCI6IGFyaWFMYWJlbCB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciwgeyB2YWx1ZTogaWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVDb21wb25lbnQsIHsgaWQ6IGlkLCBkYXRhOiBkYXRhLCB0eXBlOiB0eXBlLCB4UG9zOiB4UG9zLCB5UG9zOiB5UG9zLCBzZWxlY3RlZDogc2VsZWN0ZWQsIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUsIHNvdXJjZVBvc2l0aW9uOiBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb246IHRhcmdldFBvc2l0aW9uLCBkcmFnZ2luZzogZHJhZ2dpbmcsIGRyYWdIYW5kbGU6IGRyYWdIYW5kbGUsIHpJbmRleDogekluZGV4IH0pKSkpO1xuICAgIH07XG4gICAgTm9kZVdyYXBwZXIuZGlzcGxheU5hbWUgPSAnTm9kZVdyYXBwZXInO1xuICAgIHJldHVybiBtZW1vKE5vZGVXcmFwcGVyKTtcbn07XG5cbi8qKlxuICogVGhlIG5vZGVzIHNlbGVjdGlvbiByZWN0YW5nbGUgZ2V0cyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXJcbiAqIG1hZGUgYSBzZWxlY3Rpb24gd2l0aCBvbiBvciBzZXZlcmFsIG5vZGVzXG4gKi9cbmNvbnN0IHNlbGVjdG9yJDcgPSAocykgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSBzLmdldE5vZGVzKCkuZmlsdGVyKChuKSA9PiBuLnNlbGVjdGVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXROb2Rlc0JvdW5kcyhzZWxlY3RlZE5vZGVzLCBzLm5vZGVPcmlnaW4pLFxuICAgICAgICB0cmFuc2Zvcm1TdHJpbmc6IGB0cmFuc2xhdGUoJHtzLnRyYW5zZm9ybVswXX1weCwke3MudHJhbnNmb3JtWzFdfXB4KSBzY2FsZSgke3MudHJhbnNmb3JtWzJdfSlgLFxuICAgICAgICB1c2VyU2VsZWN0aW9uQWN0aXZlOiBzLnVzZXJTZWxlY3Rpb25BY3RpdmUsXG4gICAgfTtcbn07XG5mdW5jdGlvbiBOb2Rlc1NlbGVjdGlvbih7IG9uU2VsZWN0aW9uQ29udGV4dE1lbnUsIG5vUGFuQ2xhc3NOYW1lLCBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB4OiBsZWZ0LCB5OiB0b3AsIHRyYW5zZm9ybVN0cmluZywgdXNlclNlbGVjdGlvbkFjdGl2ZSB9ID0gdXNlU3RvcmUoc2VsZWN0b3IkNywgc2hhbGxvdyk7XG4gICAgY29uc3QgdXBkYXRlUG9zaXRpb25zID0gdXNlVXBkYXRlTm9kZVBvc2l0aW9ucygpO1xuICAgIGNvbnN0IG5vZGVSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFkaXNhYmxlS2V5Ym9hcmRBMTF5KSB7XG4gICAgICAgICAgICBub2RlUmVmLmN1cnJlbnQ/LmZvY3VzKHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbZGlzYWJsZUtleWJvYXJkQTExeV0pO1xuICAgIHVzZURyYWcoe1xuICAgICAgICBub2RlUmVmLFxuICAgIH0pO1xuICAgIGlmICh1c2VyU2VsZWN0aW9uQWN0aXZlIHx8ICF3aWR0aCB8fCAhaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gb25TZWxlY3Rpb25Db250ZXh0TWVudVxuICAgICAgICA/IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IHN0b3JlXG4gICAgICAgICAgICAgICAgLmdldFN0YXRlKClcbiAgICAgICAgICAgICAgICAuZ2V0Tm9kZXMoKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKG4pID0+IG4uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgb25TZWxlY3Rpb25Db250ZXh0TWVudShldmVudCwgc2VsZWN0ZWROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25LZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJyb3dLZXlEaWZmcywgZXZlbnQua2V5KSkge1xuICAgICAgICAgICAgdXBkYXRlUG9zaXRpb25zKHtcbiAgICAgICAgICAgICAgICB4OiBhcnJvd0tleURpZmZzW2V2ZW50LmtleV0ueCxcbiAgICAgICAgICAgICAgICB5OiBhcnJvd0tleURpZmZzW2V2ZW50LmtleV0ueSxcbiAgICAgICAgICAgICAgICBpc1NoaWZ0UHJlc3NlZDogZXZlbnQuc2hpZnRLZXksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3dfX25vZGVzc2VsZWN0aW9uJywgJ3JlYWN0LWZsb3dfX2NvbnRhaW5lcicsIG5vUGFuQ2xhc3NOYW1lXSksIHN0eWxlOiB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVN0cmluZyxcbiAgICAgICAgfSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiBub2RlUmVmLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fbm9kZXNzZWxlY3Rpb24tcmVjdFwiLCBvbkNvbnRleHRNZW51OiBvbkNvbnRleHRNZW51LCB0YWJJbmRleDogZGlzYWJsZUtleWJvYXJkQTExeSA/IHVuZGVmaW5lZCA6IC0xLCBvbktleURvd246IGRpc2FibGVLZXlib2FyZEExMXkgPyB1bmRlZmluZWQgOiBvbktleURvd24sIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgfSB9KSkpO1xufVxudmFyIE5vZGVzU2VsZWN0aW9uJDEgPSBtZW1vKE5vZGVzU2VsZWN0aW9uKTtcblxuY29uc3Qgc2VsZWN0b3IkNiA9IChzKSA9PiBzLm5vZGVzU2VsZWN0aW9uQWN0aXZlO1xuY29uc3QgRmxvd1JlbmRlcmVyID0gKHsgY2hpbGRyZW4sIG9uUGFuZUNsaWNrLCBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmUsIG9uUGFuZU1vdXNlTGVhdmUsIG9uUGFuZUNvbnRleHRNZW51LCBvblBhbmVTY3JvbGwsIGRlbGV0ZUtleUNvZGUsIG9uTW92ZSwgb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZCwgc2VsZWN0aW9uS2V5Q29kZSwgc2VsZWN0aW9uT25EcmFnLCBzZWxlY3Rpb25Nb2RlLCBvblNlbGVjdGlvblN0YXJ0LCBvblNlbGVjdGlvbkVuZCwgbXVsdGlTZWxlY3Rpb25LZXlDb2RlLCBwYW5BY3RpdmF0aW9uS2V5Q29kZSwgem9vbUFjdGl2YXRpb25LZXlDb2RlLCBlbGVtZW50c1NlbGVjdGFibGUsIHpvb21PblNjcm9sbCwgem9vbU9uUGluY2gsIHBhbk9uU2Nyb2xsOiBfcGFuT25TY3JvbGwsIHBhbk9uU2Nyb2xsU3BlZWQsIHBhbk9uU2Nyb2xsTW9kZSwgem9vbU9uRG91YmxlQ2xpY2ssIHBhbk9uRHJhZzogX3Bhbk9uRHJhZywgZGVmYXVsdFZpZXdwb3J0LCB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb20sIG1heFpvb20sIHByZXZlbnRTY3JvbGxpbmcsIG9uU2VsZWN0aW9uQ29udGV4dE1lbnUsIG5vV2hlZWxDbGFzc05hbWUsIG5vUGFuQ2xhc3NOYW1lLCBkaXNhYmxlS2V5Ym9hcmRBMTF5LCB9KSA9PiB7XG4gICAgY29uc3Qgbm9kZXNTZWxlY3Rpb25BY3RpdmUgPSB1c2VTdG9yZShzZWxlY3RvciQ2KTtcbiAgICBjb25zdCBzZWxlY3Rpb25LZXlQcmVzc2VkID0gdXNlS2V5UHJlc3Moc2VsZWN0aW9uS2V5Q29kZSk7XG4gICAgY29uc3QgcGFuQWN0aXZhdGlvbktleVByZXNzZWQgPSB1c2VLZXlQcmVzcyhwYW5BY3RpdmF0aW9uS2V5Q29kZSk7XG4gICAgY29uc3QgcGFuT25EcmFnID0gcGFuQWN0aXZhdGlvbktleVByZXNzZWQgfHwgX3Bhbk9uRHJhZztcbiAgICBjb25zdCBwYW5PblNjcm9sbCA9IHBhbkFjdGl2YXRpb25LZXlQcmVzc2VkIHx8IF9wYW5PblNjcm9sbDtcbiAgICBjb25zdCBpc1NlbGVjdGluZyA9IHNlbGVjdGlvbktleVByZXNzZWQgfHwgKHNlbGVjdGlvbk9uRHJhZyAmJiBwYW5PbkRyYWcgIT09IHRydWUpO1xuICAgIHVzZUdsb2JhbEtleUhhbmRsZXIoeyBkZWxldGVLZXlDb2RlLCBtdWx0aVNlbGVjdGlvbktleUNvZGUgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFpvb21QYW5lLCB7IG9uTW92ZTogb25Nb3ZlLCBvbk1vdmVTdGFydDogb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZDogb25Nb3ZlRW5kLCBvblBhbmVDb250ZXh0TWVudTogb25QYW5lQ29udGV4dE1lbnUsIGVsZW1lbnRzU2VsZWN0YWJsZTogZWxlbWVudHNTZWxlY3RhYmxlLCB6b29tT25TY3JvbGw6IHpvb21PblNjcm9sbCwgem9vbU9uUGluY2g6IHpvb21PblBpbmNoLCBwYW5PblNjcm9sbDogcGFuT25TY3JvbGwsIHBhbk9uU2Nyb2xsU3BlZWQ6IHBhbk9uU2Nyb2xsU3BlZWQsIHBhbk9uU2Nyb2xsTW9kZTogcGFuT25TY3JvbGxNb2RlLCB6b29tT25Eb3VibGVDbGljazogem9vbU9uRG91YmxlQ2xpY2ssIHBhbk9uRHJhZzogIXNlbGVjdGlvbktleVByZXNzZWQgJiYgcGFuT25EcmFnLCBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCwgdHJhbnNsYXRlRXh0ZW50OiB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb206IG1pblpvb20sIG1heFpvb206IG1heFpvb20sIHpvb21BY3RpdmF0aW9uS2V5Q29kZTogem9vbUFjdGl2YXRpb25LZXlDb2RlLCBwcmV2ZW50U2Nyb2xsaW5nOiBwcmV2ZW50U2Nyb2xsaW5nLCBub1doZWVsQ2xhc3NOYW1lOiBub1doZWVsQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZTogbm9QYW5DbGFzc05hbWUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lLCB7IG9uU2VsZWN0aW9uU3RhcnQ6IG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kOiBvblNlbGVjdGlvbkVuZCwgb25QYW5lQ2xpY2s6IG9uUGFuZUNsaWNrLCBvblBhbmVNb3VzZUVudGVyOiBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmU6IG9uUGFuZU1vdXNlTW92ZSwgb25QYW5lTW91c2VMZWF2ZTogb25QYW5lTW91c2VMZWF2ZSwgb25QYW5lQ29udGV4dE1lbnU6IG9uUGFuZUNvbnRleHRNZW51LCBvblBhbmVTY3JvbGw6IG9uUGFuZVNjcm9sbCwgcGFuT25EcmFnOiBwYW5PbkRyYWcsIGlzU2VsZWN0aW5nOiAhIWlzU2VsZWN0aW5nLCBzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlIH0sXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIG5vZGVzU2VsZWN0aW9uQWN0aXZlICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVzU2VsZWN0aW9uJDEsIHsgb25TZWxlY3Rpb25Db250ZXh0TWVudTogb25TZWxlY3Rpb25Db250ZXh0TWVudSwgbm9QYW5DbGFzc05hbWU6IG5vUGFuQ2xhc3NOYW1lLCBkaXNhYmxlS2V5Ym9hcmRBMTF5OiBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0pKSkpKTtcbn07XG5GbG93UmVuZGVyZXIuZGlzcGxheU5hbWUgPSAnRmxvd1JlbmRlcmVyJztcbnZhciBGbG93UmVuZGVyZXIkMSA9IG1lbW8oRmxvd1JlbmRlcmVyKTtcblxuZnVuY3Rpb24gdXNlVmlzaWJsZU5vZGVzKG9ubHlSZW5kZXJWaXNpYmxlKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB1c2VTdG9yZSh1c2VDYWxsYmFjaygocykgPT4gb25seVJlbmRlclZpc2libGVcbiAgICAgICAgPyBnZXROb2Rlc0luc2lkZShzLm5vZGVJbnRlcm5hbHMsIHsgeDogMCwgeTogMCwgd2lkdGg6IHMud2lkdGgsIGhlaWdodDogcy5oZWlnaHQgfSwgcy50cmFuc2Zvcm0sIHRydWUpXG4gICAgICAgIDogcy5nZXROb2RlcygpLCBbb25seVJlbmRlclZpc2libGVdKSk7XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlVHlwZXMobm9kZVR5cGVzKSB7XG4gICAgY29uc3Qgc3RhbmRhcmRUeXBlcyA9IHtcbiAgICAgICAgaW5wdXQ6IHdyYXBOb2RlKChub2RlVHlwZXMuaW5wdXQgfHwgSW5wdXROb2RlJDEpKSxcbiAgICAgICAgZGVmYXVsdDogd3JhcE5vZGUoKG5vZGVUeXBlcy5kZWZhdWx0IHx8IERlZmF1bHROb2RlJDEpKSxcbiAgICAgICAgb3V0cHV0OiB3cmFwTm9kZSgobm9kZVR5cGVzLm91dHB1dCB8fCBPdXRwdXROb2RlJDEpKSxcbiAgICAgICAgZ3JvdXA6IHdyYXBOb2RlKChub2RlVHlwZXMuZ3JvdXAgfHwgR3JvdXBOb2RlKSksXG4gICAgfTtcbiAgICBjb25zdCB3cmFwcGVkVHlwZXMgPSB7fTtcbiAgICBjb25zdCBzcGVjaWFsVHlwZXMgPSBPYmplY3Qua2V5cyhub2RlVHlwZXMpXG4gICAgICAgIC5maWx0ZXIoKGspID0+ICFbJ2lucHV0JywgJ2RlZmF1bHQnLCAnb3V0cHV0JywgJ2dyb3VwJ10uaW5jbHVkZXMoaykpXG4gICAgICAgIC5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XG4gICAgICAgIHJlc1trZXldID0gd3JhcE5vZGUoKG5vZGVUeXBlc1trZXldIHx8IERlZmF1bHROb2RlJDEpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB3cmFwcGVkVHlwZXMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YW5kYXJkVHlwZXMsXG4gICAgICAgIC4uLnNwZWNpYWxUeXBlcyxcbiAgICB9O1xufVxuY29uc3QgZ2V0UG9zaXRpb25XaXRoT3JpZ2luID0gKHsgeCwgeSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luLCB9KSA9PiB7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9XG4gICAgaWYgKG9yaWdpblswXSA8IDAgfHwgb3JpZ2luWzFdIDwgMCB8fCBvcmlnaW5bMF0gPiAxIHx8IG9yaWdpblsxXSA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHsgeCwgeSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4IC0gd2lkdGggKiBvcmlnaW5bMF0sXG4gICAgICAgIHk6IHkgLSBoZWlnaHQgKiBvcmlnaW5bMV0sXG4gICAgfTtcbn07XG5cbmNvbnN0IHNlbGVjdG9yJDUgPSAocykgPT4gKHtcbiAgICBub2Rlc0RyYWdnYWJsZTogcy5ub2Rlc0RyYWdnYWJsZSxcbiAgICBub2Rlc0Nvbm5lY3RhYmxlOiBzLm5vZGVzQ29ubmVjdGFibGUsXG4gICAgbm9kZXNGb2N1c2FibGU6IHMubm9kZXNGb2N1c2FibGUsXG4gICAgZWxlbWVudHNTZWxlY3RhYmxlOiBzLmVsZW1lbnRzU2VsZWN0YWJsZSxcbiAgICB1cGRhdGVOb2RlRGltZW5zaW9uczogcy51cGRhdGVOb2RlRGltZW5zaW9ucyxcbiAgICBvbkVycm9yOiBzLm9uRXJyb3IsXG59KTtcbmNvbnN0IE5vZGVSZW5kZXJlciA9IChwcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgbm9kZXNEcmFnZ2FibGUsIG5vZGVzQ29ubmVjdGFibGUsIG5vZGVzRm9jdXNhYmxlLCBlbGVtZW50c1NlbGVjdGFibGUsIHVwZGF0ZU5vZGVEaW1lbnNpb25zLCBvbkVycm9yIH0gPSB1c2VTdG9yZShzZWxlY3RvciQ1LCBzaGFsbG93KTtcbiAgICBjb25zdCBub2RlcyA9IHVzZVZpc2libGVOb2Rlcyhwcm9wcy5vbmx5UmVuZGVyVmlzaWJsZUVsZW1lbnRzKTtcbiAgICBjb25zdCByZXNpemVPYnNlcnZlclJlZiA9IHVzZVJlZigpO1xuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlcyA9IGVudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgICAgICAgICAgICBpZDogZW50cnkudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpLFxuICAgICAgICAgICAgICAgIG5vZGVFbGVtZW50OiBlbnRyeS50YXJnZXQsXG4gICAgICAgICAgICAgICAgZm9yY2VVcGRhdGU6IHRydWUsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB1cGRhdGVOb2RlRGltZW5zaW9ucyh1cGRhdGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyUmVmLmN1cnJlbnQgPSBvYnNlcnZlcjtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyO1xuICAgIH0sIFtdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXJSZWY/LmN1cnJlbnQ/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX25vZGVzXCIsIHN0eWxlOiBjb250YWluZXJTdHlsZSB9LCBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgbGV0IG5vZGVUeXBlID0gbm9kZS50eXBlIHx8ICdkZWZhdWx0JztcbiAgICAgICAgaWYgKCFwcm9wcy5ub2RlVHlwZXNbbm9kZVR5cGVdKSB7XG4gICAgICAgICAgICBvbkVycm9yPy4oJzAwMycsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDAzJ10obm9kZVR5cGUpKTtcbiAgICAgICAgICAgIG5vZGVUeXBlID0gJ2RlZmF1bHQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IE5vZGVDb21wb25lbnQgPSAocHJvcHMubm9kZVR5cGVzW25vZGVUeXBlXSB8fCBwcm9wcy5ub2RlVHlwZXMuZGVmYXVsdCk7XG4gICAgICAgIGNvbnN0IGlzRHJhZ2dhYmxlID0gISEobm9kZS5kcmFnZ2FibGUgfHwgKG5vZGVzRHJhZ2dhYmxlICYmIHR5cGVvZiBub2RlLmRyYWdnYWJsZSA9PT0gJ3VuZGVmaW5lZCcpKTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RhYmxlID0gISEobm9kZS5zZWxlY3RhYmxlIHx8IChlbGVtZW50c1NlbGVjdGFibGUgJiYgdHlwZW9mIG5vZGUuc2VsZWN0YWJsZSA9PT0gJ3VuZGVmaW5lZCcpKTtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0YWJsZSA9ICEhKG5vZGUuY29ubmVjdGFibGUgfHwgKG5vZGVzQ29ubmVjdGFibGUgJiYgdHlwZW9mIG5vZGUuY29ubmVjdGFibGUgPT09ICd1bmRlZmluZWQnKSk7XG4gICAgICAgIGNvbnN0IGlzRm9jdXNhYmxlID0gISEobm9kZS5mb2N1c2FibGUgfHwgKG5vZGVzRm9jdXNhYmxlICYmIHR5cGVvZiBub2RlLmZvY3VzYWJsZSA9PT0gJ3VuZGVmaW5lZCcpKTtcbiAgICAgICAgY29uc3QgY2xhbXBlZFBvc2l0aW9uID0gcHJvcHMubm9kZUV4dGVudFxuICAgICAgICAgICAgPyBjbGFtcFBvc2l0aW9uKG5vZGUucG9zaXRpb25BYnNvbHV0ZSwgcHJvcHMubm9kZUV4dGVudClcbiAgICAgICAgICAgIDogbm9kZS5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICBjb25zdCBwb3NYID0gY2xhbXBlZFBvc2l0aW9uPy54ID8/IDA7XG4gICAgICAgIGNvbnN0IHBvc1kgPSBjbGFtcGVkUG9zaXRpb24/LnkgPz8gMDtcbiAgICAgICAgY29uc3QgcG9zT3JpZ2luID0gZ2V0UG9zaXRpb25XaXRoT3JpZ2luKHtcbiAgICAgICAgICAgIHg6IHBvc1gsXG4gICAgICAgICAgICB5OiBwb3NZLFxuICAgICAgICAgICAgd2lkdGg6IG5vZGUud2lkdGggPz8gMCxcbiAgICAgICAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgPz8gMCxcbiAgICAgICAgICAgIG9yaWdpbjogcHJvcHMubm9kZU9yaWdpbixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChOb2RlQ29tcG9uZW50LCB7IGtleTogbm9kZS5pZCwgaWQ6IG5vZGUuaWQsIGNsYXNzTmFtZTogbm9kZS5jbGFzc05hbWUsIHN0eWxlOiBub2RlLnN0eWxlLCB0eXBlOiBub2RlVHlwZSwgZGF0YTogbm9kZS5kYXRhLCBzb3VyY2VQb3NpdGlvbjogbm9kZS5zb3VyY2VQb3NpdGlvbiB8fCBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFBvc2l0aW9uOiBub2RlLnRhcmdldFBvc2l0aW9uIHx8IFBvc2l0aW9uLlRvcCwgaGlkZGVuOiBub2RlLmhpZGRlbiwgeFBvczogcG9zWCwgeVBvczogcG9zWSwgeFBvc09yaWdpbjogcG9zT3JpZ2luLngsIHlQb3NPcmlnaW46IHBvc09yaWdpbi55LCBzZWxlY3ROb2Rlc09uRHJhZzogcHJvcHMuc2VsZWN0Tm9kZXNPbkRyYWcsIG9uQ2xpY2s6IHByb3BzLm9uTm9kZUNsaWNrLCBvbk1vdXNlRW50ZXI6IHByb3BzLm9uTm9kZU1vdXNlRW50ZXIsIG9uTW91c2VNb3ZlOiBwcm9wcy5vbk5vZGVNb3VzZU1vdmUsIG9uTW91c2VMZWF2ZTogcHJvcHMub25Ob2RlTW91c2VMZWF2ZSwgb25Db250ZXh0TWVudTogcHJvcHMub25Ob2RlQ29udGV4dE1lbnUsIG9uRG91YmxlQ2xpY2s6IHByb3BzLm9uTm9kZURvdWJsZUNsaWNrLCBzZWxlY3RlZDogISFub2RlLnNlbGVjdGVkLCBpc0RyYWdnYWJsZTogaXNEcmFnZ2FibGUsIGlzU2VsZWN0YWJsZTogaXNTZWxlY3RhYmxlLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlLCBpc0ZvY3VzYWJsZTogaXNGb2N1c2FibGUsIHJlc2l6ZU9ic2VydmVyOiByZXNpemVPYnNlcnZlciwgZHJhZ0hhbmRsZTogbm9kZS5kcmFnSGFuZGxlLCB6SW5kZXg6IG5vZGVbaW50ZXJuYWxzU3ltYm9sXT8ueiA/PyAwLCBpc1BhcmVudDogISFub2RlW2ludGVybmFsc1N5bWJvbF0/LmlzUGFyZW50LCBub0RyYWdDbGFzc05hbWU6IHByb3BzLm5vRHJhZ0NsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWU6IHByb3BzLm5vUGFuQ2xhc3NOYW1lLCBpbml0aWFsaXplZDogISFub2RlLndpZHRoICYmICEhbm9kZS5oZWlnaHQsIHJmSWQ6IHByb3BzLnJmSWQsIGRpc2FibGVLZXlib2FyZEExMXk6IHByb3BzLmRpc2FibGVLZXlib2FyZEExMXksIGFyaWFMYWJlbDogbm9kZS5hcmlhTGFiZWwsIGhhc0hhbmRsZUJvdW5kczogISFub2RlW2ludGVybmFsc1N5bWJvbF0/LmhhbmRsZUJvdW5kcyB9KSk7XG4gICAgfSkpKTtcbn07XG5Ob2RlUmVuZGVyZXIuZGlzcGxheU5hbWUgPSAnTm9kZVJlbmRlcmVyJztcbnZhciBOb2RlUmVuZGVyZXIkMSA9IG1lbW8oTm9kZVJlbmRlcmVyKTtcblxuY29uc3Qgc2hpZnRYID0gKHgsIHNoaWZ0LCBwb3NpdGlvbikgPT4ge1xuICAgIGlmIChwb3NpdGlvbiA9PT0gUG9zaXRpb24uTGVmdClcbiAgICAgICAgcmV0dXJuIHggLSBzaGlmdDtcbiAgICBpZiAocG9zaXRpb24gPT09IFBvc2l0aW9uLlJpZ2h0KVxuICAgICAgICByZXR1cm4geCArIHNoaWZ0O1xuICAgIHJldHVybiB4O1xufTtcbmNvbnN0IHNoaWZ0WSA9ICh5LCBzaGlmdCwgcG9zaXRpb24pID0+IHtcbiAgICBpZiAocG9zaXRpb24gPT09IFBvc2l0aW9uLlRvcClcbiAgICAgICAgcmV0dXJuIHkgLSBzaGlmdDtcbiAgICBpZiAocG9zaXRpb24gPT09IFBvc2l0aW9uLkJvdHRvbSlcbiAgICAgICAgcmV0dXJuIHkgKyBzaGlmdDtcbiAgICByZXR1cm4geTtcbn07XG5jb25zdCBFZGdlVXBkYXRlckNsYXNzTmFtZSA9ICdyZWFjdC1mbG93X19lZGdldXBkYXRlcic7XG5jb25zdCBFZGdlQW5jaG9yID0gKHsgcG9zaXRpb24sIGNlbnRlclgsIGNlbnRlclksIHJhZGl1cyA9IDEwLCBvbk1vdXNlRG93biwgb25Nb3VzZUVudGVyLCBvbk1vdXNlT3V0LCB0eXBlLCB9KSA9PiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7IG9uTW91c2VEb3duOiBvbk1vdXNlRG93biwgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXIsIG9uTW91c2VPdXQ6IG9uTW91c2VPdXQsIGNsYXNzTmFtZTogY2MoW0VkZ2VVcGRhdGVyQ2xhc3NOYW1lLCBgJHtFZGdlVXBkYXRlckNsYXNzTmFtZX0tJHt0eXBlfWBdKSwgY3g6IHNoaWZ0WChjZW50ZXJYLCByYWRpdXMsIHBvc2l0aW9uKSwgY3k6IHNoaWZ0WShjZW50ZXJZLCByYWRpdXMsIHBvc2l0aW9uKSwgcjogcmFkaXVzLCBzdHJva2U6IFwidHJhbnNwYXJlbnRcIiwgZmlsbDogXCJ0cmFuc3BhcmVudFwiIH0pKTtcblxuY29uc3QgYWx3YXlzVmFsaWRDb25uZWN0aW9uID0gKCkgPT4gdHJ1ZTtcbnZhciB3cmFwRWRnZSA9IChFZGdlQ29tcG9uZW50KSA9PiB7XG4gICAgY29uc3QgRWRnZVdyYXBwZXIgPSAoeyBpZCwgY2xhc3NOYW1lLCB0eXBlLCBkYXRhLCBvbkNsaWNrLCBvbkVkZ2VEb3VibGVDbGljaywgc2VsZWN0ZWQsIGFuaW1hdGVkLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBzb3VyY2UsIHRhcmdldCwgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgc291cmNlUG9zaXRpb24sIHRhcmdldFBvc2l0aW9uLCBlbGVtZW50c1NlbGVjdGFibGUsIGhpZGRlbiwgc291cmNlSGFuZGxlSWQsIHRhcmdldEhhbmRsZUlkLCBvbkNvbnRleHRNZW51LCBvbk1vdXNlRW50ZXIsIG9uTW91c2VNb3ZlLCBvbk1vdXNlTGVhdmUsIHJlY29ubmVjdFJhZGl1cywgb25SZWNvbm5lY3QsIG9uUmVjb25uZWN0U3RhcnQsIG9uUmVjb25uZWN0RW5kLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCByZklkLCBhcmlhTGFiZWwsIGlzRm9jdXNhYmxlLCBpc1JlY29ubmVjdGFibGUsIHBhdGhPcHRpb25zLCBpbnRlcmFjdGlvbldpZHRoLCBkaXNhYmxlS2V5Ym9hcmRBMTF5LCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2VSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgICAgIGNvbnN0IFt1cGRhdGVIb3Zlciwgc2V0VXBkYXRlSG92ZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgICAgICBjb25zdCBbdXBkYXRpbmcsIHNldFVwZGF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgICAgICBjb25zdCBtYXJrZXJTdGFydFVybCA9IHVzZU1lbW8oKCkgPT4gYHVybCgnIyR7Z2V0TWFya2VySWQobWFya2VyU3RhcnQsIHJmSWQpfScpYCwgW21hcmtlclN0YXJ0LCByZklkXSk7XG4gICAgICAgIGNvbnN0IG1hcmtlckVuZFVybCA9IHVzZU1lbW8oKCkgPT4gYHVybCgnIyR7Z2V0TWFya2VySWQobWFya2VyRW5kLCByZklkKX0nKWAsIFttYXJrZXJFbmQsIHJmSWRdKTtcbiAgICAgICAgaWYgKGhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb25FZGdlQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZWRnZXMsIGFkZFNlbGVjdGVkRWRnZXMsIHVuc2VsZWN0Tm9kZXNBbmRFZGdlcywgbXVsdGlTZWxlY3Rpb25BY3RpdmUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBlZGdlID0gZWRnZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFlZGdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzU2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgbm9kZXNTZWxlY3Rpb25BY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlLnNlbGVjdGVkICYmIG11bHRpU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0Tm9kZXNBbmRFZGdlcyh7IG5vZGVzOiBbXSwgZWRnZXM6IFtlZGdlXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWRnZVJlZi5jdXJyZW50Py5ibHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRTZWxlY3RlZEVkZ2VzKFtpZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICAgICAgICAgICAgb25DbGljayhldmVudCwgZWRnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uRWRnZURvdWJsZUNsaWNrSGFuZGxlciA9IGdldE1vdXNlSGFuZGxlciQxKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25FZGdlRG91YmxlQ2xpY2spO1xuICAgICAgICBjb25zdCBvbkVkZ2VDb250ZXh0TWVudSA9IGdldE1vdXNlSGFuZGxlciQxKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Db250ZXh0TWVudSk7XG4gICAgICAgIGNvbnN0IG9uRWRnZU1vdXNlRW50ZXIgPSBnZXRNb3VzZUhhbmRsZXIkMShpZCwgc3RvcmUuZ2V0U3RhdGUsIG9uTW91c2VFbnRlcik7XG4gICAgICAgIGNvbnN0IG9uRWRnZU1vdXNlTW92ZSA9IGdldE1vdXNlSGFuZGxlciQxKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Nb3VzZU1vdmUpO1xuICAgICAgICBjb25zdCBvbkVkZ2VNb3VzZUxlYXZlID0gZ2V0TW91c2VIYW5kbGVyJDEoaWQsIHN0b3JlLmdldFN0YXRlLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgICBjb25zdCBoYW5kbGVFZGdlVXBkYXRlciA9IChldmVudCwgaXNTb3VyY2VIYW5kbGUpID0+IHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHRyaWdnZXJpbmcgZWRnZSB1cGRhdGVyIGlmIG1vdXNlIGJ0biBpcyBub3QgbGVmdFxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZWRnZXMsIGlzVmFsaWRDb25uZWN0aW9uOiBpc1ZhbGlkQ29ubmVjdGlvblN0b3JlIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkID0gaXNTb3VyY2VIYW5kbGUgPyB0YXJnZXQgOiBzb3VyY2U7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVJZCA9IChpc1NvdXJjZUhhbmRsZSA/IHRhcmdldEhhbmRsZUlkIDogc291cmNlSGFuZGxlSWQpIHx8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVUeXBlID0gaXNTb3VyY2VIYW5kbGUgPyAndGFyZ2V0JyA6ICdzb3VyY2UnO1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZENvbm5lY3Rpb24gPSBpc1ZhbGlkQ29ubmVjdGlvblN0b3JlIHx8IGFsd2F5c1ZhbGlkQ29ubmVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGlzVGFyZ2V0ID0gaXNTb3VyY2VIYW5kbGU7XG4gICAgICAgICAgICBjb25zdCBlZGdlID0gZWRnZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICAgICAgICAgICAgc2V0VXBkYXRpbmcodHJ1ZSk7XG4gICAgICAgICAgICBvblJlY29ubmVjdFN0YXJ0Py4oZXZlbnQsIGVkZ2UsIGhhbmRsZVR5cGUpO1xuICAgICAgICAgICAgY29uc3QgX29uUmVjb25uZWN0RW5kID0gKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFVwZGF0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBvblJlY29ubmVjdEVuZD8uKGV2dCwgZWRnZSwgaGFuZGxlVHlwZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25Db25uZWN0RWRnZSA9IChjb25uZWN0aW9uKSA9PiBvblJlY29ubmVjdD8uKGVkZ2UsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgaGFuZGxlUG9pbnRlckRvd24oe1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGhhbmRsZUlkLFxuICAgICAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgICAgICBvbkNvbm5lY3Q6IG9uQ29ubmVjdEVkZ2UsXG4gICAgICAgICAgICAgICAgaXNUYXJnZXQsXG4gICAgICAgICAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICAgICAgICAgIHNldFN0YXRlOiBzdG9yZS5zZXRTdGF0ZSxcbiAgICAgICAgICAgICAgICBpc1ZhbGlkQ29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBlZGdlVXBkYXRlclR5cGU6IGhhbmRsZVR5cGUsXG4gICAgICAgICAgICAgICAgb25SZWNvbm5lY3RFbmQ6IF9vblJlY29ubmVjdEVuZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkVkZ2VVcGRhdGVyU291cmNlTW91c2VEb3duID0gKGV2ZW50KSA9PiBoYW5kbGVFZGdlVXBkYXRlcihldmVudCwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9uRWRnZVVwZGF0ZXJUYXJnZXRNb3VzZURvd24gPSAoZXZlbnQpID0+IGhhbmRsZUVkZ2VVcGRhdGVyKGV2ZW50LCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IG9uRWRnZVVwZGF0ZXJNb3VzZUVudGVyID0gKCkgPT4gc2V0VXBkYXRlSG92ZXIodHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9uRWRnZVVwZGF0ZXJNb3VzZU91dCA9ICgpID0+IHNldFVwZGF0ZUhvdmVyKGZhbHNlKTtcbiAgICAgICAgY29uc3QgaW5hY3RpdmUgPSAhZWxlbWVudHNTZWxlY3RhYmxlICYmICFvbkNsaWNrO1xuICAgICAgICBjb25zdCBvbktleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghZGlzYWJsZUtleWJvYXJkQTExeSAmJiBlbGVtZW50U2VsZWN0aW9uS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpICYmIGVsZW1lbnRzU2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzLCBhZGRTZWxlY3RlZEVkZ2VzLCBlZGdlcyB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnNlbGVjdCA9IGV2ZW50LmtleSA9PT0gJ0VzY2FwZSc7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2VSZWYuY3VycmVudD8uYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdE5vZGVzQW5kRWRnZXMoeyBlZGdlczogW2VkZ2VzLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKV0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRTZWxlY3RlZEVkZ2VzKFtpZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7IGNsYXNzTmFtZTogY2MoW1xuICAgICAgICAgICAgICAgICdyZWFjdC1mbG93X19lZGdlJyxcbiAgICAgICAgICAgICAgICBgcmVhY3QtZmxvd19fZWRnZS0ke3R5cGV9YCxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgeyBzZWxlY3RlZCwgYW5pbWF0ZWQsIGluYWN0aXZlLCB1cGRhdGluZzogdXBkYXRlSG92ZXIgfSxcbiAgICAgICAgICAgIF0pLCBvbkNsaWNrOiBvbkVkZ2VDbGljaywgb25Eb3VibGVDbGljazogb25FZGdlRG91YmxlQ2xpY2tIYW5kbGVyLCBvbkNvbnRleHRNZW51OiBvbkVkZ2VDb250ZXh0TWVudSwgb25Nb3VzZUVudGVyOiBvbkVkZ2VNb3VzZUVudGVyLCBvbk1vdXNlTW92ZTogb25FZGdlTW91c2VNb3ZlLCBvbk1vdXNlTGVhdmU6IG9uRWRnZU1vdXNlTGVhdmUsIG9uS2V5RG93bjogaXNGb2N1c2FibGUgPyBvbktleURvd24gOiB1bmRlZmluZWQsIHRhYkluZGV4OiBpc0ZvY3VzYWJsZSA/IDAgOiB1bmRlZmluZWQsIHJvbGU6IGlzRm9jdXNhYmxlID8gJ2J1dHRvbicgOiAnaW1nJywgXCJkYXRhLXRlc3RpZFwiOiBgcmZfX2VkZ2UtJHtpZH1gLCBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsID09PSBudWxsID8gdW5kZWZpbmVkIDogYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogYEVkZ2UgZnJvbSAke3NvdXJjZX0gdG8gJHt0YXJnZXR9YCwgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IGlzRm9jdXNhYmxlID8gYCR7QVJJQV9FREdFX0RFU0NfS0VZfS0ke3JmSWR9YCA6IHVuZGVmaW5lZCwgcmVmOiBlZGdlUmVmIH0sXG4gICAgICAgICAgICAhdXBkYXRpbmcgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRWRnZUNvbXBvbmVudCwgeyBpZDogaWQsIHNvdXJjZTogc291cmNlLCB0YXJnZXQ6IHRhcmdldCwgc2VsZWN0ZWQ6IHNlbGVjdGVkLCBhbmltYXRlZDogYW5pbWF0ZWQsIGxhYmVsOiBsYWJlbCwgbGFiZWxTdHlsZTogbGFiZWxTdHlsZSwgbGFiZWxTaG93Qmc6IGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGU6IGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmc6IGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzOiBsYWJlbEJnQm9yZGVyUmFkaXVzLCBkYXRhOiBkYXRhLCBzdHlsZTogc3R5bGUsIHNvdXJjZVg6IHNvdXJjZVgsIHNvdXJjZVk6IHNvdXJjZVksIHRhcmdldFg6IHRhcmdldFgsIHRhcmdldFk6IHRhcmdldFksIHNvdXJjZVBvc2l0aW9uOiBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb246IHRhcmdldFBvc2l0aW9uLCBzb3VyY2VIYW5kbGVJZDogc291cmNlSGFuZGxlSWQsIHRhcmdldEhhbmRsZUlkOiB0YXJnZXRIYW5kbGVJZCwgbWFya2VyU3RhcnQ6IG1hcmtlclN0YXJ0VXJsLCBtYXJrZXJFbmQ6IG1hcmtlckVuZFVybCwgcGF0aE9wdGlvbnM6IHBhdGhPcHRpb25zLCBpbnRlcmFjdGlvbldpZHRoOiBpbnRlcmFjdGlvbldpZHRoIH0pKSxcbiAgICAgICAgICAgIGlzUmVjb25uZWN0YWJsZSAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICAoaXNSZWNvbm5lY3RhYmxlID09PSAnc291cmNlJyB8fCBpc1JlY29ubmVjdGFibGUgPT09IHRydWUpICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KEVkZ2VBbmNob3IsIHsgcG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCBjZW50ZXJYOiBzb3VyY2VYLCBjZW50ZXJZOiBzb3VyY2VZLCByYWRpdXM6IHJlY29ubmVjdFJhZGl1cywgb25Nb3VzZURvd246IG9uRWRnZVVwZGF0ZXJTb3VyY2VNb3VzZURvd24sIG9uTW91c2VFbnRlcjogb25FZGdlVXBkYXRlck1vdXNlRW50ZXIsIG9uTW91c2VPdXQ6IG9uRWRnZVVwZGF0ZXJNb3VzZU91dCwgdHlwZTogXCJzb3VyY2VcIiB9KSksXG4gICAgICAgICAgICAgICAgKGlzUmVjb25uZWN0YWJsZSA9PT0gJ3RhcmdldCcgfHwgaXNSZWNvbm5lY3RhYmxlID09PSB0cnVlKSAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChFZGdlQW5jaG9yLCB7IHBvc2l0aW9uOiB0YXJnZXRQb3NpdGlvbiwgY2VudGVyWDogdGFyZ2V0WCwgY2VudGVyWTogdGFyZ2V0WSwgcmFkaXVzOiByZWNvbm5lY3RSYWRpdXMsIG9uTW91c2VEb3duOiBvbkVkZ2VVcGRhdGVyVGFyZ2V0TW91c2VEb3duLCBvbk1vdXNlRW50ZXI6IG9uRWRnZVVwZGF0ZXJNb3VzZUVudGVyLCBvbk1vdXNlT3V0OiBvbkVkZ2VVcGRhdGVyTW91c2VPdXQsIHR5cGU6IFwidGFyZ2V0XCIgfSkpKSkpKTtcbiAgICB9O1xuICAgIEVkZ2VXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ0VkZ2VXcmFwcGVyJztcbiAgICByZXR1cm4gbWVtbyhFZGdlV3JhcHBlcik7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVFZGdlVHlwZXMoZWRnZVR5cGVzKSB7XG4gICAgY29uc3Qgc3RhbmRhcmRUeXBlcyA9IHtcbiAgICAgICAgZGVmYXVsdDogd3JhcEVkZ2UoKGVkZ2VUeXBlcy5kZWZhdWx0IHx8IEJlemllckVkZ2UpKSxcbiAgICAgICAgc3RyYWlnaHQ6IHdyYXBFZGdlKChlZGdlVHlwZXMuYmV6aWVyIHx8IFN0cmFpZ2h0RWRnZSkpLFxuICAgICAgICBzdGVwOiB3cmFwRWRnZSgoZWRnZVR5cGVzLnN0ZXAgfHwgU3RlcEVkZ2UpKSxcbiAgICAgICAgc21vb3Roc3RlcDogd3JhcEVkZ2UoKGVkZ2VUeXBlcy5zdGVwIHx8IFNtb290aFN0ZXBFZGdlKSksXG4gICAgICAgIHNpbXBsZWJlemllcjogd3JhcEVkZ2UoKGVkZ2VUeXBlcy5zaW1wbGViZXppZXIgfHwgU2ltcGxlQmV6aWVyRWRnZSkpLFxuICAgIH07XG4gICAgY29uc3Qgd3JhcHBlZFR5cGVzID0ge307XG4gICAgY29uc3Qgc3BlY2lhbFR5cGVzID0gT2JqZWN0LmtleXMoZWRnZVR5cGVzKVxuICAgICAgICAuZmlsdGVyKChrKSA9PiAhWydkZWZhdWx0JywgJ2JlemllciddLmluY2x1ZGVzKGspKVxuICAgICAgICAucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICByZXNba2V5XSA9IHdyYXBFZGdlKChlZGdlVHlwZXNba2V5XSB8fCBCZXppZXJFZGdlKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfSwgd3JhcHBlZFR5cGVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGFuZGFyZFR5cGVzLFxuICAgICAgICAuLi5zcGVjaWFsVHlwZXMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEhhbmRsZVBvc2l0aW9uKHBvc2l0aW9uLCBub2RlUmVjdCwgaGFuZGxlID0gbnVsbCkge1xuICAgIGNvbnN0IHggPSAoaGFuZGxlPy54IHx8IDApICsgbm9kZVJlY3QueDtcbiAgICBjb25zdCB5ID0gKGhhbmRsZT8ueSB8fCAwKSArIG5vZGVSZWN0Lnk7XG4gICAgY29uc3Qgd2lkdGggPSBoYW5kbGU/LndpZHRoIHx8IG5vZGVSZWN0LndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IGhhbmRsZT8uaGVpZ2h0IHx8IG5vZGVSZWN0LmhlaWdodDtcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgUG9zaXRpb24uVG9wOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFBvc2l0aW9uLlJpZ2h0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiB4ICsgd2lkdGgsXG4gICAgICAgICAgICAgICAgeTogeSArIGhlaWdodCAvIDIsXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkJvdHRvbTpcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogeCArIHdpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHk6IHkgKyBoZWlnaHQgLyAyLFxuICAgICAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRIYW5kbGUoYm91bmRzLCBoYW5kbGVJZCkge1xuICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoYm91bmRzLmxlbmd0aCA9PT0gMSB8fCAhaGFuZGxlSWQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kc1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaGFuZGxlSWQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kcy5maW5kKChkKSA9PiBkLmlkID09PSBoYW5kbGVJZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBnZXRFZGdlUG9zaXRpb25zID0gKHNvdXJjZU5vZGVSZWN0LCBzb3VyY2VIYW5kbGUsIHNvdXJjZVBvc2l0aW9uLCB0YXJnZXROb2RlUmVjdCwgdGFyZ2V0SGFuZGxlLCB0YXJnZXRQb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZUhhbmRsZVBvcyA9IGdldEhhbmRsZVBvc2l0aW9uKHNvdXJjZVBvc2l0aW9uLCBzb3VyY2VOb2RlUmVjdCwgc291cmNlSGFuZGxlKTtcbiAgICBjb25zdCB0YXJnZXRIYW5kbGVQb3MgPSBnZXRIYW5kbGVQb3NpdGlvbih0YXJnZXRQb3NpdGlvbiwgdGFyZ2V0Tm9kZVJlY3QsIHRhcmdldEhhbmRsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlWDogc291cmNlSGFuZGxlUG9zLngsXG4gICAgICAgIHNvdXJjZVk6IHNvdXJjZUhhbmRsZVBvcy55LFxuICAgICAgICB0YXJnZXRYOiB0YXJnZXRIYW5kbGVQb3MueCxcbiAgICAgICAgdGFyZ2V0WTogdGFyZ2V0SGFuZGxlUG9zLnksXG4gICAgfTtcbn07XG5mdW5jdGlvbiBpc0VkZ2VWaXNpYmxlKHsgc291cmNlUG9zLCB0YXJnZXRQb3MsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIHRyYW5zZm9ybSwgfSkge1xuICAgIGNvbnN0IGVkZ2VCb3ggPSB7XG4gICAgICAgIHg6IE1hdGgubWluKHNvdXJjZVBvcy54LCB0YXJnZXRQb3MueCksXG4gICAgICAgIHk6IE1hdGgubWluKHNvdXJjZVBvcy55LCB0YXJnZXRQb3MueSksXG4gICAgICAgIHgyOiBNYXRoLm1heChzb3VyY2VQb3MueCArIHNvdXJjZVdpZHRoLCB0YXJnZXRQb3MueCArIHRhcmdldFdpZHRoKSxcbiAgICAgICAgeTI6IE1hdGgubWF4KHNvdXJjZVBvcy55ICsgc291cmNlSGVpZ2h0LCB0YXJnZXRQb3MueSArIHRhcmdldEhlaWdodCksXG4gICAgfTtcbiAgICBpZiAoZWRnZUJveC54ID09PSBlZGdlQm94LngyKSB7XG4gICAgICAgIGVkZ2VCb3gueDIgKz0gMTtcbiAgICB9XG4gICAgaWYgKGVkZ2VCb3gueSA9PT0gZWRnZUJveC55Mikge1xuICAgICAgICBlZGdlQm94LnkyICs9IDE7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSByZWN0VG9Cb3goe1xuICAgICAgICB4OiAoMCAtIHRyYW5zZm9ybVswXSkgLyB0cmFuc2Zvcm1bMl0sXG4gICAgICAgIHk6ICgwIC0gdHJhbnNmb3JtWzFdKSAvIHRyYW5zZm9ybVsyXSxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC8gdHJhbnNmb3JtWzJdLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAvIHRyYW5zZm9ybVsyXSxcbiAgICB9KTtcbiAgICBjb25zdCB4T3ZlcmxhcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZpZXdCb3gueDIsIGVkZ2VCb3gueDIpIC0gTWF0aC5tYXgodmlld0JveC54LCBlZGdlQm94LngpKTtcbiAgICBjb25zdCB5T3ZlcmxhcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHZpZXdCb3gueTIsIGVkZ2VCb3gueTIpIC0gTWF0aC5tYXgodmlld0JveC55LCBlZGdlQm94LnkpKTtcbiAgICBjb25zdCBvdmVybGFwcGluZ0FyZWEgPSBNYXRoLmNlaWwoeE92ZXJsYXAgKiB5T3ZlcmxhcCk7XG4gICAgcmV0dXJuIG92ZXJsYXBwaW5nQXJlYSA+IDA7XG59XG5mdW5jdGlvbiBnZXROb2RlRGF0YShub2RlKSB7XG4gICAgY29uc3QgaGFuZGxlQm91bmRzID0gbm9kZT8uW2ludGVybmFsc1N5bWJvbF0/LmhhbmRsZUJvdW5kcyB8fCBudWxsO1xuICAgIGNvbnN0IGlzVmFsaWQgPSBoYW5kbGVCb3VuZHMgJiZcbiAgICAgICAgbm9kZT8ud2lkdGggJiZcbiAgICAgICAgbm9kZT8uaGVpZ2h0ICYmXG4gICAgICAgIHR5cGVvZiBub2RlPy5wb3NpdGlvbkFic29sdXRlPy54ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0eXBlb2Ygbm9kZT8ucG9zaXRpb25BYnNvbHV0ZT8ueSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgICAgeDogbm9kZT8ucG9zaXRpb25BYnNvbHV0ZT8ueCB8fCAwLFxuICAgICAgICAgICAgeTogbm9kZT8ucG9zaXRpb25BYnNvbHV0ZT8ueSB8fCAwLFxuICAgICAgICAgICAgd2lkdGg6IG5vZGU/LndpZHRoIHx8IDAsXG4gICAgICAgICAgICBoZWlnaHQ6IG5vZGU/LmhlaWdodCB8fCAwLFxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVCb3VuZHMsXG4gICAgICAgICEhaXNWYWxpZCxcbiAgICBdO1xufVxuXG5jb25zdCBkZWZhdWx0RWRnZVRyZWUgPSBbeyBsZXZlbDogMCwgaXNNYXhMZXZlbDogdHJ1ZSwgZWRnZXM6IFtdIH1dO1xuZnVuY3Rpb24gZ3JvdXBFZGdlc0J5WkxldmVsKGVkZ2VzLCBub2RlSW50ZXJuYWxzLCBlbGV2YXRlRWRnZXNPblNlbGVjdCA9IGZhbHNlKSB7XG4gICAgbGV0IG1heExldmVsID0gLTE7XG4gICAgY29uc3QgbGV2ZWxMb29rdXAgPSBlZGdlcy5yZWR1Y2UoKHRyZWUsIGVkZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaGFzWkluZGV4ID0gaXNOdW1lcmljKGVkZ2UuekluZGV4KTtcbiAgICAgICAgbGV0IHogPSBoYXNaSW5kZXggPyBlZGdlLnpJbmRleCA6IDA7XG4gICAgICAgIGlmIChlbGV2YXRlRWRnZXNPblNlbGVjdCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KGVkZ2UudGFyZ2V0KTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChlZGdlLnNvdXJjZSk7XG4gICAgICAgICAgICBjb25zdCBlZGdlT3JDb25uZWN0ZWROb2RlU2VsZWN0ZWQgPSBlZGdlLnNlbGVjdGVkIHx8IHRhcmdldE5vZGU/LnNlbGVjdGVkIHx8IHNvdXJjZU5vZGU/LnNlbGVjdGVkO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRaSW5kZXggPSBNYXRoLm1heChzb3VyY2VOb2RlPy5baW50ZXJuYWxzU3ltYm9sXT8ueiB8fCAwLCB0YXJnZXROb2RlPy5baW50ZXJuYWxzU3ltYm9sXT8ueiB8fCAwLCAxMDAwKTtcbiAgICAgICAgICAgIHogPSAoaGFzWkluZGV4ID8gZWRnZS56SW5kZXggOiAwKSArIChlZGdlT3JDb25uZWN0ZWROb2RlU2VsZWN0ZWQgPyBzZWxlY3RlZFpJbmRleCA6IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmVlW3pdKSB7XG4gICAgICAgICAgICB0cmVlW3pdLnB1c2goZWRnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmVlW3pdID0gW2VkZ2VdO1xuICAgICAgICB9XG4gICAgICAgIG1heExldmVsID0geiA+IG1heExldmVsID8geiA6IG1heExldmVsO1xuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9LCB7fSk7XG4gICAgY29uc3QgZWRnZVRyZWUgPSBPYmplY3QuZW50cmllcyhsZXZlbExvb2t1cCkubWFwKChba2V5LCBlZGdlc10pID0+IHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSAra2V5O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWRnZXMsXG4gICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICAgIGlzTWF4TGV2ZWw6IGxldmVsID09PSBtYXhMZXZlbCxcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBpZiAoZWRnZVRyZWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RWRnZVRyZWU7XG4gICAgfVxuICAgIHJldHVybiBlZGdlVHJlZTtcbn1cbmZ1bmN0aW9uIHVzZVZpc2libGVFZGdlcyhvbmx5UmVuZGVyVmlzaWJsZSwgbm9kZUludGVybmFscywgZWxldmF0ZUVkZ2VzT25TZWxlY3QpIHtcbiAgICBjb25zdCBlZGdlcyA9IHVzZVN0b3JlKHVzZUNhbGxiYWNrKChzKSA9PiB7XG4gICAgICAgIGlmICghb25seVJlbmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzLmVkZ2VzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzLmVkZ2VzLmZpbHRlcigoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KGUuc291cmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChlLnRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm4gKHNvdXJjZU5vZGU/LndpZHRoICYmXG4gICAgICAgICAgICAgICAgc291cmNlTm9kZT8uaGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZT8ud2lkdGggJiZcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlPy5oZWlnaHQgJiZcbiAgICAgICAgICAgICAgICBpc0VkZ2VWaXNpYmxlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlUG9zOiBzb3VyY2VOb2RlLnBvc2l0aW9uQWJzb2x1dGUgfHwgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFBvczogdGFyZ2V0Tm9kZS5wb3NpdGlvbkFic29sdXRlIHx8IHsgeDogMCwgeTogMCB9LFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VXaWR0aDogc291cmNlTm9kZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSGVpZ2h0OiBzb3VyY2VOb2RlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IHRhcmdldE5vZGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEhlaWdodDogdGFyZ2V0Tm9kZS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHMudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW29ubHlSZW5kZXJWaXNpYmxlLCBub2RlSW50ZXJuYWxzXSkpO1xuICAgIHJldHVybiBncm91cEVkZ2VzQnlaTGV2ZWwoZWRnZXMsIG5vZGVJbnRlcm5hbHMsIGVsZXZhdGVFZGdlc09uU2VsZWN0KTtcbn1cblxuY29uc3QgQXJyb3dTeW1ib2wgPSAoeyBjb2xvciA9ICdub25lJywgc3Ryb2tlV2lkdGggPSAxIH0pID0+IHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwb2x5bGluZVwiLCB7IHN0eWxlOiB7XG4gICAgICAgICAgICBzdHJva2U6IGNvbG9yLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGgsXG4gICAgICAgIH0sIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIiwgZmlsbDogXCJub25lXCIsIHBvaW50czogXCItNSwtNCAwLDAgLTUsNFwiIH0pKTtcbn07XG5jb25zdCBBcnJvd0Nsb3NlZFN5bWJvbCA9ICh7IGNvbG9yID0gJ25vbmUnLCBzdHJva2VXaWR0aCA9IDEgfSkgPT4ge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInBvbHlsaW5lXCIsIHsgc3R5bGU6IHtcbiAgICAgICAgICAgIHN0cm9rZTogY29sb3IsXG4gICAgICAgICAgICBmaWxsOiBjb2xvcixcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoLFxuICAgICAgICB9LCBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsIHN0cm9rZUxpbmVqb2luOiBcInJvdW5kXCIsIHBvaW50czogXCItNSwtNCAwLDAgLTUsNCAtNSwtNFwiIH0pKTtcbn07XG5jb25zdCBNYXJrZXJTeW1ib2xzID0ge1xuICAgIFtNYXJrZXJUeXBlLkFycm93XTogQXJyb3dTeW1ib2wsXG4gICAgW01hcmtlclR5cGUuQXJyb3dDbG9zZWRdOiBBcnJvd0Nsb3NlZFN5bWJvbCxcbn07XG5mdW5jdGlvbiB1c2VNYXJrZXJTeW1ib2wodHlwZSkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCBzeW1ib2wgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3ltYm9sRXhpc3RzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKE1hcmtlclN5bWJvbHMsIHR5cGUpO1xuICAgICAgICBpZiAoIXN5bWJvbEV4aXN0cykge1xuICAgICAgICAgICAgc3RvcmUuZ2V0U3RhdGUoKS5vbkVycm9yPy4oJzAwOScsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDA5J10odHlwZSkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hcmtlclN5bWJvbHNbdHlwZV07XG4gICAgfSwgW3R5cGVdKTtcbiAgICByZXR1cm4gc3ltYm9sO1xufVxuXG5jb25zdCBNYXJrZXIgPSAoeyBpZCwgdHlwZSwgY29sb3IsIHdpZHRoID0gMTIuNSwgaGVpZ2h0ID0gMTIuNSwgbWFya2VyVW5pdHMgPSAnc3Ryb2tlV2lkdGgnLCBzdHJva2VXaWR0aCwgb3JpZW50ID0gJ2F1dG8tc3RhcnQtcmV2ZXJzZScsIH0pID0+IHtcbiAgICBjb25zdCBTeW1ib2wgPSB1c2VNYXJrZXJTeW1ib2wodHlwZSk7XG4gICAgaWYgKCFTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcIm1hcmtlclwiLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19hcnJvd2hlYWRcIiwgaWQ6IGlkLCBtYXJrZXJXaWR0aDogYCR7d2lkdGh9YCwgbWFya2VySGVpZ2h0OiBgJHtoZWlnaHR9YCwgdmlld0JveDogXCItMTAgLTEwIDIwIDIwXCIsIG1hcmtlclVuaXRzOiBtYXJrZXJVbml0cywgb3JpZW50OiBvcmllbnQsIHJlZlg6IFwiMFwiLCByZWZZOiBcIjBcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFN5bWJvbCwgeyBjb2xvcjogY29sb3IsIHN0cm9rZVdpZHRoOiBzdHJva2VXaWR0aCB9KSkpO1xufTtcbmNvbnN0IG1hcmtlclNlbGVjdG9yID0gKHsgZGVmYXVsdENvbG9yLCByZklkIH0pID0+IChzKSA9PiB7XG4gICAgY29uc3QgaWRzID0gW107XG4gICAgcmV0dXJuIHMuZWRnZXNcbiAgICAgICAgLnJlZHVjZSgobWFya2VycywgZWRnZSkgPT4ge1xuICAgICAgICBbZWRnZS5tYXJrZXJTdGFydCwgZWRnZS5tYXJrZXJFbmRdLmZvckVhY2goKG1hcmtlcikgPT4ge1xuICAgICAgICAgICAgaWYgKG1hcmtlciAmJiB0eXBlb2YgbWFya2VyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlcklkID0gZ2V0TWFya2VySWQobWFya2VyLCByZklkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlkcy5pbmNsdWRlcyhtYXJrZXJJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKHsgaWQ6IG1hcmtlcklkLCBjb2xvcjogbWFya2VyLmNvbG9yIHx8IGRlZmF1bHRDb2xvciwgLi4ubWFya2VyIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChtYXJrZXJJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1hcmtlcnM7XG4gICAgfSwgW10pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkpO1xufTtcbi8vIHdoZW4geW91IGhhdmUgbXVsdGlwbGUgZmxvd3Mgb24gYSBwYWdlIGFuZCB5b3UgaGlkZSB0aGUgZmlyc3Qgb25lLCB0aGUgb3RoZXIgb25lcyBoYXZlIG5vIG1hcmtlcnMgYW55bW9yZVxuLy8gd2hlbiB0aGV5IGRvIGhhdmUgbWFya2VycyB3aXRoIHRoZSBzYW1lIGlkcy4gVG8gcHJldmVudCB0aGlzIHRoZSB1c2VyIGNhbiBwYXNzIGEgdW5pcXVlIGlkIHRvIHRoZSByZWFjdCBmbG93IHdyYXBwZXJcbi8vIHRoYXQgd2UgY2FuIHRoZW4gdXNlIGZvciBjcmVhdGluZyBvdXIgdW5pcXVlIG1hcmtlciBpZHNcbmNvbnN0IE1hcmtlckRlZmluaXRpb25zID0gKHsgZGVmYXVsdENvbG9yLCByZklkIH0pID0+IHtcbiAgICBjb25zdCBtYXJrZXJzID0gdXNlU3RvcmUodXNlQ2FsbGJhY2sobWFya2VyU2VsZWN0b3IoeyBkZWZhdWx0Q29sb3IsIHJmSWQgfSksIFtkZWZhdWx0Q29sb3IsIHJmSWRdKSwgXG4gICAgLy8gdGhlIGlkIGluY2x1ZGVzIGFsbCBtYXJrZXIgb3B0aW9ucywgc28gd2UganVzdCBuZWVkIHRvIGxvb2sgYXQgdGhhdCBwYXJ0IG9mIHRoZSBtYXJrZXJcbiAgICAoYSwgYikgPT4gIShhLmxlbmd0aCAhPT0gYi5sZW5ndGggfHwgYS5zb21lKChtLCBpKSA9PiBtLmlkICE9PSBiW2ldLmlkKSkpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgbWFya2Vycy5tYXAoKG1hcmtlcikgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2VyLCB7IGlkOiBtYXJrZXIuaWQsIGtleTogbWFya2VyLmlkLCB0eXBlOiBtYXJrZXIudHlwZSwgY29sb3I6IG1hcmtlci5jb2xvciwgd2lkdGg6IG1hcmtlci53aWR0aCwgaGVpZ2h0OiBtYXJrZXIuaGVpZ2h0LCBtYXJrZXJVbml0czogbWFya2VyLm1hcmtlclVuaXRzLCBzdHJva2VXaWR0aDogbWFya2VyLnN0cm9rZVdpZHRoLCBvcmllbnQ6IG1hcmtlci5vcmllbnQgfSkpKSkpO1xufTtcbk1hcmtlckRlZmluaXRpb25zLmRpc3BsYXlOYW1lID0gJ01hcmtlckRlZmluaXRpb25zJztcbnZhciBNYXJrZXJEZWZpbml0aW9ucyQxID0gbWVtbyhNYXJrZXJEZWZpbml0aW9ucyk7XG5cbmNvbnN0IHNlbGVjdG9yJDQgPSAocykgPT4gKHtcbiAgICBub2Rlc0Nvbm5lY3RhYmxlOiBzLm5vZGVzQ29ubmVjdGFibGUsXG4gICAgZWRnZXNGb2N1c2FibGU6IHMuZWRnZXNGb2N1c2FibGUsXG4gICAgZWRnZXNVcGRhdGFibGU6IHMuZWRnZXNVcGRhdGFibGUsXG4gICAgZWxlbWVudHNTZWxlY3RhYmxlOiBzLmVsZW1lbnRzU2VsZWN0YWJsZSxcbiAgICB3aWR0aDogcy53aWR0aCxcbiAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxuICAgIGNvbm5lY3Rpb25Nb2RlOiBzLmNvbm5lY3Rpb25Nb2RlLFxuICAgIG5vZGVJbnRlcm5hbHM6IHMubm9kZUludGVybmFscyxcbiAgICBvbkVycm9yOiBzLm9uRXJyb3IsXG59KTtcbmNvbnN0IEVkZ2VSZW5kZXJlciA9ICh7IGRlZmF1bHRNYXJrZXJDb2xvciwgb25seVJlbmRlclZpc2libGVFbGVtZW50cywgZWxldmF0ZUVkZ2VzT25TZWxlY3QsIHJmSWQsIGVkZ2VUeXBlcywgbm9QYW5DbGFzc05hbWUsIG9uRWRnZUNvbnRleHRNZW51LCBvbkVkZ2VNb3VzZUVudGVyLCBvbkVkZ2VNb3VzZU1vdmUsIG9uRWRnZU1vdXNlTGVhdmUsIG9uRWRnZUNsaWNrLCBvbkVkZ2VEb3VibGVDbGljaywgb25SZWNvbm5lY3QsIG9uUmVjb25uZWN0U3RhcnQsIG9uUmVjb25uZWN0RW5kLCByZWNvbm5lY3RSYWRpdXMsIGNoaWxkcmVuLCBkaXNhYmxlS2V5Ym9hcmRBMTF5LCB9KSA9PiB7XG4gICAgY29uc3QgeyBlZGdlc0ZvY3VzYWJsZSwgZWRnZXNVcGRhdGFibGUsIGVsZW1lbnRzU2VsZWN0YWJsZSwgd2lkdGgsIGhlaWdodCwgY29ubmVjdGlvbk1vZGUsIG5vZGVJbnRlcm5hbHMsIG9uRXJyb3IgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJDQsIHNoYWxsb3cpO1xuICAgIGNvbnN0IGVkZ2VUcmVlID0gdXNlVmlzaWJsZUVkZ2VzKG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMsIG5vZGVJbnRlcm5hbHMsIGVsZXZhdGVFZGdlc09uU2VsZWN0KTtcbiAgICBpZiAoIXdpZHRoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGVkZ2VUcmVlLm1hcCgoeyBsZXZlbCwgZWRnZXMsIGlzTWF4TGV2ZWwgfSkgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyBrZXk6IGxldmVsLCBzdHlsZTogeyB6SW5kZXg6IGxldmVsIH0sIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlcyByZWFjdC1mbG93X19jb250YWluZXJcIiB9LFxuICAgICAgICAgICAgaXNNYXhMZXZlbCAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KE1hcmtlckRlZmluaXRpb25zJDEsIHsgZGVmYXVsdENvbG9yOiBkZWZhdWx0TWFya2VyQ29sb3IsIHJmSWQ6IHJmSWQgfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCBudWxsLCBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc291cmNlTm9kZVJlY3QsIHNvdXJjZUhhbmRsZUJvdW5kcywgc291cmNlSXNWYWxpZF0gPSBnZXROb2RlRGF0YShub2RlSW50ZXJuYWxzLmdldChlZGdlLnNvdXJjZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFt0YXJnZXROb2RlUmVjdCwgdGFyZ2V0SGFuZGxlQm91bmRzLCB0YXJnZXRJc1ZhbGlkXSA9IGdldE5vZGVEYXRhKG5vZGVJbnRlcm5hbHMuZ2V0KGVkZ2UudGFyZ2V0KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VJc1ZhbGlkIHx8ICF0YXJnZXRJc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZWRnZVR5cGUgPSBlZGdlLnR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgIGlmICghZWRnZVR5cGVzW2VkZ2VUeXBlXSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPy4oJzAxMScsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDExJ10oZWRnZVR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgZWRnZVR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IEVkZ2VDb21wb25lbnQgPSBlZGdlVHlwZXNbZWRnZVR5cGVdIHx8IGVkZ2VUeXBlcy5kZWZhdWx0O1xuICAgICAgICAgICAgICAgIC8vIHdoZW4gY29ubmVjdGlvbiB0eXBlIGlzIGxvb3NlIHdlIGNhbiBkZWZpbmUgYWxsIGhhbmRsZXMgYXMgc291cmNlcyBhbmQgY29ubmVjdCBzb3VyY2UgLT4gc291cmNlXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZUhhbmRsZXMgPSBjb25uZWN0aW9uTW9kZSA9PT0gQ29ubmVjdGlvbk1vZGUuU3RyaWN0XG4gICAgICAgICAgICAgICAgICAgID8gdGFyZ2V0SGFuZGxlQm91bmRzLnRhcmdldFxuICAgICAgICAgICAgICAgICAgICA6ICh0YXJnZXRIYW5kbGVCb3VuZHMudGFyZ2V0ID8/IFtdKS5jb25jYXQodGFyZ2V0SGFuZGxlQm91bmRzLnNvdXJjZSA/PyBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlSGFuZGxlID0gZ2V0SGFuZGxlKHNvdXJjZUhhbmRsZUJvdW5kcy5zb3VyY2UsIGVkZ2Uuc291cmNlSGFuZGxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRIYW5kbGUgPSBnZXRIYW5kbGUodGFyZ2V0Tm9kZUhhbmRsZXMsIGVkZ2UudGFyZ2V0SGFuZGxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VQb3NpdGlvbiA9IHNvdXJjZUhhbmRsZT8ucG9zaXRpb24gfHwgUG9zaXRpb24uQm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvc2l0aW9uID0gdGFyZ2V0SGFuZGxlPy5wb3NpdGlvbiB8fCBQb3NpdGlvbi5Ub3A7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNGb2N1c2FibGUgPSAhIShlZGdlLmZvY3VzYWJsZSB8fCAoZWRnZXNGb2N1c2FibGUgJiYgdHlwZW9mIGVkZ2UuZm9jdXNhYmxlID09PSAndW5kZWZpbmVkJykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VSZWNvbm5lY3RhYmxlID0gZWRnZS5yZWNvbm5lY3RhYmxlIHx8IGVkZ2UudXBkYXRhYmxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVjb25uZWN0YWJsZSA9IHR5cGVvZiBvblJlY29ubmVjdCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgKGVkZ2VSZWNvbm5lY3RhYmxlIHx8IChlZGdlc1VwZGF0YWJsZSAmJiB0eXBlb2YgZWRnZVJlY29ubmVjdGFibGUgPT09ICd1bmRlZmluZWQnKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VIYW5kbGUgfHwgIXRhcmdldEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPy4oJzAwOCcsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDA4J10oc291cmNlSGFuZGxlLCBlZGdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFkgfSA9IGdldEVkZ2VQb3NpdGlvbnMoc291cmNlTm9kZVJlY3QsIHNvdXJjZUhhbmRsZSwgc291cmNlUG9zaXRpb24sIHRhcmdldE5vZGVSZWN0LCB0YXJnZXRIYW5kbGUsIHRhcmdldFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRWRnZUNvbXBvbmVudCwgeyBrZXk6IGVkZ2UuaWQsIGlkOiBlZGdlLmlkLCBjbGFzc05hbWU6IGNjKFtlZGdlLmNsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWVdKSwgdHlwZTogZWRnZVR5cGUsIGRhdGE6IGVkZ2UuZGF0YSwgc2VsZWN0ZWQ6ICEhZWRnZS5zZWxlY3RlZCwgYW5pbWF0ZWQ6ICEhZWRnZS5hbmltYXRlZCwgaGlkZGVuOiAhIWVkZ2UuaGlkZGVuLCBsYWJlbDogZWRnZS5sYWJlbCwgbGFiZWxTdHlsZTogZWRnZS5sYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogZWRnZS5sYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlOiBlZGdlLmxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmc6IGVkZ2UubGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGVkZ2UubGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGU6IGVkZ2Uuc3R5bGUsIHNvdXJjZTogZWRnZS5zb3VyY2UsIHRhcmdldDogZWRnZS50YXJnZXQsIHNvdXJjZUhhbmRsZUlkOiBlZGdlLnNvdXJjZUhhbmRsZSwgdGFyZ2V0SGFuZGxlSWQ6IGVkZ2UudGFyZ2V0SGFuZGxlLCBtYXJrZXJFbmQ6IGVkZ2UubWFya2VyRW5kLCBtYXJrZXJTdGFydDogZWRnZS5tYXJrZXJTdGFydCwgc291cmNlWDogc291cmNlWCwgc291cmNlWTogc291cmNlWSwgdGFyZ2V0WDogdGFyZ2V0WCwgdGFyZ2V0WTogdGFyZ2V0WSwgc291cmNlUG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbjogdGFyZ2V0UG9zaXRpb24sIGVsZW1lbnRzU2VsZWN0YWJsZTogZWxlbWVudHNTZWxlY3RhYmxlLCBvbkNvbnRleHRNZW51OiBvbkVkZ2VDb250ZXh0TWVudSwgb25Nb3VzZUVudGVyOiBvbkVkZ2VNb3VzZUVudGVyLCBvbk1vdXNlTW92ZTogb25FZGdlTW91c2VNb3ZlLCBvbk1vdXNlTGVhdmU6IG9uRWRnZU1vdXNlTGVhdmUsIG9uQ2xpY2s6IG9uRWRnZUNsaWNrLCBvbkVkZ2VEb3VibGVDbGljazogb25FZGdlRG91YmxlQ2xpY2ssIG9uUmVjb25uZWN0OiBvblJlY29ubmVjdCwgb25SZWNvbm5lY3RTdGFydDogb25SZWNvbm5lY3RTdGFydCwgb25SZWNvbm5lY3RFbmQ6IG9uUmVjb25uZWN0RW5kLCByZWNvbm5lY3RSYWRpdXM6IHJlY29ubmVjdFJhZGl1cywgcmZJZDogcmZJZCwgYXJpYUxhYmVsOiBlZGdlLmFyaWFMYWJlbCwgaXNGb2N1c2FibGU6IGlzRm9jdXNhYmxlLCBpc1JlY29ubmVjdGFibGU6IGlzUmVjb25uZWN0YWJsZSwgcGF0aE9wdGlvbnM6ICdwYXRoT3B0aW9ucycgaW4gZWRnZSA/IGVkZ2UucGF0aE9wdGlvbnMgOiB1bmRlZmluZWQsIGludGVyYWN0aW9uV2lkdGg6IGVkZ2UuaW50ZXJhY3Rpb25XaWR0aCwgZGlzYWJsZUtleWJvYXJkQTExeTogZGlzYWJsZUtleWJvYXJkQTExeSB9KSk7XG4gICAgICAgICAgICB9KSkpKSksXG4gICAgICAgIGNoaWxkcmVuKSk7XG59O1xuRWRnZVJlbmRlcmVyLmRpc3BsYXlOYW1lID0gJ0VkZ2VSZW5kZXJlcic7XG52YXIgRWRnZVJlbmRlcmVyJDEgPSBtZW1vKEVkZ2VSZW5kZXJlcik7XG5cbmNvbnN0IHNlbGVjdG9yJDMgPSAocykgPT4gYHRyYW5zbGF0ZSgke3MudHJhbnNmb3JtWzBdfXB4LCR7cy50cmFuc2Zvcm1bMV19cHgpIHNjYWxlKCR7cy50cmFuc2Zvcm1bMl19KWA7XG5mdW5jdGlvbiBWaWV3cG9ydCh7IGNoaWxkcmVuIH0pIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB1c2VTdG9yZShzZWxlY3RvciQzKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fdmlld3BvcnQgcmVhY3QtZmxvd19fY29udGFpbmVyXCIsIHN0eWxlOiB7IHRyYW5zZm9ybSB9IH0sIGNoaWxkcmVuKSk7XG59XG5cbmZ1bmN0aW9uIHVzZU9uSW5pdEhhbmRsZXIob25Jbml0KSB7XG4gICAgY29uc3QgcmZJbnN0YW5jZSA9IHVzZVJlYWN0RmxvdygpO1xuICAgIGNvbnN0IGlzSW5pdGlhbGl6ZWQgPSB1c2VSZWYoZmFsc2UpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNJbml0aWFsaXplZC5jdXJyZW50ICYmIHJmSW5zdGFuY2Uudmlld3BvcnRJbml0aWFsaXplZCAmJiBvbkluaXQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gb25Jbml0KHJmSW5zdGFuY2UpLCAxKTtcbiAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LCBbb25Jbml0LCByZkluc3RhbmNlLnZpZXdwb3J0SW5pdGlhbGl6ZWRdKTtcbn1cblxuY29uc3Qgb3Bwb3NpdGVQb3NpdGlvbiA9IHtcbiAgICBbUG9zaXRpb24uTGVmdF06IFBvc2l0aW9uLlJpZ2h0LFxuICAgIFtQb3NpdGlvbi5SaWdodF06IFBvc2l0aW9uLkxlZnQsXG4gICAgW1Bvc2l0aW9uLlRvcF06IFBvc2l0aW9uLkJvdHRvbSxcbiAgICBbUG9zaXRpb24uQm90dG9tXTogUG9zaXRpb24uVG9wLFxufTtcbmNvbnN0IENvbm5lY3Rpb25MaW5lID0gKHsgbm9kZUlkLCBoYW5kbGVUeXBlLCBzdHlsZSwgdHlwZSA9IENvbm5lY3Rpb25MaW5lVHlwZS5CZXppZXIsIEN1c3RvbUNvbXBvbmVudCwgY29ubmVjdGlvblN0YXR1cywgfSkgPT4ge1xuICAgIGNvbnN0IHsgZnJvbU5vZGUsIGhhbmRsZUlkLCB0b1gsIHRvWSwgY29ubmVjdGlvbk1vZGUgfSA9IHVzZVN0b3JlKHVzZUNhbGxiYWNrKChzKSA9PiAoe1xuICAgICAgICBmcm9tTm9kZTogcy5ub2RlSW50ZXJuYWxzLmdldChub2RlSWQpLFxuICAgICAgICBoYW5kbGVJZDogcy5jb25uZWN0aW9uSGFuZGxlSWQsXG4gICAgICAgIHRvWDogKHMuY29ubmVjdGlvblBvc2l0aW9uLnggLSBzLnRyYW5zZm9ybVswXSkgLyBzLnRyYW5zZm9ybVsyXSxcbiAgICAgICAgdG9ZOiAocy5jb25uZWN0aW9uUG9zaXRpb24ueSAtIHMudHJhbnNmb3JtWzFdKSAvIHMudHJhbnNmb3JtWzJdLFxuICAgICAgICBjb25uZWN0aW9uTW9kZTogcy5jb25uZWN0aW9uTW9kZSxcbiAgICB9KSwgW25vZGVJZF0pLCBzaGFsbG93KTtcbiAgICBjb25zdCBmcm9tSGFuZGxlQm91bmRzID0gZnJvbU5vZGU/LltpbnRlcm5hbHNTeW1ib2xdPy5oYW5kbGVCb3VuZHM7XG4gICAgbGV0IGhhbmRsZUJvdW5kcyA9IGZyb21IYW5kbGVCb3VuZHM/LltoYW5kbGVUeXBlXTtcbiAgICBpZiAoY29ubmVjdGlvbk1vZGUgPT09IENvbm5lY3Rpb25Nb2RlLkxvb3NlKSB7XG4gICAgICAgIGhhbmRsZUJvdW5kcyA9IGhhbmRsZUJvdW5kcyA/IGhhbmRsZUJvdW5kcyA6IGZyb21IYW5kbGVCb3VuZHM/LltoYW5kbGVUeXBlID09PSAnc291cmNlJyA/ICd0YXJnZXQnIDogJ3NvdXJjZSddO1xuICAgIH1cbiAgICBpZiAoIWZyb21Ob2RlIHx8ICFoYW5kbGVCb3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZyb21IYW5kbGUgPSBoYW5kbGVJZCA/IGhhbmRsZUJvdW5kcy5maW5kKChkKSA9PiBkLmlkID09PSBoYW5kbGVJZCkgOiBoYW5kbGVCb3VuZHNbMF07XG4gICAgY29uc3QgZnJvbUhhbmRsZVggPSBmcm9tSGFuZGxlID8gZnJvbUhhbmRsZS54ICsgZnJvbUhhbmRsZS53aWR0aCAvIDIgOiAoZnJvbU5vZGUud2lkdGggPz8gMCkgLyAyO1xuICAgIGNvbnN0IGZyb21IYW5kbGVZID0gZnJvbUhhbmRsZSA/IGZyb21IYW5kbGUueSArIGZyb21IYW5kbGUuaGVpZ2h0IC8gMiA6IGZyb21Ob2RlLmhlaWdodCA/PyAwO1xuICAgIGNvbnN0IGZyb21YID0gKGZyb21Ob2RlLnBvc2l0aW9uQWJzb2x1dGU/LnggPz8gMCkgKyBmcm9tSGFuZGxlWDtcbiAgICBjb25zdCBmcm9tWSA9IChmcm9tTm9kZS5wb3NpdGlvbkFic29sdXRlPy55ID8/IDApICsgZnJvbUhhbmRsZVk7XG4gICAgY29uc3QgZnJvbVBvc2l0aW9uID0gZnJvbUhhbmRsZT8ucG9zaXRpb247XG4gICAgY29uc3QgdG9Qb3NpdGlvbiA9IGZyb21Qb3NpdGlvbiA/IG9wcG9zaXRlUG9zaXRpb25bZnJvbVBvc2l0aW9uXSA6IG51bGw7XG4gICAgaWYgKCFmcm9tUG9zaXRpb24gfHwgIXRvUG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChDdXN0b21Db21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUNvbXBvbmVudCwgeyBjb25uZWN0aW9uTGluZVR5cGU6IHR5cGUsIGNvbm5lY3Rpb25MaW5lU3R5bGU6IHN0eWxlLCBmcm9tTm9kZTogZnJvbU5vZGUsIGZyb21IYW5kbGU6IGZyb21IYW5kbGUsIGZyb21YOiBmcm9tWCwgZnJvbVk6IGZyb21ZLCB0b1g6IHRvWCwgdG9ZOiB0b1ksIGZyb21Qb3NpdGlvbjogZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uOiB0b1Bvc2l0aW9uLCBjb25uZWN0aW9uU3RhdHVzOiBjb25uZWN0aW9uU3RhdHVzIH0pKTtcbiAgICB9XG4gICAgbGV0IGRBdHRyID0gJyc7XG4gICAgY29uc3QgcGF0aFBhcmFtcyA9IHtcbiAgICAgICAgc291cmNlWDogZnJvbVgsXG4gICAgICAgIHNvdXJjZVk6IGZyb21ZLFxuICAgICAgICBzb3VyY2VQb3NpdGlvbjogZnJvbVBvc2l0aW9uLFxuICAgICAgICB0YXJnZXRYOiB0b1gsXG4gICAgICAgIHRhcmdldFk6IHRvWSxcbiAgICAgICAgdGFyZ2V0UG9zaXRpb246IHRvUG9zaXRpb24sXG4gICAgfTtcbiAgICBpZiAodHlwZSA9PT0gQ29ubmVjdGlvbkxpbmVUeXBlLkJlemllcikge1xuICAgICAgICAvLyB3ZSBhc3N1bWUgdGhlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIGlzIG9wcG9zaXRlIHRvIHRoZSBzb3VyY2UgcG9zaXRpb25cbiAgICAgICAgW2RBdHRyXSA9IGdldEJlemllclBhdGgocGF0aFBhcmFtcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IENvbm5lY3Rpb25MaW5lVHlwZS5TdGVwKSB7XG4gICAgICAgIFtkQXR0cl0gPSBnZXRTbW9vdGhTdGVwUGF0aCh7XG4gICAgICAgICAgICAuLi5wYXRoUGFyYW1zLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gQ29ubmVjdGlvbkxpbmVUeXBlLlNtb290aFN0ZXApIHtcbiAgICAgICAgW2RBdHRyXSA9IGdldFNtb290aFN0ZXBQYXRoKHBhdGhQYXJhbXMpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBDb25uZWN0aW9uTGluZVR5cGUuU2ltcGxlQmV6aWVyKSB7XG4gICAgICAgIFtkQXR0cl0gPSBnZXRTaW1wbGVCZXppZXJQYXRoKHBhdGhQYXJhbXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZEF0dHIgPSBgTSR7ZnJvbVh9LCR7ZnJvbVl9ICR7dG9YfSwke3RvWX1gO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBkQXR0ciwgZmlsbDogXCJub25lXCIsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19jb25uZWN0aW9uLXBhdGhcIiwgc3R5bGU6IHN0eWxlIH0pO1xufTtcbkNvbm5lY3Rpb25MaW5lLmRpc3BsYXlOYW1lID0gJ0Nvbm5lY3Rpb25MaW5lJztcbmNvbnN0IHNlbGVjdG9yJDIgPSAocykgPT4gKHtcbiAgICBub2RlSWQ6IHMuY29ubmVjdGlvbk5vZGVJZCxcbiAgICBoYW5kbGVUeXBlOiBzLmNvbm5lY3Rpb25IYW5kbGVUeXBlLFxuICAgIG5vZGVzQ29ubmVjdGFibGU6IHMubm9kZXNDb25uZWN0YWJsZSxcbiAgICBjb25uZWN0aW9uU3RhdHVzOiBzLmNvbm5lY3Rpb25TdGF0dXMsXG4gICAgd2lkdGg6IHMud2lkdGgsXG4gICAgaGVpZ2h0OiBzLmhlaWdodCxcbn0pO1xuZnVuY3Rpb24gQ29ubmVjdGlvbkxpbmVXcmFwcGVyKHsgY29udGFpbmVyU3R5bGUsIHN0eWxlLCB0eXBlLCBjb21wb25lbnQgfSkge1xuICAgIGNvbnN0IHsgbm9kZUlkLCBoYW5kbGVUeXBlLCBub2Rlc0Nvbm5lY3RhYmxlLCB3aWR0aCwgaGVpZ2h0LCBjb25uZWN0aW9uU3RhdHVzIH0gPSB1c2VTdG9yZShzZWxlY3RvciQyLCBzaGFsbG93KTtcbiAgICBjb25zdCBpc1ZhbGlkID0gISEobm9kZUlkICYmIGhhbmRsZVR5cGUgJiYgd2lkdGggJiYgbm9kZXNDb25uZWN0YWJsZSk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyBzdHlsZTogY29udGFpbmVyU3R5bGUsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlcyByZWFjdC1mbG93X19jb25uZWN0aW9ubGluZSByZWFjdC1mbG93X19jb250YWluZXJcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7IGNsYXNzTmFtZTogY2MoWydyZWFjdC1mbG93X19jb25uZWN0aW9uJywgY29ubmVjdGlvblN0YXR1c10pIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3Rpb25MaW5lLCB7IG5vZGVJZDogbm9kZUlkLCBoYW5kbGVUeXBlOiBoYW5kbGVUeXBlLCBzdHlsZTogc3R5bGUsIHR5cGU6IHR5cGUsIEN1c3RvbUNvbXBvbmVudDogY29tcG9uZW50LCBjb25uZWN0aW9uU3RhdHVzOiBjb25uZWN0aW9uU3RhdHVzIH0pKSkpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gdXNlTm9kZU9yRWRnZVR5cGVzKG5vZGVPckVkZ2VUeXBlcywgY3JlYXRlVHlwZXMpIHtcbiAgICBjb25zdCB0eXBlc0tleXNSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IHR5cGVzUGFyc2VkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZUtleXMgPSBPYmplY3Qua2V5cyhub2RlT3JFZGdlVHlwZXMpO1xuICAgICAgICAgICAgaWYgKHNoYWxsb3codHlwZXNLZXlzUmVmLmN1cnJlbnQsIHR5cGVLZXlzKSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmdldFN0YXRlKCkub25FcnJvcj8uKCcwMDInLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwMiddKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZXNLZXlzUmVmLmN1cnJlbnQgPSB0eXBlS2V5cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlVHlwZXMobm9kZU9yRWRnZVR5cGVzKTtcbiAgICB9LCBbbm9kZU9yRWRnZVR5cGVzXSk7XG4gICAgcmV0dXJuIHR5cGVzUGFyc2VkO1xufVxuXG5jb25zdCBHcmFwaFZpZXcgPSAoeyBub2RlVHlwZXMsIGVkZ2VUeXBlcywgb25Nb3ZlLCBvbk1vdmVTdGFydCwgb25Nb3ZlRW5kLCBvbkluaXQsIG9uTm9kZUNsaWNrLCBvbkVkZ2VDbGljaywgb25Ob2RlRG91YmxlQ2xpY2ssIG9uRWRnZURvdWJsZUNsaWNrLCBvbk5vZGVNb3VzZUVudGVyLCBvbk5vZGVNb3VzZU1vdmUsIG9uTm9kZU1vdXNlTGVhdmUsIG9uTm9kZUNvbnRleHRNZW51LCBvblNlbGVjdGlvbkNvbnRleHRNZW51LCBvblNlbGVjdGlvblN0YXJ0LCBvblNlbGVjdGlvbkVuZCwgY29ubmVjdGlvbkxpbmVUeXBlLCBjb25uZWN0aW9uTGluZVN0eWxlLCBjb25uZWN0aW9uTGluZUNvbXBvbmVudCwgY29ubmVjdGlvbkxpbmVDb250YWluZXJTdHlsZSwgc2VsZWN0aW9uS2V5Q29kZSwgc2VsZWN0aW9uT25EcmFnLCBzZWxlY3Rpb25Nb2RlLCBtdWx0aVNlbGVjdGlvbktleUNvZGUsIHBhbkFjdGl2YXRpb25LZXlDb2RlLCB6b29tQWN0aXZhdGlvbktleUNvZGUsIGRlbGV0ZUtleUNvZGUsIG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMsIGVsZW1lbnRzU2VsZWN0YWJsZSwgc2VsZWN0Tm9kZXNPbkRyYWcsIGRlZmF1bHRWaWV3cG9ydCwgdHJhbnNsYXRlRXh0ZW50LCBtaW5ab29tLCBtYXhab29tLCBwcmV2ZW50U2Nyb2xsaW5nLCBkZWZhdWx0TWFya2VyQ29sb3IsIHpvb21PblNjcm9sbCwgem9vbU9uUGluY2gsIHBhbk9uU2Nyb2xsLCBwYW5PblNjcm9sbFNwZWVkLCBwYW5PblNjcm9sbE1vZGUsIHpvb21PbkRvdWJsZUNsaWNrLCBwYW5PbkRyYWcsIG9uUGFuZUNsaWNrLCBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmUsIG9uUGFuZU1vdXNlTGVhdmUsIG9uUGFuZVNjcm9sbCwgb25QYW5lQ29udGV4dE1lbnUsIG9uRWRnZUNvbnRleHRNZW51LCBvbkVkZ2VNb3VzZUVudGVyLCBvbkVkZ2VNb3VzZU1vdmUsIG9uRWRnZU1vdXNlTGVhdmUsIG9uUmVjb25uZWN0LCBvblJlY29ubmVjdFN0YXJ0LCBvblJlY29ubmVjdEVuZCwgcmVjb25uZWN0UmFkaXVzLCBub0RyYWdDbGFzc05hbWUsIG5vV2hlZWxDbGFzc05hbWUsIG5vUGFuQ2xhc3NOYW1lLCBlbGV2YXRlRWRnZXNPblNlbGVjdCwgZGlzYWJsZUtleWJvYXJkQTExeSwgbm9kZU9yaWdpbiwgbm9kZUV4dGVudCwgcmZJZCwgfSkgPT4ge1xuICAgIGNvbnN0IG5vZGVUeXBlc1dyYXBwZWQgPSB1c2VOb2RlT3JFZGdlVHlwZXMobm9kZVR5cGVzLCBjcmVhdGVOb2RlVHlwZXMpO1xuICAgIGNvbnN0IGVkZ2VUeXBlc1dyYXBwZWQgPSB1c2VOb2RlT3JFZGdlVHlwZXMoZWRnZVR5cGVzLCBjcmVhdGVFZGdlVHlwZXMpO1xuICAgIHVzZU9uSW5pdEhhbmRsZXIob25Jbml0KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRmxvd1JlbmRlcmVyJDEsIHsgb25QYW5lQ2xpY2s6IG9uUGFuZUNsaWNrLCBvblBhbmVNb3VzZUVudGVyOiBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmU6IG9uUGFuZU1vdXNlTW92ZSwgb25QYW5lTW91c2VMZWF2ZTogb25QYW5lTW91c2VMZWF2ZSwgb25QYW5lQ29udGV4dE1lbnU6IG9uUGFuZUNvbnRleHRNZW51LCBvblBhbmVTY3JvbGw6IG9uUGFuZVNjcm9sbCwgZGVsZXRlS2V5Q29kZTogZGVsZXRlS2V5Q29kZSwgc2VsZWN0aW9uS2V5Q29kZTogc2VsZWN0aW9uS2V5Q29kZSwgc2VsZWN0aW9uT25EcmFnOiBzZWxlY3Rpb25PbkRyYWcsIHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUsIG9uU2VsZWN0aW9uU3RhcnQ6IG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kOiBvblNlbGVjdGlvbkVuZCwgbXVsdGlTZWxlY3Rpb25LZXlDb2RlOiBtdWx0aVNlbGVjdGlvbktleUNvZGUsIHBhbkFjdGl2YXRpb25LZXlDb2RlOiBwYW5BY3RpdmF0aW9uS2V5Q29kZSwgem9vbUFjdGl2YXRpb25LZXlDb2RlOiB6b29tQWN0aXZhdGlvbktleUNvZGUsIGVsZW1lbnRzU2VsZWN0YWJsZTogZWxlbWVudHNTZWxlY3RhYmxlLCBvbk1vdmU6IG9uTW92ZSwgb25Nb3ZlU3RhcnQ6IG9uTW92ZVN0YXJ0LCBvbk1vdmVFbmQ6IG9uTW92ZUVuZCwgem9vbU9uU2Nyb2xsOiB6b29tT25TY3JvbGwsIHpvb21PblBpbmNoOiB6b29tT25QaW5jaCwgem9vbU9uRG91YmxlQ2xpY2s6IHpvb21PbkRvdWJsZUNsaWNrLCBwYW5PblNjcm9sbDogcGFuT25TY3JvbGwsIHBhbk9uU2Nyb2xsU3BlZWQ6IHBhbk9uU2Nyb2xsU3BlZWQsIHBhbk9uU2Nyb2xsTW9kZTogcGFuT25TY3JvbGxNb2RlLCBwYW5PbkRyYWc6IHBhbk9uRHJhZywgZGVmYXVsdFZpZXdwb3J0OiBkZWZhdWx0Vmlld3BvcnQsIHRyYW5zbGF0ZUV4dGVudDogdHJhbnNsYXRlRXh0ZW50LCBtaW5ab29tOiBtaW5ab29tLCBtYXhab29tOiBtYXhab29tLCBvblNlbGVjdGlvbkNvbnRleHRNZW51OiBvblNlbGVjdGlvbkNvbnRleHRNZW51LCBwcmV2ZW50U2Nyb2xsaW5nOiBwcmV2ZW50U2Nyb2xsaW5nLCBub0RyYWdDbGFzc05hbWU6IG5vRHJhZ0NsYXNzTmFtZSwgbm9XaGVlbENsYXNzTmFtZTogbm9XaGVlbENsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWU6IG5vUGFuQ2xhc3NOYW1lLCBkaXNhYmxlS2V5Ym9hcmRBMTF5OiBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld3BvcnQsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEVkZ2VSZW5kZXJlciQxLCB7IGVkZ2VUeXBlczogZWRnZVR5cGVzV3JhcHBlZCwgb25FZGdlQ2xpY2s6IG9uRWRnZUNsaWNrLCBvbkVkZ2VEb3VibGVDbGljazogb25FZGdlRG91YmxlQ2xpY2ssIG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHM6IG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMsIG9uRWRnZUNvbnRleHRNZW51OiBvbkVkZ2VDb250ZXh0TWVudSwgb25FZGdlTW91c2VFbnRlcjogb25FZGdlTW91c2VFbnRlciwgb25FZGdlTW91c2VNb3ZlOiBvbkVkZ2VNb3VzZU1vdmUsIG9uRWRnZU1vdXNlTGVhdmU6IG9uRWRnZU1vdXNlTGVhdmUsIG9uUmVjb25uZWN0OiBvblJlY29ubmVjdCwgb25SZWNvbm5lY3RTdGFydDogb25SZWNvbm5lY3RTdGFydCwgb25SZWNvbm5lY3RFbmQ6IG9uUmVjb25uZWN0RW5kLCByZWNvbm5lY3RSYWRpdXM6IHJlY29ubmVjdFJhZGl1cywgZGVmYXVsdE1hcmtlckNvbG9yOiBkZWZhdWx0TWFya2VyQ29sb3IsIG5vUGFuQ2xhc3NOYW1lOiBub1BhbkNsYXNzTmFtZSwgZWxldmF0ZUVkZ2VzT25TZWxlY3Q6ICEhZWxldmF0ZUVkZ2VzT25TZWxlY3QsIGRpc2FibGVLZXlib2FyZEExMXk6IGRpc2FibGVLZXlib2FyZEExMXksIHJmSWQ6IHJmSWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvbm5lY3Rpb25MaW5lV3JhcHBlciwgeyBzdHlsZTogY29ubmVjdGlvbkxpbmVTdHlsZSwgdHlwZTogY29ubmVjdGlvbkxpbmVUeXBlLCBjb21wb25lbnQ6IGNvbm5lY3Rpb25MaW5lQ29tcG9uZW50LCBjb250YWluZXJTdHlsZTogY29ubmVjdGlvbkxpbmVDb250YWluZXJTdHlsZSB9KSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2VkZ2VsYWJlbC1yZW5kZXJlclwiIH0pLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChOb2RlUmVuZGVyZXIkMSwgeyBub2RlVHlwZXM6IG5vZGVUeXBlc1dyYXBwZWQsIG9uTm9kZUNsaWNrOiBvbk5vZGVDbGljaywgb25Ob2RlRG91YmxlQ2xpY2s6IG9uTm9kZURvdWJsZUNsaWNrLCBvbk5vZGVNb3VzZUVudGVyOiBvbk5vZGVNb3VzZUVudGVyLCBvbk5vZGVNb3VzZU1vdmU6IG9uTm9kZU1vdXNlTW92ZSwgb25Ob2RlTW91c2VMZWF2ZTogb25Ob2RlTW91c2VMZWF2ZSwgb25Ob2RlQ29udGV4dE1lbnU6IG9uTm9kZUNvbnRleHRNZW51LCBzZWxlY3ROb2Rlc09uRHJhZzogc2VsZWN0Tm9kZXNPbkRyYWcsIG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHM6IG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMsIG5vUGFuQ2xhc3NOYW1lOiBub1BhbkNsYXNzTmFtZSwgbm9EcmFnQ2xhc3NOYW1lOiBub0RyYWdDbGFzc05hbWUsIGRpc2FibGVLZXlib2FyZEExMXk6IGRpc2FibGVLZXlib2FyZEExMXksIG5vZGVPcmlnaW46IG5vZGVPcmlnaW4sIG5vZGVFeHRlbnQ6IG5vZGVFeHRlbnQsIHJmSWQ6IHJmSWQgfSkpKSk7XG59O1xuR3JhcGhWaWV3LmRpc3BsYXlOYW1lID0gJ0dyYXBoVmlldyc7XG52YXIgR3JhcGhWaWV3JDEgPSBtZW1vKEdyYXBoVmlldyk7XG5cbmNvbnN0IGluZmluaXRlRXh0ZW50ID0gW1xuICAgIFtOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIE51bWJlci5ORUdBVElWRV9JTkZJTklUWV0sXG4gICAgW051bWJlci5QT1NJVElWRV9JTkZJTklUWSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXSxcbl07XG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgcmZJZDogJzEnLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICB0cmFuc2Zvcm06IFswLCAwLCAxXSxcbiAgICBub2RlSW50ZXJuYWxzOiBuZXcgTWFwKCksXG4gICAgZWRnZXM6IFtdLFxuICAgIG9uTm9kZXNDaGFuZ2U6IG51bGwsXG4gICAgb25FZGdlc0NoYW5nZTogbnVsbCxcbiAgICBoYXNEZWZhdWx0Tm9kZXM6IGZhbHNlLFxuICAgIGhhc0RlZmF1bHRFZGdlczogZmFsc2UsXG4gICAgZDNab29tOiBudWxsLFxuICAgIGQzU2VsZWN0aW9uOiBudWxsLFxuICAgIGQzWm9vbUhhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICBtaW5ab29tOiAwLjUsXG4gICAgbWF4Wm9vbTogMixcbiAgICB0cmFuc2xhdGVFeHRlbnQ6IGluZmluaXRlRXh0ZW50LFxuICAgIG5vZGVFeHRlbnQ6IGluZmluaXRlRXh0ZW50LFxuICAgIG5vZGVzU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSxcbiAgICB1c2VyU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSxcbiAgICB1c2VyU2VsZWN0aW9uUmVjdDogbnVsbCxcbiAgICBjb25uZWN0aW9uTm9kZUlkOiBudWxsLFxuICAgIGNvbm5lY3Rpb25IYW5kbGVJZDogbnVsbCxcbiAgICBjb25uZWN0aW9uSGFuZGxlVHlwZTogJ3NvdXJjZScsXG4gICAgY29ubmVjdGlvblBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjb25uZWN0aW9uU3RhdHVzOiBudWxsLFxuICAgIGNvbm5lY3Rpb25Nb2RlOiBDb25uZWN0aW9uTW9kZS5TdHJpY3QsXG4gICAgZG9tTm9kZTogbnVsbCxcbiAgICBwYW5lRHJhZ2dpbmc6IGZhbHNlLFxuICAgIG5vUGFuQ2xhc3NOYW1lOiAnbm9wYW4nLFxuICAgIG5vZGVPcmlnaW46IFswLCAwXSxcbiAgICBub2RlRHJhZ1RocmVzaG9sZDogMCxcbiAgICBzbmFwR3JpZDogWzE1LCAxNV0sXG4gICAgc25hcFRvR3JpZDogZmFsc2UsXG4gICAgbm9kZXNEcmFnZ2FibGU6IHRydWUsXG4gICAgbm9kZXNDb25uZWN0YWJsZTogdHJ1ZSxcbiAgICBub2Rlc0ZvY3VzYWJsZTogdHJ1ZSxcbiAgICBlZGdlc0ZvY3VzYWJsZTogdHJ1ZSxcbiAgICBlZGdlc1VwZGF0YWJsZTogdHJ1ZSxcbiAgICBlbGVtZW50c1NlbGVjdGFibGU6IHRydWUsXG4gICAgZWxldmF0ZU5vZGVzT25TZWxlY3Q6IHRydWUsXG4gICAgZml0Vmlld09uSW5pdDogZmFsc2UsXG4gICAgZml0Vmlld09uSW5pdERvbmU6IGZhbHNlLFxuICAgIGZpdFZpZXdPbkluaXRPcHRpb25zOiB1bmRlZmluZWQsXG4gICAgb25TZWxlY3Rpb25DaGFuZ2U6IFtdLFxuICAgIG11bHRpU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSxcbiAgICBjb25uZWN0aW9uU3RhcnRIYW5kbGU6IG51bGwsXG4gICAgY29ubmVjdGlvbkVuZEhhbmRsZTogbnVsbCxcbiAgICBjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZTogbnVsbCxcbiAgICBjb25uZWN0T25DbGljazogdHJ1ZSxcbiAgICBhcmlhTGl2ZU1lc3NhZ2U6ICcnLFxuICAgIGF1dG9QYW5PbkNvbm5lY3Q6IHRydWUsXG4gICAgYXV0b1Bhbk9uTm9kZURyYWc6IHRydWUsXG4gICAgY29ubmVjdGlvblJhZGl1czogMjAsXG4gICAgb25FcnJvcjogZGV2V2FybixcbiAgICBpc1ZhbGlkQ29ubmVjdGlvbjogdW5kZWZpbmVkLFxufTtcblxuY29uc3QgY3JlYXRlUkZTdG9yZSA9ICgpID0+IGNyZWF0ZVdpdGhFcXVhbGl0eUZuKChzZXQsIGdldCkgPT4gKHtcbiAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgc2V0Tm9kZXM6IChub2RlcykgPT4ge1xuICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMsIG5vZGVPcmlnaW4sIGVsZXZhdGVOb2Rlc09uU2VsZWN0IH0gPSBnZXQoKTtcbiAgICAgICAgc2V0KHsgbm9kZUludGVybmFsczogY3JlYXRlTm9kZUludGVybmFscyhub2Rlcywgbm9kZUludGVybmFscywgbm9kZU9yaWdpbiwgZWxldmF0ZU5vZGVzT25TZWxlY3QpIH0pO1xuICAgIH0sXG4gICAgZ2V0Tm9kZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZ2V0KCkubm9kZUludGVybmFscy52YWx1ZXMoKSk7XG4gICAgfSxcbiAgICBzZXRFZGdlczogKGVkZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdEVkZ2VPcHRpb25zID0ge30gfSA9IGdldCgpO1xuICAgICAgICBzZXQoeyBlZGdlczogZWRnZXMubWFwKChlKSA9PiAoeyAuLi5kZWZhdWx0RWRnZU9wdGlvbnMsIC4uLmUgfSkpIH0pO1xuICAgIH0sXG4gICAgc2V0RGVmYXVsdE5vZGVzQW5kRWRnZXM6IChub2RlcywgZWRnZXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFzRGVmYXVsdE5vZGVzID0gdHlwZW9mIG5vZGVzICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgY29uc3QgaGFzRGVmYXVsdEVkZ2VzID0gdHlwZW9mIGVkZ2VzICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgY29uc3Qgbm9kZUludGVybmFscyA9IGhhc0RlZmF1bHROb2Rlc1xuICAgICAgICAgICAgPyBjcmVhdGVOb2RlSW50ZXJuYWxzKG5vZGVzLCBuZXcgTWFwKCksIGdldCgpLm5vZGVPcmlnaW4sIGdldCgpLmVsZXZhdGVOb2Rlc09uU2VsZWN0KVxuICAgICAgICAgICAgOiBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IG5leHRFZGdlcyA9IGhhc0RlZmF1bHRFZGdlcyA/IGVkZ2VzIDogW107XG4gICAgICAgIHNldCh7IG5vZGVJbnRlcm5hbHMsIGVkZ2VzOiBuZXh0RWRnZXMsIGhhc0RlZmF1bHROb2RlcywgaGFzRGVmYXVsdEVkZ2VzIH0pO1xuICAgIH0sXG4gICAgdXBkYXRlTm9kZURpbWVuc2lvbnM6ICh1cGRhdGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb25Ob2Rlc0NoYW5nZSwgbm9kZUludGVybmFscywgZml0Vmlld09uSW5pdCwgZml0Vmlld09uSW5pdERvbmUsIGZpdFZpZXdPbkluaXRPcHRpb25zLCBkb21Ob2RlLCBub2RlT3JpZ2luLCB9ID0gZ2V0KCk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Tm9kZSA9IGRvbU5vZGU/LnF1ZXJ5U2VsZWN0b3IoJy5yZWFjdC1mbG93X192aWV3cG9ydCcpO1xuICAgICAgICBpZiAoIXZpZXdwb3J0Tm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodmlld3BvcnROb2RlKTtcbiAgICAgICAgY29uc3QgeyBtMjI6IHpvb20gfSA9IG5ldyB3aW5kb3cuRE9NTWF0cml4UmVhZE9ubHkoc3R5bGUudHJhbnNmb3JtKTtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHVwZGF0ZXMucmVkdWNlKChyZXMsIHVwZGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KHVwZGF0ZS5pZCk7XG4gICAgICAgICAgICBpZiAobm9kZT8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgbm9kZUludGVybmFscy5zZXQobm9kZS5pZCwge1xuICAgICAgICAgICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgICAgICAgICBbaW50ZXJuYWxzU3ltYm9sXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ubm9kZVtpbnRlcm5hbHNTeW1ib2xdLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZXNldCB0aGUgaGFuZGxlIGJvdW5kcyB3aGVuIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZm9yY2UgYSBuZXcgb2JzZXJ2YXRpb24gd2hlbiB0aGUgbm9kZSBpcyBzaG93biBhZ2FpblxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm91bmRzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnModXBkYXRlLm5vZGVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkb1VwZGF0ZSA9ICEhKGRpbWVuc2lvbnMud2lkdGggJiZcbiAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucy5oZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAgICAgKG5vZGUud2lkdGggIT09IGRpbWVuc2lvbnMud2lkdGggfHwgbm9kZS5oZWlnaHQgIT09IGRpbWVuc2lvbnMuaGVpZ2h0IHx8IHVwZGF0ZS5mb3JjZVVwZGF0ZSkpO1xuICAgICAgICAgICAgICAgIGlmIChkb1VwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLnNldChub2RlLmlkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ludGVybmFsc1N5bWJvbF06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ub2RlW2ludGVybmFsc1N5bWJvbF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm91bmRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZ2V0SGFuZGxlQm91bmRzKCcuc291cmNlJywgdXBkYXRlLm5vZGVFbGVtZW50LCB6b29tLCBub2RlT3JpZ2luKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBnZXRIYW5kbGVCb3VuZHMoJy50YXJnZXQnLCB1cGRhdGUubm9kZUVsZW1lbnQsIHpvb20sIG5vZGVPcmlnaW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RpbWVuc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICB1cGRhdGVBYnNvbHV0ZU5vZGVQb3NpdGlvbnMobm9kZUludGVybmFscywgbm9kZU9yaWdpbik7XG4gICAgICAgIGNvbnN0IG5leHRGaXRWaWV3T25Jbml0RG9uZSA9IGZpdFZpZXdPbkluaXREb25lIHx8XG4gICAgICAgICAgICAoZml0Vmlld09uSW5pdCAmJiAhZml0Vmlld09uSW5pdERvbmUgJiYgZml0VmlldyhnZXQsIHsgaW5pdGlhbDogdHJ1ZSwgLi4uZml0Vmlld09uSW5pdE9wdGlvbnMgfSkpO1xuICAgICAgICBzZXQoeyBub2RlSW50ZXJuYWxzOiBuZXcgTWFwKG5vZGVJbnRlcm5hbHMpLCBmaXRWaWV3T25Jbml0RG9uZTogbmV4dEZpdFZpZXdPbkluaXREb25lIH0pO1xuICAgICAgICBpZiAoY2hhbmdlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgb25Ob2Rlc0NoYW5nZT8uKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVOb2RlUG9zaXRpb25zOiAobm9kZURyYWdJdGVtcywgcG9zaXRpb25DaGFuZ2VkID0gdHJ1ZSwgZHJhZ2dpbmcgPSBmYWxzZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyaWdnZXJOb2RlQ2hhbmdlcyB9ID0gZ2V0KCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub2RlRHJhZ0l0ZW1zLm1hcCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlID0ge1xuICAgICAgICAgICAgICAgIGlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwb3NpdGlvbicsXG4gICAgICAgICAgICAgICAgZHJhZ2dpbmcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZS5wb3NpdGlvbkFic29sdXRlID0gbm9kZS5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICAgICAgICAgIGNoYW5nZS5wb3NpdGlvbiA9IG5vZGUucG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgICAgICB9KTtcbiAgICAgICAgdHJpZ2dlck5vZGVDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH0sXG4gICAgdHJpZ2dlck5vZGVDaGFuZ2VzOiAoY2hhbmdlcykgPT4ge1xuICAgICAgICBjb25zdCB7IG9uTm9kZXNDaGFuZ2UsIG5vZGVJbnRlcm5hbHMsIGhhc0RlZmF1bHROb2Rlcywgbm9kZU9yaWdpbiwgZ2V0Tm9kZXMsIGVsZXZhdGVOb2Rlc09uU2VsZWN0IH0gPSBnZXQoKTtcbiAgICAgICAgaWYgKGNoYW5nZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHROb2Rlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gYXBwbHlOb2RlQ2hhbmdlcyhjaGFuZ2VzLCBnZXROb2RlcygpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZUludGVybmFscyA9IGNyZWF0ZU5vZGVJbnRlcm5hbHMobm9kZXMsIG5vZGVJbnRlcm5hbHMsIG5vZGVPcmlnaW4sIGVsZXZhdGVOb2Rlc09uU2VsZWN0KTtcbiAgICAgICAgICAgICAgICBzZXQoeyBub2RlSW50ZXJuYWxzOiBuZXh0Tm9kZUludGVybmFscyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9uTm9kZXNDaGFuZ2U/LihjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYWRkU2VsZWN0ZWROb2RlczogKHNlbGVjdGVkTm9kZUlkcykgPT4ge1xuICAgICAgICBjb25zdCB7IG11bHRpU2VsZWN0aW9uQWN0aXZlLCBlZGdlcywgZ2V0Tm9kZXMgfSA9IGdldCgpO1xuICAgICAgICBsZXQgY2hhbmdlZE5vZGVzO1xuICAgICAgICBsZXQgY2hhbmdlZEVkZ2VzID0gbnVsbDtcbiAgICAgICAgaWYgKG11bHRpU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkTm9kZXMgPSBzZWxlY3RlZE5vZGVJZHMubWFwKChub2RlSWQpID0+IGNyZWF0ZVNlbGVjdGlvbkNoYW5nZShub2RlSWQsIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyA9IGdldFNlbGVjdGlvbkNoYW5nZXMoZ2V0Tm9kZXMoKSwgc2VsZWN0ZWROb2RlSWRzKTtcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyA9IGdldFNlbGVjdGlvbkNoYW5nZXMoZWRnZXMsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVOb2Rlc0FuZEVkZ2VzU2VsZWN0aW9ucyh7XG4gICAgICAgICAgICBjaGFuZ2VkTm9kZXMsXG4gICAgICAgICAgICBjaGFuZ2VkRWRnZXMsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgYWRkU2VsZWN0ZWRFZGdlczogKHNlbGVjdGVkRWRnZUlkcykgPT4ge1xuICAgICAgICBjb25zdCB7IG11bHRpU2VsZWN0aW9uQWN0aXZlLCBlZGdlcywgZ2V0Tm9kZXMgfSA9IGdldCgpO1xuICAgICAgICBsZXQgY2hhbmdlZEVkZ2VzO1xuICAgICAgICBsZXQgY2hhbmdlZE5vZGVzID0gbnVsbDtcbiAgICAgICAgaWYgKG11bHRpU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICBjaGFuZ2VkRWRnZXMgPSBzZWxlY3RlZEVkZ2VJZHMubWFwKChlZGdlSWQpID0+IGNyZWF0ZVNlbGVjdGlvbkNoYW5nZShlZGdlSWQsIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyA9IGdldFNlbGVjdGlvbkNoYW5nZXMoZWRnZXMsIHNlbGVjdGVkRWRnZUlkcyk7XG4gICAgICAgICAgICBjaGFuZ2VkTm9kZXMgPSBnZXRTZWxlY3Rpb25DaGFuZ2VzKGdldE5vZGVzKCksIFtdKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVOb2Rlc0FuZEVkZ2VzU2VsZWN0aW9ucyh7XG4gICAgICAgICAgICBjaGFuZ2VkTm9kZXMsXG4gICAgICAgICAgICBjaGFuZ2VkRWRnZXMsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzOiAoeyBub2RlcywgZWRnZXMgfSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZWRnZXM6IHN0b3JlRWRnZXMsIGdldE5vZGVzIH0gPSBnZXQoKTtcbiAgICAgICAgY29uc3Qgbm9kZXNUb1Vuc2VsZWN0ID0gbm9kZXMgPyBub2RlcyA6IGdldE5vZGVzKCk7XG4gICAgICAgIGNvbnN0IGVkZ2VzVG9VbnNlbGVjdCA9IGVkZ2VzID8gZWRnZXMgOiBzdG9yZUVkZ2VzO1xuICAgICAgICBjb25zdCBjaGFuZ2VkTm9kZXMgPSBub2Rlc1RvVW5zZWxlY3QubWFwKChuKSA9PiB7XG4gICAgICAgICAgICBuLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKG4uaWQsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRFZGdlcyA9IGVkZ2VzVG9VbnNlbGVjdC5tYXAoKGVkZ2UpID0+IGNyZWF0ZVNlbGVjdGlvbkNoYW5nZShlZGdlLmlkLCBmYWxzZSkpO1xuICAgICAgICB1cGRhdGVOb2Rlc0FuZEVkZ2VzU2VsZWN0aW9ucyh7XG4gICAgICAgICAgICBjaGFuZ2VkTm9kZXMsXG4gICAgICAgICAgICBjaGFuZ2VkRWRnZXMsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0TWluWm9vbTogKG1pblpvb20pID0+IHtcbiAgICAgICAgY29uc3QgeyBkM1pvb20sIG1heFpvb20gfSA9IGdldCgpO1xuICAgICAgICBkM1pvb20/LnNjYWxlRXh0ZW50KFttaW5ab29tLCBtYXhab29tXSk7XG4gICAgICAgIHNldCh7IG1pblpvb20gfSk7XG4gICAgfSxcbiAgICBzZXRNYXhab29tOiAobWF4Wm9vbSkgPT4ge1xuICAgICAgICBjb25zdCB7IGQzWm9vbSwgbWluWm9vbSB9ID0gZ2V0KCk7XG4gICAgICAgIGQzWm9vbT8uc2NhbGVFeHRlbnQoW21pblpvb20sIG1heFpvb21dKTtcbiAgICAgICAgc2V0KHsgbWF4Wm9vbSB9KTtcbiAgICB9LFxuICAgIHNldFRyYW5zbGF0ZUV4dGVudDogKHRyYW5zbGF0ZUV4dGVudCkgPT4ge1xuICAgICAgICBnZXQoKS5kM1pvb20/LnRyYW5zbGF0ZUV4dGVudCh0cmFuc2xhdGVFeHRlbnQpO1xuICAgICAgICBzZXQoeyB0cmFuc2xhdGVFeHRlbnQgfSk7XG4gICAgfSxcbiAgICByZXNldFNlbGVjdGVkRWxlbWVudHM6ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBlZGdlcywgZ2V0Tm9kZXMgfSA9IGdldCgpO1xuICAgICAgICBjb25zdCBub2RlcyA9IGdldE5vZGVzKCk7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9VbnNlbGVjdCA9IG5vZGVzXG4gICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLnNlbGVjdGVkKVxuICAgICAgICAgICAgLm1hcCgobikgPT4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKG4uaWQsIGZhbHNlKSk7XG4gICAgICAgIGNvbnN0IGVkZ2VzVG9VbnNlbGVjdCA9IGVkZ2VzXG4gICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLnNlbGVjdGVkKVxuICAgICAgICAgICAgLm1hcCgoZSkgPT4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKGUuaWQsIGZhbHNlKSk7XG4gICAgICAgIHVwZGF0ZU5vZGVzQW5kRWRnZXNTZWxlY3Rpb25zKHtcbiAgICAgICAgICAgIGNoYW5nZWROb2Rlczogbm9kZXNUb1Vuc2VsZWN0LFxuICAgICAgICAgICAgY2hhbmdlZEVkZ2VzOiBlZGdlc1RvVW5zZWxlY3QsXG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgc2V0Tm9kZUV4dGVudDogKG5vZGVFeHRlbnQpID0+IHtcbiAgICAgICAgY29uc3QgeyBub2RlSW50ZXJuYWxzIH0gPSBnZXQoKTtcbiAgICAgICAgbm9kZUludGVybmFscy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBub2RlLnBvc2l0aW9uQWJzb2x1dGUgPSBjbGFtcFBvc2l0aW9uKG5vZGUucG9zaXRpb24sIG5vZGVFeHRlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2V0KHtcbiAgICAgICAgICAgIG5vZGVFeHRlbnQsXG4gICAgICAgICAgICBub2RlSW50ZXJuYWxzOiBuZXcgTWFwKG5vZGVJbnRlcm5hbHMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHBhbkJ5OiAoZGVsdGEpID0+IHtcbiAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm0sIHdpZHRoLCBoZWlnaHQsIGQzWm9vbSwgZDNTZWxlY3Rpb24sIHRyYW5zbGF0ZUV4dGVudCB9ID0gZ2V0KCk7XG4gICAgICAgIGlmICghZDNab29tIHx8ICFkM1NlbGVjdGlvbiB8fCAoIWRlbHRhLnggJiYgIWRlbHRhLnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dFRyYW5zZm9ybSA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgLnRyYW5zbGF0ZSh0cmFuc2Zvcm1bMF0gKyBkZWx0YS54LCB0cmFuc2Zvcm1bMV0gKyBkZWx0YS55KVxuICAgICAgICAgICAgLnNjYWxlKHRyYW5zZm9ybVsyXSk7XG4gICAgICAgIGNvbnN0IGV4dGVudCA9IFtcbiAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgIFt3aWR0aCwgaGVpZ2h0XSxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgY29uc3RyYWluZWRUcmFuc2Zvcm0gPSBkM1pvb20/LmNvbnN0cmFpbigpKG5leHRUcmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICAgICAgZDNab29tLnRyYW5zZm9ybShkM1NlbGVjdGlvbiwgY29uc3RyYWluZWRUcmFuc2Zvcm0pO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1DaGFuZ2VkID0gdHJhbnNmb3JtWzBdICE9PSBjb25zdHJhaW5lZFRyYW5zZm9ybS54IHx8XG4gICAgICAgICAgICB0cmFuc2Zvcm1bMV0gIT09IGNvbnN0cmFpbmVkVHJhbnNmb3JtLnkgfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybVsyXSAhPT0gY29uc3RyYWluZWRUcmFuc2Zvcm0uaztcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUNoYW5nZWQ7XG4gICAgfSxcbiAgICBjYW5jZWxDb25uZWN0aW9uOiAoKSA9PiBzZXQoe1xuICAgICAgICBjb25uZWN0aW9uTm9kZUlkOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbk5vZGVJZCxcbiAgICAgICAgY29ubmVjdGlvbkhhbmRsZUlkOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkhhbmRsZUlkLFxuICAgICAgICBjb25uZWN0aW9uSGFuZGxlVHlwZTogaW5pdGlhbFN0YXRlLmNvbm5lY3Rpb25IYW5kbGVUeXBlLFxuICAgICAgICBjb25uZWN0aW9uU3RhdHVzOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvblN0YXR1cyxcbiAgICAgICAgY29ubmVjdGlvblN0YXJ0SGFuZGxlOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvblN0YXJ0SGFuZGxlLFxuICAgICAgICBjb25uZWN0aW9uRW5kSGFuZGxlOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkVuZEhhbmRsZSxcbiAgICB9KSxcbiAgICByZXNldDogKCkgPT4gc2V0KHsgLi4uaW5pdGlhbFN0YXRlIH0pLFxufSksIE9iamVjdC5pcyk7XG5cbmNvbnN0IFJlYWN0Rmxvd1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfSkgPT4ge1xuICAgIGNvbnN0IHN0b3JlUmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGlmICghc3RvcmVSZWYuY3VycmVudCkge1xuICAgICAgICBzdG9yZVJlZi5jdXJyZW50ID0gY3JlYXRlUkZTdG9yZSgpO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChQcm92aWRlciQxLCB7IHZhbHVlOiBzdG9yZVJlZi5jdXJyZW50IH0sIGNoaWxkcmVuKTtcbn07XG5SZWFjdEZsb3dQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdSZWFjdEZsb3dQcm92aWRlcic7XG5cbmNvbnN0IFdyYXBwZXIgPSAoeyBjaGlsZHJlbiB9KSA9PiB7XG4gICAgY29uc3QgaXNXcmFwcGVkID0gdXNlQ29udGV4dChTdG9yZUNvbnRleHQpO1xuICAgIGlmIChpc1dyYXBwZWQpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3cmFwIGl0IHdpdGggYSBmcmFnbWVudCBiZWNhdXNlIGl0J3Mgbm90IGFsbG93ZWQgZm9yIGNoaWxkcmVuIHRvIGJlIGEgUmVhY3ROb2RlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EZWZpbml0ZWx5VHlwZWQvRGVmaW5pdGVseVR5cGVkL2lzc3Vlcy8xODA1MVxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdEZsb3dQcm92aWRlciwgbnVsbCwgY2hpbGRyZW4pO1xufTtcbldyYXBwZXIuZGlzcGxheU5hbWUgPSAnUmVhY3RGbG93V3JhcHBlcic7XG5cbmNvbnN0IGRlZmF1bHROb2RlVHlwZXMgPSB7XG4gICAgaW5wdXQ6IElucHV0Tm9kZSQxLFxuICAgIGRlZmF1bHQ6IERlZmF1bHROb2RlJDEsXG4gICAgb3V0cHV0OiBPdXRwdXROb2RlJDEsXG4gICAgZ3JvdXA6IEdyb3VwTm9kZSxcbn07XG5jb25zdCBkZWZhdWx0RWRnZVR5cGVzID0ge1xuICAgIGRlZmF1bHQ6IEJlemllckVkZ2UsXG4gICAgc3RyYWlnaHQ6IFN0cmFpZ2h0RWRnZSxcbiAgICBzdGVwOiBTdGVwRWRnZSxcbiAgICBzbW9vdGhzdGVwOiBTbW9vdGhTdGVwRWRnZSxcbiAgICBzaW1wbGViZXppZXI6IFNpbXBsZUJlemllckVkZ2UsXG59O1xuY29uc3QgaW5pdE5vZGVPcmlnaW4gPSBbMCwgMF07XG5jb25zdCBpbml0U25hcEdyaWQgPSBbMTUsIDE1XTtcbmNvbnN0IGluaXREZWZhdWx0Vmlld3BvcnQgPSB7IHg6IDAsIHk6IDAsIHpvb206IDEgfTtcbmNvbnN0IHdyYXBwZXJTdHlsZSA9IHtcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICB6SW5kZXg6IDAsXG59O1xuY29uc3QgUmVhY3RGbG93ID0gZm9yd2FyZFJlZigoeyBub2RlcywgZWRnZXMsIGRlZmF1bHROb2RlcywgZGVmYXVsdEVkZ2VzLCBjbGFzc05hbWUsIG5vZGVUeXBlcyA9IGRlZmF1bHROb2RlVHlwZXMsIGVkZ2VUeXBlcyA9IGRlZmF1bHRFZGdlVHlwZXMsIG9uTm9kZUNsaWNrLCBvbkVkZ2VDbGljaywgb25Jbml0LCBvbk1vdmUsIG9uTW92ZVN0YXJ0LCBvbk1vdmVFbmQsIG9uQ29ubmVjdCwgb25Db25uZWN0U3RhcnQsIG9uQ29ubmVjdEVuZCwgb25DbGlja0Nvbm5lY3RTdGFydCwgb25DbGlja0Nvbm5lY3RFbmQsIG9uTm9kZU1vdXNlRW50ZXIsIG9uTm9kZU1vdXNlTW92ZSwgb25Ob2RlTW91c2VMZWF2ZSwgb25Ob2RlQ29udGV4dE1lbnUsIG9uTm9kZURvdWJsZUNsaWNrLCBvbk5vZGVEcmFnU3RhcnQsIG9uTm9kZURyYWcsIG9uTm9kZURyYWdTdG9wLCBvbk5vZGVzRGVsZXRlLCBvbkVkZ2VzRGVsZXRlLCBvblNlbGVjdGlvbkNoYW5nZSwgb25TZWxlY3Rpb25EcmFnU3RhcnQsIG9uU2VsZWN0aW9uRHJhZywgb25TZWxlY3Rpb25EcmFnU3RvcCwgb25TZWxlY3Rpb25Db250ZXh0TWVudSwgb25TZWxlY3Rpb25TdGFydCwgb25TZWxlY3Rpb25FbmQsIGNvbm5lY3Rpb25Nb2RlID0gQ29ubmVjdGlvbk1vZGUuU3RyaWN0LCBjb25uZWN0aW9uTGluZVR5cGUgPSBDb25uZWN0aW9uTGluZVR5cGUuQmV6aWVyLCBjb25uZWN0aW9uTGluZVN0eWxlLCBjb25uZWN0aW9uTGluZUNvbXBvbmVudCwgY29ubmVjdGlvbkxpbmVDb250YWluZXJTdHlsZSwgZGVsZXRlS2V5Q29kZSA9ICdCYWNrc3BhY2UnLCBzZWxlY3Rpb25LZXlDb2RlID0gJ1NoaWZ0Jywgc2VsZWN0aW9uT25EcmFnID0gZmFsc2UsIHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLkZ1bGwsIHBhbkFjdGl2YXRpb25LZXlDb2RlID0gJ1NwYWNlJywgbXVsdGlTZWxlY3Rpb25LZXlDb2RlID0gaXNNYWNPcygpID8gJ01ldGEnIDogJ0NvbnRyb2wnLCB6b29tQWN0aXZhdGlvbktleUNvZGUgPSBpc01hY09zKCkgPyAnTWV0YScgOiAnQ29udHJvbCcsIHNuYXBUb0dyaWQgPSBmYWxzZSwgc25hcEdyaWQgPSBpbml0U25hcEdyaWQsIG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMgPSBmYWxzZSwgc2VsZWN0Tm9kZXNPbkRyYWcgPSB0cnVlLCBub2Rlc0RyYWdnYWJsZSwgbm9kZXNDb25uZWN0YWJsZSwgbm9kZXNGb2N1c2FibGUsIG5vZGVPcmlnaW4gPSBpbml0Tm9kZU9yaWdpbiwgZWRnZXNGb2N1c2FibGUsIGVkZ2VzVXBkYXRhYmxlLCBlbGVtZW50c1NlbGVjdGFibGUsIGRlZmF1bHRWaWV3cG9ydCA9IGluaXREZWZhdWx0Vmlld3BvcnQsIG1pblpvb20gPSAwLjUsIG1heFpvb20gPSAyLCB0cmFuc2xhdGVFeHRlbnQgPSBpbmZpbml0ZUV4dGVudCwgcHJldmVudFNjcm9sbGluZyA9IHRydWUsIG5vZGVFeHRlbnQsIGRlZmF1bHRNYXJrZXJDb2xvciA9ICcjYjFiMWI3Jywgem9vbU9uU2Nyb2xsID0gdHJ1ZSwgem9vbU9uUGluY2ggPSB0cnVlLCBwYW5PblNjcm9sbCA9IGZhbHNlLCBwYW5PblNjcm9sbFNwZWVkID0gMC41LCBwYW5PblNjcm9sbE1vZGUgPSBQYW5PblNjcm9sbE1vZGUuRnJlZSwgem9vbU9uRG91YmxlQ2xpY2sgPSB0cnVlLCBwYW5PbkRyYWcgPSB0cnVlLCBvblBhbmVDbGljaywgb25QYW5lTW91c2VFbnRlciwgb25QYW5lTW91c2VNb3ZlLCBvblBhbmVNb3VzZUxlYXZlLCBvblBhbmVTY3JvbGwsIG9uUGFuZUNvbnRleHRNZW51LCBjaGlsZHJlbiwgb25FZGdlQ29udGV4dE1lbnUsIG9uRWRnZURvdWJsZUNsaWNrLCBvbkVkZ2VNb3VzZUVudGVyLCBvbkVkZ2VNb3VzZU1vdmUsIG9uRWRnZU1vdXNlTGVhdmUsIG9uRWRnZVVwZGF0ZSwgb25FZGdlVXBkYXRlU3RhcnQsIG9uRWRnZVVwZGF0ZUVuZCwgb25SZWNvbm5lY3QsIG9uUmVjb25uZWN0U3RhcnQsIG9uUmVjb25uZWN0RW5kLCByZWNvbm5lY3RSYWRpdXMgPSAxMCwgZWRnZVVwZGF0ZXJSYWRpdXMgPSAxMCwgb25Ob2Rlc0NoYW5nZSwgb25FZGdlc0NoYW5nZSwgbm9EcmFnQ2xhc3NOYW1lID0gJ25vZHJhZycsIG5vV2hlZWxDbGFzc05hbWUgPSAnbm93aGVlbCcsIG5vUGFuQ2xhc3NOYW1lID0gJ25vcGFuJywgZml0VmlldyA9IGZhbHNlLCBmaXRWaWV3T3B0aW9ucywgY29ubmVjdE9uQ2xpY2sgPSB0cnVlLCBhdHRyaWJ1dGlvblBvc2l0aW9uLCBwcm9PcHRpb25zLCBkZWZhdWx0RWRnZU9wdGlvbnMsIGVsZXZhdGVOb2Rlc09uU2VsZWN0ID0gdHJ1ZSwgZWxldmF0ZUVkZ2VzT25TZWxlY3QgPSBmYWxzZSwgZGlzYWJsZUtleWJvYXJkQTExeSA9IGZhbHNlLCBhdXRvUGFuT25Db25uZWN0ID0gdHJ1ZSwgYXV0b1Bhbk9uTm9kZURyYWcgPSB0cnVlLCBjb25uZWN0aW9uUmFkaXVzID0gMjAsIGlzVmFsaWRDb25uZWN0aW9uLCBvbkVycm9yLCBzdHlsZSwgaWQsIG5vZGVEcmFnVGhyZXNob2xkLCAuLi5yZXN0IH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IHJmSWQgPSBpZCB8fCAnMSc7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgLi4ucmVzdCwgc3R5bGU6IHsgLi4uc3R5bGUsIC4uLndyYXBwZXJTdHlsZSB9LCByZWY6IHJlZiwgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3cnLCBjbGFzc05hbWVdKSwgXCJkYXRhLXRlc3RpZFwiOiBcInJmX193cmFwcGVyXCIsIGlkOiBpZCB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEdyYXBoVmlldyQxLCB7IG9uSW5pdDogb25Jbml0LCBvbk1vdmU6IG9uTW92ZSwgb25Nb3ZlU3RhcnQ6IG9uTW92ZVN0YXJ0LCBvbk1vdmVFbmQ6IG9uTW92ZUVuZCwgb25Ob2RlQ2xpY2s6IG9uTm9kZUNsaWNrLCBvbkVkZ2VDbGljazogb25FZGdlQ2xpY2ssIG9uTm9kZU1vdXNlRW50ZXI6IG9uTm9kZU1vdXNlRW50ZXIsIG9uTm9kZU1vdXNlTW92ZTogb25Ob2RlTW91c2VNb3ZlLCBvbk5vZGVNb3VzZUxlYXZlOiBvbk5vZGVNb3VzZUxlYXZlLCBvbk5vZGVDb250ZXh0TWVudTogb25Ob2RlQ29udGV4dE1lbnUsIG9uTm9kZURvdWJsZUNsaWNrOiBvbk5vZGVEb3VibGVDbGljaywgbm9kZVR5cGVzOiBub2RlVHlwZXMsIGVkZ2VUeXBlczogZWRnZVR5cGVzLCBjb25uZWN0aW9uTGluZVR5cGU6IGNvbm5lY3Rpb25MaW5lVHlwZSwgY29ubmVjdGlvbkxpbmVTdHlsZTogY29ubmVjdGlvbkxpbmVTdHlsZSwgY29ubmVjdGlvbkxpbmVDb21wb25lbnQ6IGNvbm5lY3Rpb25MaW5lQ29tcG9uZW50LCBjb25uZWN0aW9uTGluZUNvbnRhaW5lclN0eWxlOiBjb25uZWN0aW9uTGluZUNvbnRhaW5lclN0eWxlLCBzZWxlY3Rpb25LZXlDb2RlOiBzZWxlY3Rpb25LZXlDb2RlLCBzZWxlY3Rpb25PbkRyYWc6IHNlbGVjdGlvbk9uRHJhZywgc2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSwgZGVsZXRlS2V5Q29kZTogZGVsZXRlS2V5Q29kZSwgbXVsdGlTZWxlY3Rpb25LZXlDb2RlOiBtdWx0aVNlbGVjdGlvbktleUNvZGUsIHBhbkFjdGl2YXRpb25LZXlDb2RlOiBwYW5BY3RpdmF0aW9uS2V5Q29kZSwgem9vbUFjdGl2YXRpb25LZXlDb2RlOiB6b29tQWN0aXZhdGlvbktleUNvZGUsIG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHM6IG9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMsIHNlbGVjdE5vZGVzT25EcmFnOiBzZWxlY3ROb2Rlc09uRHJhZywgZGVmYXVsdFZpZXdwb3J0OiBkZWZhdWx0Vmlld3BvcnQsIHRyYW5zbGF0ZUV4dGVudDogdHJhbnNsYXRlRXh0ZW50LCBtaW5ab29tOiBtaW5ab29tLCBtYXhab29tOiBtYXhab29tLCBwcmV2ZW50U2Nyb2xsaW5nOiBwcmV2ZW50U2Nyb2xsaW5nLCB6b29tT25TY3JvbGw6IHpvb21PblNjcm9sbCwgem9vbU9uUGluY2g6IHpvb21PblBpbmNoLCB6b29tT25Eb3VibGVDbGljazogem9vbU9uRG91YmxlQ2xpY2ssIHBhbk9uU2Nyb2xsOiBwYW5PblNjcm9sbCwgcGFuT25TY3JvbGxTcGVlZDogcGFuT25TY3JvbGxTcGVlZCwgcGFuT25TY3JvbGxNb2RlOiBwYW5PblNjcm9sbE1vZGUsIHBhbk9uRHJhZzogcGFuT25EcmFnLCBvblBhbmVDbGljazogb25QYW5lQ2xpY2ssIG9uUGFuZU1vdXNlRW50ZXI6IG9uUGFuZU1vdXNlRW50ZXIsIG9uUGFuZU1vdXNlTW92ZTogb25QYW5lTW91c2VNb3ZlLCBvblBhbmVNb3VzZUxlYXZlOiBvblBhbmVNb3VzZUxlYXZlLCBvblBhbmVTY3JvbGw6IG9uUGFuZVNjcm9sbCwgb25QYW5lQ29udGV4dE1lbnU6IG9uUGFuZUNvbnRleHRNZW51LCBvblNlbGVjdGlvbkNvbnRleHRNZW51OiBvblNlbGVjdGlvbkNvbnRleHRNZW51LCBvblNlbGVjdGlvblN0YXJ0OiBvblNlbGVjdGlvblN0YXJ0LCBvblNlbGVjdGlvbkVuZDogb25TZWxlY3Rpb25FbmQsIG9uRWRnZUNvbnRleHRNZW51OiBvbkVkZ2VDb250ZXh0TWVudSwgb25FZGdlRG91YmxlQ2xpY2s6IG9uRWRnZURvdWJsZUNsaWNrLCBvbkVkZ2VNb3VzZUVudGVyOiBvbkVkZ2VNb3VzZUVudGVyLCBvbkVkZ2VNb3VzZU1vdmU6IG9uRWRnZU1vdXNlTW92ZSwgb25FZGdlTW91c2VMZWF2ZTogb25FZGdlTW91c2VMZWF2ZSwgb25SZWNvbm5lY3Q6IG9uUmVjb25uZWN0ID8/IG9uRWRnZVVwZGF0ZSwgb25SZWNvbm5lY3RTdGFydDogb25SZWNvbm5lY3RTdGFydCA/PyBvbkVkZ2VVcGRhdGVTdGFydCwgb25SZWNvbm5lY3RFbmQ6IG9uUmVjb25uZWN0RW5kID8/IG9uRWRnZVVwZGF0ZUVuZCwgcmVjb25uZWN0UmFkaXVzOiByZWNvbm5lY3RSYWRpdXMgPz8gZWRnZVVwZGF0ZXJSYWRpdXMsIGRlZmF1bHRNYXJrZXJDb2xvcjogZGVmYXVsdE1hcmtlckNvbG9yLCBub0RyYWdDbGFzc05hbWU6IG5vRHJhZ0NsYXNzTmFtZSwgbm9XaGVlbENsYXNzTmFtZTogbm9XaGVlbENsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWU6IG5vUGFuQ2xhc3NOYW1lLCBlbGV2YXRlRWRnZXNPblNlbGVjdDogZWxldmF0ZUVkZ2VzT25TZWxlY3QsIHJmSWQ6IHJmSWQsIGRpc2FibGVLZXlib2FyZEExMXk6IGRpc2FibGVLZXlib2FyZEExMXksIG5vZGVPcmlnaW46IG5vZGVPcmlnaW4sIG5vZGVFeHRlbnQ6IG5vZGVFeHRlbnQgfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFN0b3JlVXBkYXRlciwgeyBub2Rlczogbm9kZXMsIGVkZ2VzOiBlZGdlcywgZGVmYXVsdE5vZGVzOiBkZWZhdWx0Tm9kZXMsIGRlZmF1bHRFZGdlczogZGVmYXVsdEVkZ2VzLCBvbkNvbm5lY3Q6IG9uQ29ubmVjdCwgb25Db25uZWN0U3RhcnQ6IG9uQ29ubmVjdFN0YXJ0LCBvbkNvbm5lY3RFbmQ6IG9uQ29ubmVjdEVuZCwgb25DbGlja0Nvbm5lY3RTdGFydDogb25DbGlja0Nvbm5lY3RTdGFydCwgb25DbGlja0Nvbm5lY3RFbmQ6IG9uQ2xpY2tDb25uZWN0RW5kLCBub2Rlc0RyYWdnYWJsZTogbm9kZXNEcmFnZ2FibGUsIG5vZGVzQ29ubmVjdGFibGU6IG5vZGVzQ29ubmVjdGFibGUsIG5vZGVzRm9jdXNhYmxlOiBub2Rlc0ZvY3VzYWJsZSwgZWRnZXNGb2N1c2FibGU6IGVkZ2VzRm9jdXNhYmxlLCBlZGdlc1VwZGF0YWJsZTogZWRnZXNVcGRhdGFibGUsIGVsZW1lbnRzU2VsZWN0YWJsZTogZWxlbWVudHNTZWxlY3RhYmxlLCBlbGV2YXRlTm9kZXNPblNlbGVjdDogZWxldmF0ZU5vZGVzT25TZWxlY3QsIG1pblpvb206IG1pblpvb20sIG1heFpvb206IG1heFpvb20sIG5vZGVFeHRlbnQ6IG5vZGVFeHRlbnQsIG9uTm9kZXNDaGFuZ2U6IG9uTm9kZXNDaGFuZ2UsIG9uRWRnZXNDaGFuZ2U6IG9uRWRnZXNDaGFuZ2UsIHNuYXBUb0dyaWQ6IHNuYXBUb0dyaWQsIHNuYXBHcmlkOiBzbmFwR3JpZCwgY29ubmVjdGlvbk1vZGU6IGNvbm5lY3Rpb25Nb2RlLCB0cmFuc2xhdGVFeHRlbnQ6IHRyYW5zbGF0ZUV4dGVudCwgY29ubmVjdE9uQ2xpY2s6IGNvbm5lY3RPbkNsaWNrLCBkZWZhdWx0RWRnZU9wdGlvbnM6IGRlZmF1bHRFZGdlT3B0aW9ucywgZml0VmlldzogZml0VmlldywgZml0Vmlld09wdGlvbnM6IGZpdFZpZXdPcHRpb25zLCBvbk5vZGVzRGVsZXRlOiBvbk5vZGVzRGVsZXRlLCBvbkVkZ2VzRGVsZXRlOiBvbkVkZ2VzRGVsZXRlLCBvbk5vZGVEcmFnU3RhcnQ6IG9uTm9kZURyYWdTdGFydCwgb25Ob2RlRHJhZzogb25Ob2RlRHJhZywgb25Ob2RlRHJhZ1N0b3A6IG9uTm9kZURyYWdTdG9wLCBvblNlbGVjdGlvbkRyYWc6IG9uU2VsZWN0aW9uRHJhZywgb25TZWxlY3Rpb25EcmFnU3RhcnQ6IG9uU2VsZWN0aW9uRHJhZ1N0YXJ0LCBvblNlbGVjdGlvbkRyYWdTdG9wOiBvblNlbGVjdGlvbkRyYWdTdG9wLCBub1BhbkNsYXNzTmFtZTogbm9QYW5DbGFzc05hbWUsIG5vZGVPcmlnaW46IG5vZGVPcmlnaW4sIHJmSWQ6IHJmSWQsIGF1dG9QYW5PbkNvbm5lY3Q6IGF1dG9QYW5PbkNvbm5lY3QsIGF1dG9QYW5Pbk5vZGVEcmFnOiBhdXRvUGFuT25Ob2RlRHJhZywgb25FcnJvcjogb25FcnJvciwgY29ubmVjdGlvblJhZGl1czogY29ubmVjdGlvblJhZGl1cywgaXNWYWxpZENvbm5lY3Rpb246IGlzVmFsaWRDb25uZWN0aW9uLCBub2RlRHJhZ1RocmVzaG9sZDogbm9kZURyYWdUaHJlc2hvbGQgfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFdyYXBwZXIkMSwgeyBvblNlbGVjdGlvbkNoYW5nZTogb25TZWxlY3Rpb25DaGFuZ2UgfSksXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXR0cmlidXRpb24sIHsgcHJvT3B0aW9uczogcHJvT3B0aW9ucywgcG9zaXRpb246IGF0dHJpYnV0aW9uUG9zaXRpb24gfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEExMXlEZXNjcmlwdGlvbnMsIHsgcmZJZDogcmZJZCwgZGlzYWJsZUtleWJvYXJkQTExeTogZGlzYWJsZUtleWJvYXJkQTExeSB9KSkpKTtcbn0pO1xuUmVhY3RGbG93LmRpc3BsYXlOYW1lID0gJ1JlYWN0Rmxvdyc7XG5cbmNvbnN0IHNlbGVjdG9yJDEgPSAocykgPT4gcy5kb21Ob2RlPy5xdWVyeVNlbGVjdG9yKCcucmVhY3QtZmxvd19fZWRnZWxhYmVsLXJlbmRlcmVyJyk7XG5mdW5jdGlvbiBFZGdlTGFiZWxSZW5kZXJlcih7IGNoaWxkcmVuIH0pIHtcbiAgICBjb25zdCBlZGdlTGFiZWxSZW5kZXJlciA9IHVzZVN0b3JlKHNlbGVjdG9yJDEpO1xuICAgIGlmICghZWRnZUxhYmVsUmVuZGVyZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGVkZ2VMYWJlbFJlbmRlcmVyKTtcbn1cblxuZnVuY3Rpb24gdXNlVXBkYXRlTm9kZUludGVybmFscygpIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgcmV0dXJuIHVzZUNhbGxiYWNrKChpZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGRvbU5vZGUsIHVwZGF0ZU5vZGVEaW1lbnNpb25zIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCB1cGRhdGVJZHMgPSBBcnJheS5pc0FycmF5KGlkKSA/IGlkIDogW2lkXTtcbiAgICAgICAgY29uc3QgdXBkYXRlcyA9IHVwZGF0ZUlkcy5yZWR1Y2UoKHJlcywgdXBkYXRlSWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVFbGVtZW50ID0gZG9tTm9kZT8ucXVlcnlTZWxlY3RvcihgLnJlYWN0LWZsb3dfX25vZGVbZGF0YS1pZD1cIiR7dXBkYXRlSWR9XCJdYCk7XG4gICAgICAgICAgICBpZiAobm9kZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh7IGlkOiB1cGRhdGVJZCwgbm9kZUVsZW1lbnQsIGZvcmNlVXBkYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSwgW10pO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdXBkYXRlTm9kZURpbWVuc2lvbnModXBkYXRlcykpO1xuICAgIH0sIFtdKTtcbn1cblxuY29uc3Qgbm9kZXNTZWxlY3RvciA9IChzdGF0ZSkgPT4gc3RhdGUuZ2V0Tm9kZXMoKTtcbmZ1bmN0aW9uIHVzZU5vZGVzKCkge1xuICAgIGNvbnN0IG5vZGVzID0gdXNlU3RvcmUobm9kZXNTZWxlY3Rvciwgc2hhbGxvdyk7XG4gICAgcmV0dXJuIG5vZGVzO1xufVxuXG5jb25zdCBlZGdlc1NlbGVjdG9yID0gKHN0YXRlKSA9PiBzdGF0ZS5lZGdlcztcbmZ1bmN0aW9uIHVzZUVkZ2VzKCkge1xuICAgIGNvbnN0IGVkZ2VzID0gdXNlU3RvcmUoZWRnZXNTZWxlY3Rvciwgc2hhbGxvdyk7XG4gICAgcmV0dXJuIGVkZ2VzO1xufVxuXG5jb25zdCB2aWV3cG9ydFNlbGVjdG9yID0gKHN0YXRlKSA9PiAoe1xuICAgIHg6IHN0YXRlLnRyYW5zZm9ybVswXSxcbiAgICB5OiBzdGF0ZS50cmFuc2Zvcm1bMV0sXG4gICAgem9vbTogc3RhdGUudHJhbnNmb3JtWzJdLFxufSk7XG5mdW5jdGlvbiB1c2VWaWV3cG9ydCgpIHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHVzZVN0b3JlKHZpZXdwb3J0U2VsZWN0b3IsIHNoYWxsb3cpO1xuICAgIHJldHVybiB2aWV3cG9ydDtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZnVuY3Rpb24gY3JlYXRlVXNlSXRlbXNTdGF0ZShhcHBseUNoYW5nZXMpIHtcbiAgICByZXR1cm4gKGluaXRpYWxJdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBbaXRlbXMsIHNldEl0ZW1zXSA9IHVzZVN0YXRlKGluaXRpYWxJdGVtcyk7XG4gICAgICAgIGNvbnN0IG9uSXRlbXNDaGFuZ2UgPSB1c2VDYWxsYmFjaygoY2hhbmdlcykgPT4gc2V0SXRlbXMoKGl0ZW1zKSA9PiBhcHBseUNoYW5nZXMoY2hhbmdlcywgaXRlbXMpKSwgW10pO1xuICAgICAgICByZXR1cm4gW2l0ZW1zLCBzZXRJdGVtcywgb25JdGVtc0NoYW5nZV07XG4gICAgfTtcbn1cbmNvbnN0IHVzZU5vZGVzU3RhdGUgPSBjcmVhdGVVc2VJdGVtc1N0YXRlKGFwcGx5Tm9kZUNoYW5nZXMpO1xuY29uc3QgdXNlRWRnZXNTdGF0ZSA9IGNyZWF0ZVVzZUl0ZW1zU3RhdGUoYXBwbHlFZGdlQ2hhbmdlcyk7XG5cbmZ1bmN0aW9uIHVzZU9uVmlld3BvcnRDaGFuZ2UoeyBvblN0YXJ0LCBvbkNoYW5nZSwgb25FbmQgfSkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IG9uVmlld3BvcnRDaGFuZ2VTdGFydDogb25TdGFydCB9KTtcbiAgICB9LCBbb25TdGFydF0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgb25WaWV3cG9ydENoYW5nZTogb25DaGFuZ2UgfSk7XG4gICAgfSwgW29uQ2hhbmdlXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBvblZpZXdwb3J0Q2hhbmdlRW5kOiBvbkVuZCB9KTtcbiAgICB9LCBbb25FbmRdKTtcbn1cblxuZnVuY3Rpb24gdXNlT25TZWxlY3Rpb25DaGFuZ2UoeyBvbkNoYW5nZSB9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRTZWxlY3Rpb25DaGFuZ2VIYW5kbGVycyA9IFsuLi5zdG9yZS5nZXRTdGF0ZSgpLm9uU2VsZWN0aW9uQ2hhbmdlLCBvbkNoYW5nZV07XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgb25TZWxlY3Rpb25DaGFuZ2U6IG5leHRTZWxlY3Rpb25DaGFuZ2VIYW5kbGVycyB9KTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRIYW5kbGVycyA9IHN0b3JlLmdldFN0YXRlKCkub25TZWxlY3Rpb25DaGFuZ2UuZmlsdGVyKChmbikgPT4gZm4gIT09IG9uQ2hhbmdlKTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgb25TZWxlY3Rpb25DaGFuZ2U6IG5leHRIYW5kbGVycyB9KTtcbiAgICAgICAgfTtcbiAgICB9LCBbb25DaGFuZ2VdKTtcbn1cblxuY29uc3Qgc2VsZWN0b3IgPSAob3B0aW9ucykgPT4gKHMpID0+IHtcbiAgICBpZiAocy5ub2RlSW50ZXJuYWxzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc1xuICAgICAgICAuZ2V0Tm9kZXMoKVxuICAgICAgICAuZmlsdGVyKChuKSA9PiAob3B0aW9ucy5pbmNsdWRlSGlkZGVuTm9kZXMgPyB0cnVlIDogIW4uaGlkZGVuKSlcbiAgICAgICAgLmV2ZXJ5KChuKSA9PiBuW2ludGVybmFsc1N5bWJvbF0/LmhhbmRsZUJvdW5kcyAhPT0gdW5kZWZpbmVkKTtcbn07XG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBpbmNsdWRlSGlkZGVuTm9kZXM6IGZhbHNlLFxufTtcbmZ1bmN0aW9uIHVzZU5vZGVzSW5pdGlhbGl6ZWQob3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zKSB7XG4gICAgY29uc3QgaW5pdGlhbGl6ZWQgPSB1c2VTdG9yZShzZWxlY3RvcihvcHRpb25zKSk7XG4gICAgcmV0dXJuIGluaXRpYWxpemVkO1xufVxuXG5leHBvcnQgeyBCYXNlRWRnZSwgQmV6aWVyRWRnZSwgQ29ubmVjdGlvbkxpbmVUeXBlLCBDb25uZWN0aW9uTW9kZSwgRWRnZUxhYmVsUmVuZGVyZXIsIEVkZ2VUZXh0JDEgYXMgRWRnZVRleHQsIEhhbmRsZSQxIGFzIEhhbmRsZSwgTWFya2VyVHlwZSwgUGFuT25TY3JvbGxNb2RlLCBQYW5lbCwgUG9zaXRpb24sIFJlYWN0RmxvdywgUmVhY3RGbG93UHJvdmlkZXIsIFNlbGVjdGlvbk1vZGUsIFNpbXBsZUJlemllckVkZ2UsIFNtb290aFN0ZXBFZGdlLCBTdGVwRWRnZSwgU3RyYWlnaHRFZGdlLCBhZGRFZGdlLCBhcHBseUVkZ2VDaGFuZ2VzLCBhcHBseU5vZGVDaGFuZ2VzLCBib3hUb1JlY3QsIGNsYW1wLCBnZXRCZXppZXJQYXRoLCBnZXRCb3VuZHNPZlJlY3RzLCBnZXRDb25uZWN0ZWRFZGdlcywgZ2V0SW5jb21lcnMsIGdldE1hcmtlckVuZCwgZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbiwgZ2V0Tm9kZXNCb3VuZHMsIGdldE91dGdvZXJzLCBnZXRSZWN0T2ZOb2RlcywgZ2V0U2ltcGxlQmV6aWVyUGF0aCwgZ2V0U21vb3RoU3RlcFBhdGgsIGdldFN0cmFpZ2h0UGF0aCwgZ2V0VHJhbnNmb3JtRm9yQm91bmRzLCBnZXRWaWV3cG9ydEZvckJvdW5kcywgaGFuZGxlUGFyZW50RXhwYW5kLCBpbnRlcm5hbHNTeW1ib2wsIGlzRWRnZSwgaXNOb2RlLCByZWNvbm5lY3RFZGdlLCByZWN0VG9Cb3gsIHVwZGF0ZUVkZ2UsIHVzZUVkZ2VzLCB1c2VFZGdlc1N0YXRlLCB1c2VHZXRQb2ludGVyUG9zaXRpb24sIHVzZUtleVByZXNzLCB1c2VOb2RlSWQsIHVzZU5vZGVzLCB1c2VOb2Rlc0luaXRpYWxpemVkLCB1c2VOb2Rlc1N0YXRlLCB1c2VPblNlbGVjdGlvbkNoYW5nZSwgdXNlT25WaWV3cG9ydENoYW5nZSwgdXNlUmVhY3RGbG93LCB1c2VTdG9yZSwgdXNlU3RvcmVBcGksIHVzZVVwZGF0ZU5vZGVJbnRlcm5hbHMsIHVzZVZpZXdwb3J0IH07XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2MobmFtZXMpIHtcbiAgaWYgKHR5cGVvZiBuYW1lcyA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgbmFtZXMgPT09IFwibnVtYmVyXCIpIHJldHVybiBcIlwiICsgbmFtZXNcblxuICBsZXQgb3V0ID0gXCJcIlxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWVzKSkge1xuICAgIGZvciAobGV0IGkgPSAwLCB0bXA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCh0bXAgPSBjYyhuYW1lc1tpXSkpICE9PSBcIlwiKSB7XG4gICAgICAgIG91dCArPSAob3V0ICYmIFwiIFwiKSArIHRtcFxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBrIGluIG5hbWVzKSB7XG4gICAgICBpZiAobmFtZXNba10pIG91dCArPSAob3V0ICYmIFwiIFwiKSArIGtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iLCAiaW1wb3J0IFJlYWN0RXhwb3J0cyBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmVFeHBvcnRzIGZyb20gJ3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW0vd2l0aC1zZWxlY3Rvci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYSc7XG5cbmNvbnN0IHsgdXNlRGVidWdWYWx1ZSB9ID0gUmVhY3RFeHBvcnRzO1xuY29uc3QgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciB9ID0gdXNlU3luY0V4dGVybmFsU3RvcmVFeHBvcnRzO1xuY29uc3QgaWRlbnRpdHkgPSAoYXJnKSA9PiBhcmc7XG5mdW5jdGlvbiB1c2VTdG9yZVdpdGhFcXVhbGl0eUZuKGFwaSwgc2VsZWN0b3IgPSBpZGVudGl0eSwgZXF1YWxpdHlGbikge1xuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0SW5pdGlhbFN0YXRlLFxuICAgIHNlbGVjdG9yLFxuICAgIGVxdWFsaXR5Rm5cbiAgKTtcbiAgdXNlRGVidWdWYWx1ZShzbGljZSk7XG4gIHJldHVybiBzbGljZTtcbn1cbmNvbnN0IGNyZWF0ZVdpdGhFcXVhbGl0eUZuSW1wbCA9IChjcmVhdGVTdGF0ZSwgZGVmYXVsdEVxdWFsaXR5Rm4pID0+IHtcbiAgY29uc3QgYXBpID0gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpO1xuICBjb25zdCB1c2VCb3VuZFN0b3JlV2l0aEVxdWFsaXR5Rm4gPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4gPSBkZWZhdWx0RXF1YWxpdHlGbikgPT4gdXNlU3RvcmVXaXRoRXF1YWxpdHlGbihhcGksIHNlbGVjdG9yLCBlcXVhbGl0eUZuKTtcbiAgT2JqZWN0LmFzc2lnbih1c2VCb3VuZFN0b3JlV2l0aEVxdWFsaXR5Rm4sIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlV2l0aEVxdWFsaXR5Rm47XG59O1xuY29uc3QgY3JlYXRlV2l0aEVxdWFsaXR5Rm4gPSAoY3JlYXRlU3RhdGUsIGRlZmF1bHRFcXVhbGl0eUZuKSA9PiBjcmVhdGVTdGF0ZSA/IGNyZWF0ZVdpdGhFcXVhbGl0eUZuSW1wbChjcmVhdGVTdGF0ZSwgZGVmYXVsdEVxdWFsaXR5Rm4pIDogY3JlYXRlV2l0aEVxdWFsaXR5Rm5JbXBsO1xuXG5leHBvcnQgeyBjcmVhdGVXaXRoRXF1YWxpdHlGbiwgdXNlU3RvcmVXaXRoRXF1YWxpdHlGbiB9O1xuIiwgImNvbnN0IGNyZWF0ZVN0b3JlSW1wbCA9IChjcmVhdGVTdGF0ZSkgPT4ge1xuICBsZXQgc3RhdGU7XG4gIGNvbnN0IGxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IHNldFN0YXRlID0gKHBhcnRpYWwsIHJlcGxhY2UpID0+IHtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB0eXBlb2YgcGFydGlhbCA9PT0gXCJmdW5jdGlvblwiID8gcGFydGlhbChzdGF0ZSkgOiBwYXJ0aWFsO1xuICAgIGlmICghT2JqZWN0LmlzKG5leHRTdGF0ZSwgc3RhdGUpKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1N0YXRlID0gc3RhdGU7XG4gICAgICBzdGF0ZSA9IChyZXBsYWNlICE9IG51bGwgPyByZXBsYWNlIDogdHlwZW9mIG5leHRTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fCBuZXh0U3RhdGUgPT09IG51bGwpID8gbmV4dFN0YXRlIDogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKHN0YXRlLCBwcmV2aW91c1N0YXRlKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBnZXRTdGF0ZSA9ICgpID0+IHN0YXRlO1xuICBjb25zdCBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBpbml0aWFsU3RhdGU7XG4gIGNvbnN0IHN1YnNjcmliZSA9IChsaXN0ZW5lcikgPT4ge1xuICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbiAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbREVQUkVDQVRFRF0gVGhlIGBkZXN0cm95YCBtZXRob2Qgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSB1bnN1YnNjcmliZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzdWJzY3JpYmUuIEV2ZXJ5dGhpbmcgd2lsbCBiZSBnYXJiYWdlLWNvbGxlY3RlZCBpZiBzdG9yZSBpcyBnYXJiYWdlLWNvbGxlY3RlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIHN1YnNjcmliZSwgZGVzdHJveSB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBzdGF0ZSA9IGNyZWF0ZVN0YXRlKHNldFN0YXRlLCBnZXRTdGF0ZSwgYXBpKTtcbiAgcmV0dXJuIGFwaTtcbn07XG5jb25zdCBjcmVhdGVTdG9yZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVTdG9yZUltcGwoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RvcmVJbXBsO1xudmFyIHZhbmlsbGEgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gRGVmYXVsdCBleHBvcnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnLlwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlU3RvcmUsIHZhbmlsbGEgYXMgZGVmYXVsdCB9O1xuIiwgImZ1bmN0aW9uIHNoYWxsb3ckMShvYmpBLCBvYmpCKSB7XG4gIGlmIChPYmplY3QuaXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChvYmpBIGluc3RhbmNlb2YgTWFwICYmIG9iakIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAob2JqQS5zaXplICE9PSBvYmpCLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmpBKSB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh2YWx1ZSwgb2JqQi5nZXQoa2V5KSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob2JqQSBpbnN0YW5jZW9mIFNldCAmJiBvYmpCIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKG9iakEuc2l6ZSAhPT0gb2JqQi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmpBKSB7XG4gICAgICBpZiAoIW9iakIuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IE9iamVjdC5rZXlzKG9iakIpLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleUEgb2Yga2V5c0EpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBrZXlBKSB8fCAhT2JqZWN0LmlzKG9iakFba2V5QV0sIG9iakJba2V5QV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgc2hhbGxvdyA9IChvYmpBLCBvYmpCKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBpbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnenVzdGFuZC9zaGFsbG93J2AuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBzaGFsbG93JDEob2JqQSwgb2JqQik7XG59O1xuXG5leHBvcnQgeyBzaGFsbG93IGFzIGRlZmF1bHQsIHNoYWxsb3ckMSBhcyBzaGFsbG93IH07XG4iLCAidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCAiZXhwb3J0IHZhciB4aHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB4aHRtbDogeGh0bWwsXG4gIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgeG1sOiBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG59O1xuIiwgImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsICJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwgImZ1bmN0aW9uIG5vbmUoKSB7fVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb25cdTIwMTl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsICJmdW5jdGlvbiBlbXB0eSgpIHtcbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmluZCA9IEFycmF5LnByb3RvdHlwZS5maW5kO1xuXG5mdW5jdGlvbiBjaGlsZEZpbmQobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaW5kLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZEZpcnN0KCkge1xuICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0XG4gICAgICA6IGNoaWxkRmluZCh0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odXBkYXRlKSB7XG4gIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7XG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQge0VudGVyTm9kZX0gZnJvbSBcIi4vZW50ZXIuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHtcbiAgdmFyIGkgPSAwLFxuICAgICAgbm9kZSxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuXG4gIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLlxuICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuXG4gIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9uXHUyMDE5dCBmaXQgaW50byBleGl0LlxuICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHtcbiAgdmFyIGksXG4gICAgICBub2RlLFxuICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLFxuICAgICAga2V5VmFsdWU7XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuXG4gIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSArIFwiXCI7XG4gICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlKSkge1xuICAgICAgICBleGl0W2ldID0gbm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLlxuICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLlxuICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuXG4gIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBrZXlWYWx1ZSA9IGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSkgKyBcIlwiO1xuICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlKSkge1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgbm9kZUJ5S2V5VmFsdWUuZGVsZXRlKGtleVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkpIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkYXR1bShub2RlKSB7XG4gIHJldHVybiBub2RlLl9fZGF0YV9fO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIEFycmF5LmZyb20odGhpcywgZGF0dW0pO1xuXG4gIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCxcbiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLFxuICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBjb25zdGFudCh2YWx1ZSk7XG5cbiAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sXG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLFxuICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgICAgZGF0YSA9IGFycmF5bGlrZSh2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cykpLFxuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsXG4gICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpO1xuXG4gICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpO1xuXG4gICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0XG4gICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSxcbiAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS5cbiAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkge1xuICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHtcbiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTtcbiAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpO1xuICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7XG4gIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjtcbiAgdXBkYXRlLl9leGl0ID0gZXhpdDtcbiAgcmV0dXJuIHVwZGF0ZTtcbn1cblxuLy8gR2l2ZW4gc29tZSBkYXRhLCB0aGlzIHJldHVybnMgYW4gYXJyYXktbGlrZSB2aWV3IG9mIGl0OiBhbiBvYmplY3QgdGhhdFxuLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2Vcbi8vIHNlbGVjdEFsbCwgdGhpcyBpc25cdTIwMTl0IHdvcnJpZWQgYWJvdXQgXHUyMDFDbGl2ZVx1MjAxRCBjb2xsZWN0aW9ucyBiZWNhdXNlIHRoZSByZXN1bHRpbmdcbi8vIGFycmF5IHdpbGwgb25seSBiZSB1c2VkIGJyaWVmbHkgd2hpbGUgZGF0YSBpcyBiZWluZyBib3VuZC4gKEl0IGlzIHBvc3NpYmxlIHRvXG4vLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlXG4vLyBkb25cdTIwMTl0OyB3ZVx1MjAxOWQgcmF0aGVyIGF2b2lkIGEgZ3JhdHVpdG91cyBjb3B5LilcbmZ1bmN0aW9uIGFycmF5bGlrZShkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBcImxlbmd0aFwiIGluIGRhdGFcbiAgICA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlXG4gICAgOiBBcnJheS5mcm9tKGRhdGEpOyAvLyBNYXAsIFNldCwgaXRlcmFibGUsIHN0cmluZywgb3IgYW55dGhpbmcgZWxzZVxufVxuIiwgImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICBhcmd1bWVudHNbMF0gPSB0aGlzO1xuICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICByZXR1cm4gc2l6ZTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLm5vZGUoKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuLi9uYW1lc3BhY2UuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsXG4gICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpXG4gICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbilcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsICJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwgImZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzW25hbWVdID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uXG4gICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpW25hbWVdO1xufVxuIiwgImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwgImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCAiZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHtcbiAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyBodG1sUmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBodG1sRnVuY3Rpb25cbiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG59XG4iLCAiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsICJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwgImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsICJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsICJmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihkZWVwKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCAiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsICJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykge1xuICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksXG4gICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGRpc3BhdGNoRnVuY3Rpb25cbiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsICJpbXBvcnQge1NlbGVjdGlvbiwgcm9vdH0gZnJvbSBcIi4vc2VsZWN0aW9uL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKVxuICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZXZlbnQpIHtcbiAgbGV0IHNvdXJjZUV2ZW50O1xuICB3aGlsZSAoc291cmNlRXZlbnQgPSBldmVudC5zb3VyY2VFdmVudCkgZXZlbnQgPSBzb3VyY2VFdmVudDtcbiAgcmV0dXJuIGV2ZW50O1xufVxuIiwgImltcG9ydCBzb3VyY2VFdmVudCBmcm9tIFwiLi9zb3VyY2VFdmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCwgbm9kZSkge1xuICBldmVudCA9IHNvdXJjZUV2ZW50KGV2ZW50KTtcbiAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkgbm9kZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmIChub2RlKSB7XG4gICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7XG4gICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkge1xuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG4gICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldO1xuICAgIH1cbiAgICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcbiAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV07XG59XG4iLCAiLy8gVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbm9ldmVudCB0byBlbnN1cmUgdGhhdCB3ZSBjYW5cbi8vIHByZXZlbnREZWZhdWx0IG9uIHRoZSBldmVudC5cbmV4cG9ydCBjb25zdCBub25wYXNzaXZlID0ge3Bhc3NpdmU6IGZhbHNlfTtcbmV4cG9ydCBjb25zdCBub25wYXNzaXZlY2FwdHVyZSA9IHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiBmYWxzZX07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IG5vZXZlbnQsIHtub25wYXNzaXZlY2FwdHVyZX0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2aWV3KSB7XG4gIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oXCJkcmFnc3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0O1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG51bGwpO1xuICBpZiAobm9jbGljaykge1xuICAgIHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbm9ldmVudCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbihcImNsaWNrLmRyYWdcIiwgbnVsbCk7IH0sIDApO1xuICB9XG4gIGlmIChcIm9uc2VsZWN0c3RhcnRcIiBpbiByb290KSB7XG4gICAgc2VsZWN0aW9uLm9uKFwic2VsZWN0c3RhcnQuZHJhZ1wiLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7XG4gICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEcmFnRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgc3ViamVjdCxcbiAgdGFyZ2V0LFxuICBpZGVudGlmaWVyLFxuICBhY3RpdmUsXG4gIHgsIHksIGR4LCBkeSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzdWJqZWN0OiB7dmFsdWU6IHN1YmplY3QsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBpZGVudGlmaWVyOiB7dmFsdWU6IGlkZW50aWZpZXIsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgYWN0aXZlOiB7dmFsdWU6IGFjdGl2ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB4OiB7dmFsdWU6IHgsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgeToge3ZhbHVlOiB5LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGR4OiB7dmFsdWU6IGR4LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGR5OiB7dmFsdWU6IGR5LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuXG5EcmFnRXZlbnQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciB2YWx1ZSA9IHRoaXMuXy5vbi5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gIHJldHVybiB2YWx1ZSA9PT0gdGhpcy5fID8gdGhpcyA6IHZhbHVlO1xufTtcbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9kcmFnLCB7eWVzZHJhZ30gZnJvbSBcIi4vbm9kcmFnLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmUsIG5vbnBhc3NpdmVjYXB0dXJlLCBub3Byb3BhZ2F0aW9ufSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBEcmFnRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnROb2RlO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U3ViamVjdChldmVudCwgZCkge1xuICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV2ZW50LngsIHk6IGV2ZW50Lnl9IDogZDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lcixcbiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCxcbiAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsXG4gICAgICBnZXN0dXJlcyA9IHt9LFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImRyYWdcIiwgXCJlbmRcIiksXG4gICAgICBhY3RpdmUgPSAwLFxuICAgICAgbW91c2Vkb3dueCxcbiAgICAgIG1vdXNlZG93bnksXG4gICAgICBtb3VzZW1vdmluZyxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwO1xuXG4gIGZ1bmN0aW9uIGRyYWcoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi5kcmFnXCIsIG1vdXNlZG93bmVkKVxuICAgICAgLmZpbHRlcih0b3VjaGFibGUpXG4gICAgICAgIC5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0ZWQpXG4gICAgICAgIC5vbihcInRvdWNobW92ZS5kcmFnXCIsIHRvdWNobW92ZWQsIG5vbnBhc3NpdmUpXG4gICAgICAgIC5vbihcInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZ1wiLCB0b3VjaGVuZGVkKVxuICAgICAgICAuc3R5bGUoXCJ0b3VjaC1hY3Rpb25cIiwgXCJub25lXCIpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgZCkge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjb250YWluZXIuY2FsbCh0aGlzLCBldmVudCwgZCksIGV2ZW50LCBkLCBcIm1vdXNlXCIpO1xuICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuO1xuICAgIHNlbGVjdChldmVudC52aWV3KVxuICAgICAgLm9uKFwibW91c2Vtb3ZlLmRyYWdcIiwgbW91c2Vtb3ZlZCwgbm9ucGFzc2l2ZWNhcHR1cmUpXG4gICAgICAub24oXCJtb3VzZXVwLmRyYWdcIiwgbW91c2V1cHBlZCwgbm9ucGFzc2l2ZWNhcHR1cmUpO1xuICAgIG5vZHJhZyhldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBtb3VzZW1vdmluZyA9IGZhbHNlO1xuICAgIG1vdXNlZG93bnggPSBldmVudC5jbGllbnRYO1xuICAgIG1vdXNlZG93bnkgPSBldmVudC5jbGllbnRZO1xuICAgIGdlc3R1cmUoXCJzdGFydFwiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgaWYgKCFtb3VzZW1vdmluZykge1xuICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIG1vdXNlZG93bngsIGR5ID0gZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7XG4gICAgICBtb3VzZW1vdmluZyA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7XG4gICAgfVxuICAgIGdlc3R1cmVzLm1vdXNlKFwiZHJhZ1wiLCBldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnXCIsIG51bGwpO1xuICAgIHllc2RyYWcoZXZlbnQudmlldywgbW91c2Vtb3ZpbmcpO1xuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGdlc3R1cmVzLm1vdXNlKFwiZW5kXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgZCkge1xuICAgIGlmICghZmlsdGVyLmNhbGwodGhpcywgZXZlbnQsIGQpKSByZXR1cm47XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgYyA9IGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0aGlzLCBjLCBldmVudCwgZCwgdG91Y2hlc1tpXS5pZGVudGlmaWVyLCB0b3VjaGVzW2ldKSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZHJhZ1wiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hlbmRlZChldmVudCkge1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTtcblxuICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTtcbiAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIVxuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICAgICAgZ2VzdHVyZShcImVuZFwiLCBldmVudCwgdG91Y2hlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYmVmb3Jlc3RhcnQodGhhdCwgY29udGFpbmVyLCBldmVudCwgZCwgaWRlbnRpZmllciwgdG91Y2gpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBsaXN0ZW5lcnMuY29weSgpLFxuICAgICAgICBwID0gcG9pbnRlcih0b3VjaCB8fCBldmVudCwgY29udGFpbmVyKSwgZHgsIGR5LFxuICAgICAgICBzO1xuXG4gICAgaWYgKChzID0gc3ViamVjdC5jYWxsKHRoYXQsIG5ldyBEcmFnRXZlbnQoXCJiZWZvcmVzdGFydFwiLCB7XG4gICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIHg6IHBbMF0sXG4gICAgICAgIHk6IHBbMV0sXG4gICAgICAgIGR4OiAwLFxuICAgICAgICBkeTogMCxcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgIH0pLCBkKSkgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgZHggPSBzLnggLSBwWzBdIHx8IDA7XG4gICAgZHkgPSBzLnkgLSBwWzFdIHx8IDA7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VzdHVyZSh0eXBlLCBldmVudCwgdG91Y2gpIHtcbiAgICAgIHZhciBwMCA9IHAsIG47XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcInN0YXJ0XCI6IGdlc3R1cmVzW2lkZW50aWZpZXJdID0gZ2VzdHVyZSwgbiA9IGFjdGl2ZSsrOyBicmVhaztcbiAgICAgICAgY2FzZSBcImVuZFwiOiBkZWxldGUgZ2VzdHVyZXNbaWRlbnRpZmllcl0sIC0tYWN0aXZlOyAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgIGNhc2UgXCJkcmFnXCI6IHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBuID0gYWN0aXZlOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoLmNhbGwoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoYXQsXG4gICAgICAgIG5ldyBEcmFnRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICBzdWJqZWN0OiBzLFxuICAgICAgICAgIHRhcmdldDogZHJhZyxcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGFjdGl2ZTogbixcbiAgICAgICAgICB4OiBwWzBdICsgZHgsXG4gICAgICAgICAgeTogcFsxXSArIGR5LFxuICAgICAgICAgIGR4OiBwWzBdIC0gcDBbMF0sXG4gICAgICAgICAgZHk6IHBbMV0gLSBwMFsxXSxcbiAgICAgICAgICBkaXNwYXRjaFxuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgZHJhZy5maWx0ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCBkcmFnKSA6IGZpbHRlcjtcbiAgfTtcblxuICBkcmFnLmNvbnRhaW5lciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KF8pLCBkcmFnKSA6IGNvbnRhaW5lcjtcbiAgfTtcblxuICBkcmFnLnN1YmplY3QgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ViamVjdCA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogc3ViamVjdDtcbiAgfTtcblxuICBkcmFnLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogdG91Y2hhYmxlO1xuICB9O1xuXG4gIGRyYWcub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gZHJhZyA6IHZhbHVlO1xuICB9O1xuXG4gIGRyYWcuY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgZHJhZykgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHJldHVybiBkcmFnO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwgImltcG9ydCBkZWZpbmUsIHtleHRlbmR9IGZyb20gXCIuL2RlZmluZS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ29sb3IoKSB7fVxuXG5leHBvcnQgdmFyIGRhcmtlciA9IDAuNztcbmV4cG9ydCB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyO1xuXG52YXIgcmVJID0gXCJcXFxccyooWystXT9cXFxcZCspXFxcXHMqXCIsXG4gICAgcmVOID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pXFxcXHMqXCIsXG4gICAgcmVQID0gXCJcXFxccyooWystXT8oPzpcXFxcZCpcXFxcLik/XFxcXGQrKD86W2VFXVsrLV0/XFxcXGQrKT8pJVxcXFxzKlwiLFxuICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sXG4gICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX1cXFxcKSRgKSxcbiAgICByZVJnYlBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlUH0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfVxcXFwpJGApLFxuICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBeaHNsYVxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCk7XG5cbnZhciBuYW1lZCA9IHtcbiAgYWxpY2VibHVlOiAweGYwZjhmZixcbiAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNyxcbiAgYXF1YTogMHgwMGZmZmYsXG4gIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LFxuICBhenVyZTogMHhmMGZmZmYsXG4gIGJlaWdlOiAweGY1ZjVkYyxcbiAgYmlzcXVlOiAweGZmZTRjNCxcbiAgYmxhY2s6IDB4MDAwMDAwLFxuICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsXG4gIGJsdWU6IDB4MDAwMGZmLFxuICBibHVldmlvbGV0OiAweDhhMmJlMixcbiAgYnJvd246IDB4YTUyYTJhLFxuICBidXJseXdvb2Q6IDB4ZGViODg3LFxuICBjYWRldGJsdWU6IDB4NWY5ZWEwLFxuICBjaGFydHJldXNlOiAweDdmZmYwMCxcbiAgY2hvY29sYXRlOiAweGQyNjkxZSxcbiAgY29yYWw6IDB4ZmY3ZjUwLFxuICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsXG4gIGNvcm5zaWxrOiAweGZmZjhkYyxcbiAgY3JpbXNvbjogMHhkYzE0M2MsXG4gIGN5YW46IDB4MDBmZmZmLFxuICBkYXJrYmx1ZTogMHgwMDAwOGIsXG4gIGRhcmtjeWFuOiAweDAwOGI4YixcbiAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsXG4gIGRhcmtncmF5OiAweGE5YTlhOSxcbiAgZGFya2dyZWVuOiAweDAwNjQwMCxcbiAgZGFya2dyZXk6IDB4YTlhOWE5LFxuICBkYXJra2hha2k6IDB4YmRiNzZiLFxuICBkYXJrbWFnZW50YTogMHg4YjAwOGIsXG4gIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZixcbiAgZGFya29yYW5nZTogMHhmZjhjMDAsXG4gIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLFxuICBkYXJrcmVkOiAweDhiMDAwMCxcbiAgZGFya3NhbG1vbjogMHhlOTk2N2EsXG4gIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsXG4gIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLFxuICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZixcbiAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsXG4gIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLFxuICBkYXJrdmlvbGV0OiAweDk0MDBkMyxcbiAgZGVlcHBpbms6IDB4ZmYxNDkzLFxuICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsXG4gIGRpbWdyYXk6IDB4Njk2OTY5LFxuICBkaW1ncmV5OiAweDY5Njk2OSxcbiAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsXG4gIGZpcmVicmljazogMHhiMjIyMjIsXG4gIGZsb3JhbHdoaXRlOiAweGZmZmFmMCxcbiAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLFxuICBmdWNoc2lhOiAweGZmMDBmZixcbiAgZ2FpbnNib3JvOiAweGRjZGNkYyxcbiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsXG4gIGdvbGQ6IDB4ZmZkNzAwLFxuICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLFxuICBncmF5OiAweDgwODA4MCxcbiAgZ3JlZW46IDB4MDA4MDAwLFxuICBncmVlbnllbGxvdzogMHhhZGZmMmYsXG4gIGdyZXk6IDB4ODA4MDgwLFxuICBob25leWRldzogMHhmMGZmZjAsXG4gIGhvdHBpbms6IDB4ZmY2OWI0LFxuICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLFxuICBpbmRpZ286IDB4NGIwMDgyLFxuICBpdm9yeTogMHhmZmZmZjAsXG4gIGtoYWtpOiAweGYwZTY4YyxcbiAgbGF2ZW5kZXI6IDB4ZTZlNmZhLFxuICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSxcbiAgbGF3bmdyZWVuOiAweDdjZmMwMCxcbiAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCxcbiAgbGlnaHRibHVlOiAweGFkZDhlNixcbiAgbGlnaHRjb3JhbDogMHhmMDgwODAsXG4gIGxpZ2h0Y3lhbjogMHhlMGZmZmYsXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMixcbiAgbGlnaHRncmF5OiAweGQzZDNkMyxcbiAgbGlnaHRncmVlbjogMHg5MGVlOTAsXG4gIGxpZ2h0Z3JleTogMHhkM2QzZDMsXG4gIGxpZ2h0cGluazogMHhmZmI2YzEsXG4gIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSxcbiAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsXG4gIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsXG4gIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSxcbiAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LFxuICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsXG4gIGxpZ2h0eWVsbG93OiAweGZmZmZlMCxcbiAgbGltZTogMHgwMGZmMDAsXG4gIGxpbWVncmVlbjogMHgzMmNkMzIsXG4gIGxpbmVuOiAweGZhZjBlNixcbiAgbWFnZW50YTogMHhmZjAwZmYsXG4gIG1hcm9vbjogMHg4MDAwMDAsXG4gIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLFxuICBtZWRpdW1ibHVlOiAweDAwMDBjZCxcbiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMyxcbiAgbWVkaXVtcHVycGxlOiAweDkzNzBkYixcbiAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLFxuICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLFxuICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsXG4gIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsXG4gIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsXG4gIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsXG4gIG1pbnRjcmVhbTogMHhmNWZmZmEsXG4gIG1pc3R5cm9zZTogMHhmZmU0ZTEsXG4gIG1vY2Nhc2luOiAweGZmZTRiNSxcbiAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLFxuICBuYXZ5OiAweDAwMDA4MCxcbiAgb2xkbGFjZTogMHhmZGY1ZTYsXG4gIG9saXZlOiAweDgwODAwMCxcbiAgb2xpdmVkcmFiOiAweDZiOGUyMyxcbiAgb3JhbmdlOiAweGZmYTUwMCxcbiAgb3JhbmdlcmVkOiAweGZmNDUwMCxcbiAgb3JjaGlkOiAweGRhNzBkNixcbiAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsXG4gIHBhbGVncmVlbjogMHg5OGZiOTgsXG4gIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLFxuICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MyxcbiAgcGFwYXlhd2hpcDogMHhmZmVmZDUsXG4gIHBlYWNocHVmZjogMHhmZmRhYjksXG4gIHBlcnU6IDB4Y2Q4NTNmLFxuICBwaW5rOiAweGZmYzBjYixcbiAgcGx1bTogMHhkZGEwZGQsXG4gIHBvd2RlcmJsdWU6IDB4YjBlMGU2LFxuICBwdXJwbGU6IDB4ODAwMDgwLFxuICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSxcbiAgcmVkOiAweGZmMDAwMCxcbiAgcm9zeWJyb3duOiAweGJjOGY4ZixcbiAgcm95YWxibHVlOiAweDQxNjllMSxcbiAgc2FkZGxlYnJvd246IDB4OGI0NTEzLFxuICBzYWxtb246IDB4ZmE4MDcyLFxuICBzYW5keWJyb3duOiAweGY0YTQ2MCxcbiAgc2VhZ3JlZW46IDB4MmU4YjU3LFxuICBzZWFzaGVsbDogMHhmZmY1ZWUsXG4gIHNpZW5uYTogMHhhMDUyMmQsXG4gIHNpbHZlcjogMHhjMGMwYzAsXG4gIHNreWJsdWU6IDB4ODdjZWViLFxuICBzbGF0ZWJsdWU6IDB4NmE1YWNkLFxuICBzbGF0ZWdyYXk6IDB4NzA4MDkwLFxuICBzbGF0ZWdyZXk6IDB4NzA4MDkwLFxuICBzbm93OiAweGZmZmFmYSxcbiAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLFxuICBzdGVlbGJsdWU6IDB4NDY4MmI0LFxuICB0YW46IDB4ZDJiNDhjLFxuICB0ZWFsOiAweDAwODA4MCxcbiAgdGhpc3RsZTogMHhkOGJmZDgsXG4gIHRvbWF0bzogMHhmZjYzNDcsXG4gIHR1cnF1b2lzZTogMHg0MGUwZDAsXG4gIHZpb2xldDogMHhlZTgyZWUsXG4gIHdoZWF0OiAweGY1ZGViMyxcbiAgd2hpdGU6IDB4ZmZmZmZmLFxuICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSxcbiAgeWVsbG93OiAweGZmZmYwMCxcbiAgeWVsbG93Z3JlZW46IDB4OWFjZDMyXG59O1xuXG5kZWZpbmUoQ29sb3IsIGNvbG9yLCB7XG4gIGNvcHkoY2hhbm5lbHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpO1xuICB9LFxuICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IGNvbG9yX2Zvcm1hdEhleDgsXG4gIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLFxuICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYlxufSk7XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkge1xuICByZXR1cm4gaHNsQ29udmVydCh0aGlzKS5mb3JtYXRIc2woKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiKCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7XG4gIHZhciBtLCBsO1xuICBmb3JtYXQgPSAoZm9ybWF0ICsgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwXG4gICAgICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDBcbiAgICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwXG4gICAgICA6IGwgPT09IDQgPyByZ2JhKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDBcbiAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXhcbiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMClcbiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSlcbiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKVxuICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSlcbiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpXG4gICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpXG4gICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICA6IGZvcm1hdCA9PT0gXCJ0cmFuc3BhcmVudFwiID8gbmV3IFJnYihOYU4sIE5hTiwgTmFOLCAwKVxuICAgICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZ2JuKG4pIHtcbiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTtcbn1cblxuZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7XG4gIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjtcbiAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgUmdiO1xuICBvID0gby5yZ2IoKTtcbiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgdGhpcy5yID0gK3I7XG4gIHRoaXMuZyA9ICtnO1xuICB0aGlzLmIgPSArYjtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShSZ2IsIHJnYiwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGhleDogcmdiX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC5cbiAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYlxufSkpO1xuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9JHtoZXgoKGlzTmFOKHRoaXMub3BhY2l0eSkgPyAxIDogdGhpcy5vcGFjaXR5KSAqIDI1NSl9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHtcbiAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICByZXR1cm4gYCR7YSA9PT0gMSA/IFwicmdiKFwiIDogXCJyZ2JhKFwifSR7Y2xhbXBpKHRoaXMucil9LCAke2NsYW1waSh0aGlzLmcpfSwgJHtjbGFtcGkodGhpcy5iKX0ke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xufVxuXG5mdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkge1xuICByZXR1cm4gaXNOYU4ob3BhY2l0eSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG5mdW5jdGlvbiBjbGFtcGkodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpO1xufVxuXG5mdW5jdGlvbiBoZXgodmFsdWUpIHtcbiAgdmFsdWUgPSBjbGFtcGkodmFsdWUpO1xuICByZXR1cm4gKHZhbHVlIDwgMTYgPyBcIjBcIiA6IFwiXCIpICsgdmFsdWUudG9TdHJpbmcoMTYpO1xufVxuXG5mdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHtcbiAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOO1xuICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtcbiAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOO1xuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbENvbnZlcnQobykge1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTtcbiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pO1xuICBpZiAoIW8pIHJldHVybiBuZXcgSHNsO1xuICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87XG4gIG8gPSBvLnJnYigpO1xuICB2YXIgciA9IG8uciAvIDI1NSxcbiAgICAgIGcgPSBvLmcgLyAyNTUsXG4gICAgICBiID0gby5iIC8gMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGggPSBOYU4sXG4gICAgICBzID0gbWF4IC0gbWluLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgaWYgKHMpIHtcbiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjtcbiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7XG4gICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0O1xuICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47XG4gICAgaCAqPSA2MDtcbiAgfSBlbHNlIHtcbiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgfVxuICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHRoaXMuaCA9ICtoO1xuICB0aGlzLnMgPSArcztcbiAgdGhpcy5sID0gK2w7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICByZ2IoKSB7XG4gICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsXG4gICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyxcbiAgICAgICAgbCA9IHRoaXMubCxcbiAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcyxcbiAgICAgICAgbTEgPSAyICogbCAtIG0yO1xuICAgIHJldHVybiBuZXcgUmdiKFxuICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLFxuICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksXG4gICAgICB0aGlzLm9wYWNpdHlcbiAgICApO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IEhzbChjbGFtcGgodGhpcy5oKSwgY2xhbXB0KHRoaXMucyksIGNsYW1wdCh0aGlzLmwpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBmb3JtYXRIc2woKSB7XG4gICAgY29uc3QgYSA9IGNsYW1wYSh0aGlzLm9wYWNpdHkpO1xuICAgIHJldHVybiBgJHthID09PSAxID8gXCJoc2woXCIgOiBcImhzbGEoXCJ9JHtjbGFtcGgodGhpcy5oKX0sICR7Y2xhbXB0KHRoaXMucykgKiAxMDB9JSwgJHtjbGFtcHQodGhpcy5sKSAqIDEwMH0lJHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbiAgfVxufSkpO1xuXG5mdW5jdGlvbiBjbGFtcGgodmFsdWUpIHtcbiAgdmFsdWUgPSAodmFsdWUgfHwgMCkgJSAzNjA7XG4gIHJldHVybiB2YWx1ZSA8IDAgPyB2YWx1ZSArIDM2MCA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjbGFtcHQodmFsdWUpIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTtcbn1cblxuLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqL1xuZnVuY3Rpb24gaHNsMnJnYihoLCBtMSwgbTIpIHtcbiAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MFxuICAgICAgOiBoIDwgMTgwID8gbTJcbiAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjBcbiAgICAgIDogbTEpICogMjU1O1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHtcbiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxO1xuICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjBcbiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjFcbiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjJcbiAgICAgICsgdDMgKiB2MykgLyA2O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLFxuICAgICAgICB2MSA9IHZhbHVlc1tpXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLFxuICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLFxuICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiaW1wb3J0IHtiYXNpc30gZnJvbSBcIi4vYmFzaXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWVzKSB7XG4gIHZhciBuID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksXG4gICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sXG4gICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSxcbiAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLFxuICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07XG4gICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpO1xuICB9O1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsICJpbXBvcnQge3JnYiBhcyBjb2xvclJnYn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQgYmFzaXMgZnJvbSBcIi4vYmFzaXMuanNcIjtcbmltcG9ydCBiYXNpc0Nsb3NlZCBmcm9tIFwiLi9iYXNpc0Nsb3NlZC5qc1wiO1xuaW1wb3J0IG5vZ2FtbWEsIHtnYW1tYX0gZnJvbSBcIi4vY29sb3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHtcbiAgdmFyIGNvbG9yID0gZ2FtbWEoeSk7XG5cbiAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IGNvbG9yUmdiKHN0YXJ0KSkuciwgKGVuZCA9IGNvbG9yUmdiKGVuZCkpLnIpLFxuICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLFxuICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLFxuICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHN0YXJ0LnIgPSByKHQpO1xuICAgICAgc3RhcnQuZyA9IGcodCk7XG4gICAgICBzdGFydC5iID0gYih0KTtcbiAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpO1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgXCJcIjtcbiAgICB9O1xuICB9XG5cbiAgcmdiLmdhbW1hID0gcmdiR2FtbWE7XG5cbiAgcmV0dXJuIHJnYjtcbn0pKDEpO1xuXG5mdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHtcbiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsXG4gICAgICAgIHIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGcgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGIgPSBuZXcgQXJyYXkobiksXG4gICAgICAgIGksIGNvbG9yO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGNvbG9yID0gY29sb3JSZ2IoY29sb3JzW2ldKTtcbiAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7XG4gICAgICBnW2ldID0gY29sb3IuZyB8fCAwO1xuICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDtcbiAgICB9XG4gICAgciA9IHNwbGluZShyKTtcbiAgICBnID0gc3BsaW5lKGcpO1xuICAgIGIgPSBzcGxpbmUoYik7XG4gICAgY29sb3Iub3BhY2l0eSA9IDE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGNvbG9yLnIgPSByKHQpO1xuICAgICAgY29sb3IuZyA9IGcodCk7XG4gICAgICBjb2xvci5iID0gYih0KTtcbiAgICAgIHJldHVybiBjb2xvciArIFwiXCI7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyk7XG5leHBvcnQgdmFyIHJnYkJhc2lzQ2xvc2VkID0gcmdiU3BsaW5lKGJhc2lzQ2xvc2VkKTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCAidmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0ge1xuICB0cmFuc2xhdGVYOiAwLFxuICB0cmFuc2xhdGVZOiAwLFxuICByb3RhdGU6IDAsXG4gIHNrZXdYOiAwLFxuICBzY2FsZVg6IDEsXG4gIHNjYWxlWTogMVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSwgZikge1xuICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYO1xuICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7XG4gIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDtcbiAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7XG4gIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7XG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRlWDogZSxcbiAgICB0cmFuc2xhdGVZOiBmLFxuICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsXG4gICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLFxuICAgIHNjYWxlWDogc2NhbGVYLFxuICAgIHNjYWxlWTogc2NhbGVZXG4gIH07XG59XG4iLCAiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwgImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCAidmFyIGVwc2lsb24yID0gMWUtMTI7XG5cbmZ1bmN0aW9uIGNvc2goeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbn1cblxuZnVuY3Rpb24gc2luaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiB0YW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiB6b29tUmhvKHJobywgcmhvMiwgcmhvNCkge1xuXG4gIC8vIHAwID0gW3V4MCwgdXkwLCB3MF1cbiAgLy8gcDEgPSBbdXgxLCB1eTEsIHcxXVxuICBmdW5jdGlvbiB6b29tKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sXG4gICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSxcbiAgICAgICAgZHggPSB1eDEgLSB1eDAsXG4gICAgICAgIGR5ID0gdXkxIC0gdXkwLFxuICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LFxuICAgICAgICBpLFxuICAgICAgICBTO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1MCBcdTIyNDUgdTEuXG4gICAgaWYgKGQyIDwgZXBzaWxvbjIpIHtcbiAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdCAqIGR4LFxuICAgICAgICAgIHV5MCArIHQgKiBkeSxcbiAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYWwgY2FzZS5cbiAgICBlbHNlIHtcbiAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksXG4gICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80ICogZDIpIC8gKDIgKiB3MCAqIHJobzIgKiBkMSksXG4gICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80ICogZDIpIC8gKDIgKiB3MSAqIHJobzIgKiBkMSksXG4gICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLFxuICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTtcbiAgICAgIFMgPSAocjEgLSByMCkgLyByaG87XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLFxuICAgICAgICAgICAgY29zaHIwID0gY29zaChyMCksXG4gICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdXgwICsgdSAqIGR4LFxuICAgICAgICAgIHV5MCArIHUgKiBkeSxcbiAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gocmhvICogcyArIHIwKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGkuZHVyYXRpb24gPSBTICogMTAwMCAqIHJobyAvIE1hdGguU1FSVDI7XG5cbiAgICByZXR1cm4gaTtcbiAgfVxuXG4gIHpvb20ucmhvID0gZnVuY3Rpb24oXykge1xuICAgIHZhciBfMSA9IE1hdGgubWF4KDFlLTMsICtfKSwgXzIgPSBfMSAqIF8xLCBfNCA9IF8yICogXzI7XG4gICAgcmV0dXJuIHpvb21SaG8oXzEsIF8yLCBfNCk7XG4gIH07XG5cbiAgcmV0dXJuIHpvb207XG59KShNYXRoLlNRUlQyLCAyLCA0KTtcbiIsICJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2VcdTIwMTl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVuXHUyMDE5dCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwgImltcG9ydCB7VGltZXJ9IGZyb20gXCIuL3RpbWVyLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTtcbiAgdC5yZXN0YXJ0KGVsYXBzZWQgPT4ge1xuICAgIHQuc3RvcCgpO1xuICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7XG4gIH0sIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG4iLCAiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwgImltcG9ydCBpbnRlcnJ1cHQgZnJvbSBcIi4uL2ludGVycnVwdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwgImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwgImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwiYXR0ci5cIiArIG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpKGZ1bGxuYW1lKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkoZnVsbG5hbWUsIGksIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb25cbiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwgImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7bWF0Y2hlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsICJmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMub24oXCJlbmQucmVtb3ZlXCIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbnZhciBTZWxlY3Rpb24gPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsICJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCAiaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gXCJcIiA6IHZhbHVlMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMudHdlZW4oXCJ0ZXh0XCIsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsIFwidGV4dFwiLCB2YWx1ZSkpXG4gICAgICA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIikpO1xufVxuIiwgImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsICJpbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sXG4gICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07XG5cbiAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgICBpZiAob24gIT09IG9uMCkge1xuICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTtcbiAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTtcbiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGUub24gPSBvbjE7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VsZWN0aW9uIHdhcyBlbXB0eSwgcmVzb2x2ZSBlbmQgaW1tZWRpYXRlbHlcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwgImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuLi90cmFuc2l0aW9uL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUgZnJvbSBcIi4uL3RyYW5zaXRpb24vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gXCJkMy1lYXNlXCI7XG5pbXBvcnQge25vd30gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBkZWZhdWx0VGltaW5nID0ge1xuICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLlxuICBkZWxheTogMCxcbiAgZHVyYXRpb246IDI1MCxcbiAgZWFzZTogZWFzZUN1YmljSW5PdXRcbn07XG5cbmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHtcbiAgdmFyIHRpbWluZztcbiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHtcbiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uICR7aWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGltaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBpZCxcbiAgICAgIHRpbWluZztcblxuICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHtcbiAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTtcbiAgfSBlbHNlIHtcbiAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG4gIH1cblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwgImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBab29tRXZlbnQodHlwZSwge1xuICBzb3VyY2VFdmVudCxcbiAgdGFyZ2V0LFxuICB0cmFuc2Zvcm0sXG4gIGRpc3BhdGNoXG59KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICB0eXBlOiB7dmFsdWU6IHR5cGUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgc291cmNlRXZlbnQ6IHt2YWx1ZTogc291cmNlRXZlbnQsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgdGFyZ2V0OiB7dmFsdWU6IHRhcmdldCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0cmFuc2Zvcm06IHt2YWx1ZTogdHJhbnNmb3JtLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIF86IHt2YWx1ZTogZGlzcGF0Y2h9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7ZHJhZ0Rpc2FibGUsIGRyYWdFbmFibGV9IGZyb20gXCJkMy1kcmFnXCI7XG5pbXBvcnQge2ludGVycG9sYXRlWm9vbX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3NlbGVjdCwgcG9pbnRlcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtpbnRlcnJ1cHR9IGZyb20gXCJkMy10cmFuc2l0aW9uXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcbmltcG9ydCBab29tRXZlbnQgZnJvbSBcIi4vZXZlbnQuanNcIjtcbmltcG9ydCB7VHJhbnNmb3JtLCBpZGVudGl0eX0gZnJvbSBcIi4vdHJhbnNmb3JtLmpzXCI7XG5pbXBvcnQgbm9ldmVudCwge25vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcblxuLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuXG4vLyBleGNlcHQgZm9yIHBpbmNoLXRvLXpvb20sIHdoaWNoIGlzIHNlbnQgYXMgYSB3aGVlbCtjdHJsS2V5IGV2ZW50XG5mdW5jdGlvbiBkZWZhdWx0RmlsdGVyKGV2ZW50KSB7XG4gIHJldHVybiAoIWV2ZW50LmN0cmxLZXkgfHwgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykgJiYgIWV2ZW50LmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEV4dGVudCgpIHtcbiAgdmFyIGUgPSB0aGlzO1xuICBpZiAoZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICBlID0gZS5vd25lclNWR0VsZW1lbnQgfHwgZTtcbiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpKSB7XG4gICAgICBlID0gZS52aWV3Qm94LmJhc2VWYWw7XG4gICAgICByZXR1cm4gW1tlLngsIGUueV0sIFtlLnggKyBlLndpZHRoLCBlLnkgKyBlLmhlaWdodF1dO1xuICAgIH1cbiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGguYmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dO1xuICB9XG4gIHJldHVybiBbWzAsIDBdLCBbZS5jbGllbnRXaWR0aCwgZS5jbGllbnRIZWlnaHRdXTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSgpIHtcbiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YShldmVudCkge1xuICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIChldmVudC5jdHJsS2V5ID8gMTAgOiAxKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSgpIHtcbiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoXCJvbnRvdWNoc3RhcnRcIiBpbiB0aGlzKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbnN0cmFpbih0cmFuc2Zvcm0sIGV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSB7XG4gIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLFxuICAgICAgZHgxID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzFdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVswXSxcbiAgICAgIGR5MCA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFswXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMV0sXG4gICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzFdO1xuICByZXR1cm4gdHJhbnNmb3JtLnRyYW5zbGF0ZShcbiAgICBkeDEgPiBkeDAgPyAoZHgwICsgZHgxKSAvIDIgOiBNYXRoLm1pbigwLCBkeDApIHx8IE1hdGgubWF4KDAsIGR4MSksXG4gICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRoLm1heCgwLCBkeTEpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlcixcbiAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQsXG4gICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLFxuICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIHNjYWxlRXh0ZW50ID0gWzAsIEluZmluaXR5XSxcbiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sXG4gICAgICBkdXJhdGlvbiA9IDI1MCxcbiAgICAgIGludGVycG9sYXRlID0gaW50ZXJwb2xhdGVab29tLFxuICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcInpvb21cIiwgXCJlbmRcIiksXG4gICAgICB0b3VjaHN0YXJ0aW5nLFxuICAgICAgdG91Y2hmaXJzdCxcbiAgICAgIHRvdWNoZW5kaW5nLFxuICAgICAgdG91Y2hEZWxheSA9IDUwMCxcbiAgICAgIHdoZWVsRGVsYXkgPSAxNTAsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDAsXG4gICAgICB0YXBEaXN0YW5jZSA9IDEwO1xuXG4gIGZ1bmN0aW9uIHpvb20oc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uXG4gICAgICAgIC5wcm9wZXJ0eShcIl9fem9vbVwiLCBkZWZhdWx0VHJhbnNmb3JtKVxuICAgICAgICAub24oXCJ3aGVlbC56b29tXCIsIHdoZWVsZWQsIHtwYXNzaXZlOiBmYWxzZX0pXG4gICAgICAgIC5vbihcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlZG93bmVkKVxuICAgICAgICAub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLnpvb21cIiwgdG91Y2htb3ZlZClcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIik7XG4gIH1cblxuICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29sbGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247XG4gICAgc2VsZWN0aW9uLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pO1xuICAgIGlmIChjb2xsZWN0aW9uICE9PSBzZWxlY3Rpb24pIHtcbiAgICAgIHNjaGVkdWxlKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0aW9uLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIC5ldmVudChldmVudClcbiAgICAgICAgICAuc3RhcnQoKVxuICAgICAgICAgIC56b29tKG51bGwsIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKVxuICAgICAgICAgIC5lbmQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gazAgKiBrMTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS5zY2FsZVRvID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrLCBwLCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLFxuICAgICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgICBrMSA9IHR5cGVvZiBrID09PSBcImZ1bmN0aW9uXCIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LFxuICAgICAgICB0eXBlb2YgeSA9PT0gXCJmdW5jdGlvblwiID8geS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeVxuICAgICAgKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgbnVsbCwgZXZlbnQpO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHksIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdCA9IHRoaXMuX196b29tLFxuICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcCA9PT0gXCJmdW5jdGlvblwiID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcDtcbiAgICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkudHJhbnNsYXRlKHAwWzBdLCBwMFsxXSkuc2NhbGUodC5rKS50cmFuc2xhdGUoXG4gICAgICAgIHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXlcbiAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgfSwgcCwgZXZlbnQpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNjYWxlKHRyYW5zZm9ybSwgaykge1xuICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIGspKTtcbiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHtcbiAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uaztcbiAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNlbnRyb2lkKGV4dGVudCkge1xuICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIsICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQsIGV2ZW50KSB7XG4gICAgdHJhbnNpdGlvblxuICAgICAgICAub24oXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLnN0YXJ0KCk7IH0pXG4gICAgICAgIC5vbihcImludGVycnVwdC56b29tIGVuZC56b29tXCIsIGZ1bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZXZlbnQoZXZlbnQpLmVuZCgpOyB9KVxuICAgICAgICAudHdlZW4oXCJ6b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcbiAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhhdCwgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLFxuICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LFxuICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSxcbiAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLFxuICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoYXQsIGFyZ3MpIDogdHJhbnNmb3JtLFxuICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29uY2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpO1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gMSkgdCA9IGI7IC8vIEF2b2lkIHJvdW5kaW5nIGVycm9yIG9uIGVuZC5cbiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCksIGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9XG4gICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7XG4gICAgcmV0dXJuICghY2xlYW4gJiYgdGhhdC5fX3pvb21pbmcpIHx8IG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7XG4gICAgdGhpcy50aGF0ID0gdGhhdDtcbiAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIHRoaXMuYWN0aXZlID0gMDtcbiAgICB0aGlzLnNvdXJjZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTtcbiAgICB0aGlzLnRhcHMgPSAwO1xuICB9XG5cbiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7XG4gICAgZXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQpIHRoaXMuc291cmNlRXZlbnQgPSBldmVudDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHtcbiAgICAgICAgdGhpcy50aGF0Ll9fem9vbWluZyA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkge1xuICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSBcIm1vdXNlXCIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMFsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDBbMF0pO1xuICAgICAgaWYgKHRoaXMudG91Y2gxICYmIGtleSAhPT0gXCJ0b3VjaFwiKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pO1xuICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTtcbiAgICAgIHRoaXMuZW1pdChcInpvb21cIik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZztcbiAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBlbWl0OiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB2YXIgZCA9IHNlbGVjdCh0aGlzLnRoYXQpLmRhdHVtKCk7XG4gICAgICBsaXN0ZW5lcnMuY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhpcy50aGF0LFxuICAgICAgICBuZXcgWm9vbUV2ZW50KHR5cGUsIHtcbiAgICAgICAgICBzb3VyY2VFdmVudDogdGhpcy5zb3VyY2VFdmVudCxcbiAgICAgICAgICB0YXJnZXQ6IHpvb20sXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB0cmFuc2Zvcm06IHRoaXMudGhhdC5fX3pvb20sXG4gICAgICAgICAgZGlzcGF0Y2g6IGxpc3RlbmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gd2hlZWxlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgIGsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHQuayAqIE1hdGgucG93KDIsIHdoZWVsRGVsdGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpKSxcbiAgICAgICAgcCA9IHBvaW50ZXIoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LlxuICAgIGlmIChnLndoZWVsKSB7XG4gICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7XG4gICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7XG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhpcyB3aGVlbCBldmVudCB3b25cdTIwMTl0IHRyaWdnZXIgYSB0cmFuc2Zvcm0gY2hhbmdlLCBpZ25vcmUgaXQuXG4gICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47XG5cbiAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuXG4gICAgZWxzZSB7XG4gICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTtcbiAgICBnLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQsIGspLCBnLm1vdXNlWzBdLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuXG4gICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHtcbiAgICAgIGcud2hlZWwgPSBudWxsO1xuICAgICAgZy5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3VzZWRvd25lZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MsIHRydWUpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbihcIm1vdXNlbW92ZS56b29tXCIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKFwibW91c2V1cC56b29tXCIsIG1vdXNldXBwZWQsIHRydWUpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCwgY3VycmVudFRhcmdldCksXG4gICAgICAgIHgwID0gZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTAgPSBldmVudC5jbGllbnRZO1xuXG4gICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7XG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgZy5tb3VzZSA9IFtwLCB0aGlzLl9fem9vbS5pbnZlcnQocCldO1xuICAgIGludGVycnVwdCh0aGlzKTtcbiAgICBnLnN0YXJ0KCk7XG5cbiAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKGV2ZW50KSB7XG4gICAgICBub2V2ZW50KGV2ZW50KTtcbiAgICAgIGlmICghZy5tb3ZlZCkge1xuICAgICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXZlbnQuY2xpZW50WSAtIHkwO1xuICAgICAgICBnLm1vdmVkID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICAgIH1cbiAgICAgIGcuZXZlbnQoZXZlbnQpXG4gICAgICAgLnpvb20oXCJtb3VzZVwiLCBjb25zdHJhaW4odHJhbnNsYXRlKGcudGhhdC5fX3pvb20sIGcubW91c2VbMF0gPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKGV2ZW50KSB7XG4gICAgICB2Lm9uKFwibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tXCIsIG51bGwpO1xuICAgICAgZHJhZ0VuYWJsZShldmVudC52aWV3LCBnLm1vdmVkKTtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgZy5ldmVudChldmVudCkuZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGJsY2xpY2tlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgcDAgPSBwb2ludGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzID8gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudCwgdGhpcyksXG4gICAgICAgIHAxID0gdDAuaW52ZXJ0KHAwKSxcbiAgICAgICAgazEgPSB0MC5rICogKGV2ZW50LnNoaWZ0S2V5ID8gMC41IDogMiksXG4gICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJncyksIHRyYW5zbGF0ZUV4dGVudCk7XG5cbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDAsIGV2ZW50KTtcbiAgICBlbHNlIHNlbGVjdCh0aGlzKS5jYWxsKHpvb20udHJhbnNmb3JtLCB0MSwgcDAsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID09PSBuKS5ldmVudChldmVudCksXG4gICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTtcbiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7XG4gICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDtcbiAgICB9XG5cbiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0b3VjaHN0YXJ0aW5nKTtcblxuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBpZiAoZy50YXBzIDwgMikgdG91Y2hmaXJzdCA9IHBbMF0sIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7XG4gICAgICBpbnRlcnJ1cHQodGhpcyk7XG4gICAgICBnLnN0YXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2htb3ZlZChldmVudCwgLi4uYXJncykge1xuICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjtcbiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJncykuZXZlbnQoZXZlbnQpLFxuICAgICAgICB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMFswXSA9IHA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBnLnRvdWNoMVswXSA9IHA7XG4gICAgfVxuICAgIHQgPSBnLnRoYXQuX196b29tO1xuICAgIGlmIChnLnRvdWNoMSkge1xuICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0sIGwwID0gZy50b3VjaDBbMV0sXG4gICAgICAgICAgcDEgPSBnLnRvdWNoMVswXSwgbDEgPSBnLnRvdWNoMVsxXSxcbiAgICAgICAgICBkcCA9IChkcCA9IHAxWzBdIC0gcDBbMF0pICogZHAgKyAoZHAgPSBwMVsxXSAtIHAwWzFdKSAqIGRwLFxuICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkgKiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7XG4gICAgICB0ID0gc2NhbGUodCwgTWF0aC5zcXJ0KGRwIC8gZGwpKTtcbiAgICAgIHAgPSBbKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMl07XG4gICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDJdO1xuICAgIH1cbiAgICBlbHNlIGlmIChnLnRvdWNoMCkgcCA9IGcudG91Y2gwWzBdLCBsID0gZy50b3VjaDBbMV07XG4gICAgZWxzZSByZXR1cm47XG5cbiAgICBnLnpvb20oXCJ0b3VjaFwiLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0O1xuXG4gICAgbm9wcm9wYWdhdGlvbihldmVudCk7XG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICB0ID0gdG91Y2hlc1tpXTtcbiAgICAgIGlmIChnLnRvdWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7XG4gICAgICBlbHNlIGlmIChnLnRvdWNoMSAmJiBnLnRvdWNoMVsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDE7XG4gICAgfVxuICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICBpZiAoZy50b3VjaDApIGcudG91Y2gwWzFdID0gdGhpcy5fX3pvb20uaW52ZXJ0KGcudG91Y2gwWzBdKTtcbiAgICBlbHNlIHtcbiAgICAgIGcuZW5kKCk7XG4gICAgICAvLyBJZiB0aGlzIHdhcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuXG4gICAgICBpZiAoZy50YXBzID09PSAyKSB7XG4gICAgICAgIHQgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgICBpZiAoTWF0aC5oeXBvdCh0b3VjaGZpcnN0WzBdIC0gdFswXSwgdG91Y2hmaXJzdFsxXSAtIHRbMV0pIDwgdGFwRGlzdGFuY2UpIHtcbiAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbihcImRibGNsaWNrLnpvb21cIik7XG4gICAgICAgICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHpvb20ud2hlZWxEZWx0YSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbERlbHRhID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCgrXyksIHpvb20pIDogd2hlZWxEZWx0YTtcbiAgfTtcblxuICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIHpvb20pIDogZmlsdGVyO1xuICB9O1xuXG4gIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgem9vbS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIHpvb20pIDogZXh0ZW50O1xuICB9O1xuXG4gIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07XG4gIH07XG5cbiAgem9vbS5jb25zdHJhaW4gPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29uc3RyYWluID0gXywgem9vbSkgOiBjb25zdHJhaW47XG4gIH07XG5cbiAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uO1xuICB9O1xuXG4gIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlO1xuICB9O1xuXG4gIHpvb20ub24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVlO1xuICB9O1xuXG4gIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpO1xuICB9O1xuXG4gIHpvb20udGFwRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFwRGlzdGFuY2UgPSArXywgem9vbSkgOiB0YXBEaXN0YW5jZTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn1cbiIsICJpbXBvcnQgUmVhY3QsIHsgbWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjYyBmcm9tICdjbGFzc2NhdCc7XG5pbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnenVzdGFuZC9zaGFsbG93JztcbmltcG9ydCB7IHVzZVN0b3JlQXBpLCB1c2VTdG9yZSwgdXNlUmVhY3RGbG93LCBQYW5lbCB9IGZyb20gJ0ByZWFjdGZsb3cvY29yZSc7XG5cbmZ1bmN0aW9uIFBsdXNJY29uKCkge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDMyIDMyXCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk0zMiAxOC4xMzNIMTguMTMzVjMyaC00LjI2NlYxOC4xMzNIMHYtNC4yNjZoMTMuODY3VjBoNC4yNjZ2MTMuODY3SDMyelwiIH0pKSk7XG59XG5cbmZ1bmN0aW9uIE1pbnVzSWNvbigpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAzMiA1XCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk0wIDBoMzJ2NC4ySDB6XCIgfSkpKTtcbn1cblxuZnVuY3Rpb24gRml0Vmlld0ljb24oKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMzIgMzBcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTMuNjkyIDQuNjNjMC0uNTMuNC0uOTM4LjkzOS0uOTM4aDUuMjE1VjBINC43MDhDMi4xMyAwIDAgMi4wNTQgMCA0LjYzdjUuMjE2aDMuNjkyVjQuNjMxek0yNy4zNTQgMGgtNS4ydjMuNjkyaDUuMTdjLjUzIDAgLjk4NC40Ljk4NC45Mzl2NS4yMTVIMzJWNC42MzFBNC42MjQgNC42MjQgMCAwMDI3LjM1NCAwem0uOTU0IDI0LjgzYzAgLjUzMi0uNC45NC0uOTM5Ljk0aC01LjIxNXYzLjc2OGg1LjIxNWMyLjU3NyAwIDQuNjMxLTIuMTMgNC42MzEtNC43MDd2LTUuMTM5aC0zLjY5MnY1LjEzOXptLTIzLjY3Ny45NGMtLjUzMSAwLS45MzktLjQtLjkzOS0uOTR2LTUuMTM4SDB2NS4xMzljMCAyLjU3NyAyLjEzIDQuNzA3IDQuNzA4IDQuNzA3aDUuMTM4VjI1Ljc3SDQuNjMxelwiIH0pKSk7XG59XG5cbmZ1bmN0aW9uIExvY2tJY29uKCkge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDI1IDMyXCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk0yMS4zMzMgMTAuNjY3SDE5LjgxVjcuNjE5QzE5LjgxIDMuNDI5IDE2LjM4IDAgMTIuMTkgMCA4IDAgNC41NzEgMy40MjkgNC41NzEgNy42MTl2My4wNDhIMy4wNDhBMy4wNTYgMy4wNTYgMCAwMDAgMTMuNzE0djE1LjIzOEEzLjA1NiAzLjA1NiAwIDAwMy4wNDggMzJoMTguMjg1YTMuMDU2IDMuMDU2IDAgMDAzLjA0OC0zLjA0OFYxMy43MTRhMy4wNTYgMy4wNTYgMCAwMC0zLjA0OC0zLjA0N3pNMTIuMTkgMjQuNTMzYTMuMDU2IDMuMDU2IDAgMDEtMy4wNDctMy4wNDcgMy4wNTYgMy4wNTYgMCAwMTMuMDQ3LTMuMDQ4IDMuMDU2IDMuMDU2IDAgMDEzLjA0OCAzLjA0OCAzLjA1NiAzLjA1NiAwIDAxLTMuMDQ4IDMuMDQ3em00LjcyNC0xMy44NjZINy40NjdWNy42MTljMC0yLjU5IDIuMTMzLTQuNzI0IDQuNzIzLTQuNzI0IDIuNTkxIDAgNC43MjQgMi4xMzMgNC43MjQgNC43MjR2My4wNDh6XCIgfSkpKTtcbn1cblxuZnVuY3Rpb24gVW5sb2NrSWNvbigpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAyNSAzMlwiIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNMjEuMzMzIDEwLjY2N0gxOS44MVY3LjYxOUMxOS44MSAzLjQyOSAxNi4zOCAwIDEyLjE5IDBjLTQuMTE0IDEuODI4LTEuMzcgMi4xMzMuMzA1IDIuNDM4IDEuNjc2LjMwNSA0LjQyIDIuNTkgNC40MiA1LjE4MXYzLjA0OEgzLjA0N0EzLjA1NiAzLjA1NiAwIDAwMCAxMy43MTR2MTUuMjM4QTMuMDU2IDMuMDU2IDAgMDAzLjA0OCAzMmgxOC4yODVhMy4wNTYgMy4wNTYgMCAwMDMuMDQ4LTMuMDQ4VjEzLjcxNGEzLjA1NiAzLjA1NiAwIDAwLTMuMDQ4LTMuMDQ3ek0xMi4xOSAyNC41MzNhMy4wNTYgMy4wNTYgMCAwMS0zLjA0Ny0zLjA0NyAzLjA1NiAzLjA1NiAwIDAxMy4wNDctMy4wNDggMy4wNTYgMy4wNTYgMCAwMTMuMDQ4IDMuMDQ4IDMuMDU2IDMuMDU2IDAgMDEtMy4wNDggMy4wNDd6XCIgfSkpKTtcbn1cblxuY29uc3QgQ29udHJvbEJ1dHRvbiA9ICh7IGNoaWxkcmVuLCBjbGFzc05hbWUsIC4uLnJlc3QgfSkgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyB0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fY29udHJvbHMtYnV0dG9uJywgY2xhc3NOYW1lXSksIC4uLnJlc3QgfSwgY2hpbGRyZW4pKTtcbkNvbnRyb2xCdXR0b24uZGlzcGxheU5hbWUgPSAnQ29udHJvbEJ1dHRvbic7XG5cbmNvbnN0IHNlbGVjdG9yID0gKHMpID0+ICh7XG4gICAgaXNJbnRlcmFjdGl2ZTogcy5ub2Rlc0RyYWdnYWJsZSB8fCBzLm5vZGVzQ29ubmVjdGFibGUgfHwgcy5lbGVtZW50c1NlbGVjdGFibGUsXG4gICAgbWluWm9vbVJlYWNoZWQ6IHMudHJhbnNmb3JtWzJdIDw9IHMubWluWm9vbSxcbiAgICBtYXhab29tUmVhY2hlZDogcy50cmFuc2Zvcm1bMl0gPj0gcy5tYXhab29tLFxufSk7XG5jb25zdCBDb250cm9scyA9ICh7IHN0eWxlLCBzaG93Wm9vbSA9IHRydWUsIHNob3dGaXRWaWV3ID0gdHJ1ZSwgc2hvd0ludGVyYWN0aXZlID0gdHJ1ZSwgZml0Vmlld09wdGlvbnMsIG9uWm9vbUluLCBvblpvb21PdXQsIG9uRml0Vmlldywgb25JbnRlcmFjdGl2ZUNoYW5nZSwgY2xhc3NOYW1lLCBjaGlsZHJlbiwgcG9zaXRpb24gPSAnYm90dG9tLWxlZnQnLCB9KSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IFtpc1Zpc2libGUsIHNldElzVmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgeyBpc0ludGVyYWN0aXZlLCBtaW5ab29tUmVhY2hlZCwgbWF4Wm9vbVJlYWNoZWQgfSA9IHVzZVN0b3JlKHNlbGVjdG9yLCBzaGFsbG93KTtcbiAgICBjb25zdCB7IHpvb21Jbiwgem9vbU91dCwgZml0VmlldyB9ID0gdXNlUmVhY3RGbG93KCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0SXNWaXNpYmxlKHRydWUpO1xuICAgIH0sIFtdKTtcbiAgICBpZiAoIWlzVmlzaWJsZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb25ab29tSW5IYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB6b29tSW4oKTtcbiAgICAgICAgb25ab29tSW4/LigpO1xuICAgIH07XG4gICAgY29uc3Qgb25ab29tT3V0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgem9vbU91dCgpO1xuICAgICAgICBvblpvb21PdXQ/LigpO1xuICAgIH07XG4gICAgY29uc3Qgb25GaXRWaWV3SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgZml0VmlldyhmaXRWaWV3T3B0aW9ucyk7XG4gICAgICAgIG9uRml0Vmlldz8uKCk7XG4gICAgfTtcbiAgICBjb25zdCBvblRvZ2dsZUludGVyYWN0aXZpdHkgPSAoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG5vZGVzRHJhZ2dhYmxlOiAhaXNJbnRlcmFjdGl2ZSxcbiAgICAgICAgICAgIG5vZGVzQ29ubmVjdGFibGU6ICFpc0ludGVyYWN0aXZlLFxuICAgICAgICAgICAgZWxlbWVudHNTZWxlY3RhYmxlOiAhaXNJbnRlcmFjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG9uSW50ZXJhY3RpdmVDaGFuZ2U/LighaXNJbnRlcmFjdGl2ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGFuZWwsIHsgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3dfX2NvbnRyb2xzJywgY2xhc3NOYW1lXSksIHBvc2l0aW9uOiBwb3NpdGlvbiwgc3R5bGU6IHN0eWxlLCBcImRhdGEtdGVzdGlkXCI6IFwicmZfX2NvbnRyb2xzXCIgfSxcbiAgICAgICAgc2hvd1pvb20gJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xCdXR0b24sIHsgb25DbGljazogb25ab29tSW5IYW5kbGVyLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fY29udHJvbHMtem9vbWluXCIsIHRpdGxlOiBcInpvb20gaW5cIiwgXCJhcmlhLWxhYmVsXCI6IFwiem9vbSBpblwiLCBkaXNhYmxlZDogbWF4Wm9vbVJlYWNoZWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFBsdXNJY29uLCBudWxsKSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xCdXR0b24sIHsgb25DbGljazogb25ab29tT3V0SGFuZGxlciwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2NvbnRyb2xzLXpvb21vdXRcIiwgdGl0bGU6IFwiem9vbSBvdXRcIiwgXCJhcmlhLWxhYmVsXCI6IFwiem9vbSBvdXRcIiwgZGlzYWJsZWQ6IG1pblpvb21SZWFjaGVkIH0sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChNaW51c0ljb24sIG51bGwpKSkpLFxuICAgICAgICBzaG93Rml0VmlldyAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb250cm9sQnV0dG9uLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19jb250cm9scy1maXR2aWV3XCIsIG9uQ2xpY2s6IG9uRml0Vmlld0hhbmRsZXIsIHRpdGxlOiBcImZpdCB2aWV3XCIsIFwiYXJpYS1sYWJlbFwiOiBcImZpdCB2aWV3XCIgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRml0Vmlld0ljb24sIG51bGwpKSksXG4gICAgICAgIHNob3dJbnRlcmFjdGl2ZSAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChDb250cm9sQnV0dG9uLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19jb250cm9scy1pbnRlcmFjdGl2ZVwiLCBvbkNsaWNrOiBvblRvZ2dsZUludGVyYWN0aXZpdHksIHRpdGxlOiBcInRvZ2dsZSBpbnRlcmFjdGl2aXR5XCIsIFwiYXJpYS1sYWJlbFwiOiBcInRvZ2dsZSBpbnRlcmFjdGl2aXR5XCIgfSwgaXNJbnRlcmFjdGl2ZSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVW5sb2NrSWNvbiwgbnVsbCkgOiBSZWFjdC5jcmVhdGVFbGVtZW50KExvY2tJY29uLCBudWxsKSkpLFxuICAgICAgICBjaGlsZHJlbikpO1xufTtcbkNvbnRyb2xzLmRpc3BsYXlOYW1lID0gJ0NvbnRyb2xzJztcbnZhciBDb250cm9scyQxID0gbWVtbyhDb250cm9scyk7XG5cbmV4cG9ydCB7IENvbnRyb2xCdXR0b24sIENvbnRyb2xzJDEgYXMgQ29udHJvbHMgfTtcbiIsICJpbXBvcnQgUmVhY3QsIHsgbWVtbywgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNjIGZyb20gJ2NsYXNzY2F0JztcbmltcG9ydCB7IHVzZVN0b3JlIH0gZnJvbSAnQHJlYWN0Zmxvdy9jb3JlJztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICd6dXN0YW5kL3NoYWxsb3cnO1xuXG52YXIgQmFja2dyb3VuZFZhcmlhbnQ7XG4oZnVuY3Rpb24gKEJhY2tncm91bmRWYXJpYW50KSB7XG4gICAgQmFja2dyb3VuZFZhcmlhbnRbXCJMaW5lc1wiXSA9IFwibGluZXNcIjtcbiAgICBCYWNrZ3JvdW5kVmFyaWFudFtcIkRvdHNcIl0gPSBcImRvdHNcIjtcbiAgICBCYWNrZ3JvdW5kVmFyaWFudFtcIkNyb3NzXCJdID0gXCJjcm9zc1wiO1xufSkoQmFja2dyb3VuZFZhcmlhbnQgfHwgKEJhY2tncm91bmRWYXJpYW50ID0ge30pKTtcblxuZnVuY3Rpb24gTGluZVBhdHRlcm4oeyBjb2xvciwgZGltZW5zaW9ucywgbGluZVdpZHRoIH0pIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgc3Ryb2tlOiBjb2xvciwgc3Ryb2tlV2lkdGg6IGxpbmVXaWR0aCwgZDogYE0ke2RpbWVuc2lvbnNbMF0gLyAyfSAwIFYke2RpbWVuc2lvbnNbMV19IE0wICR7ZGltZW5zaW9uc1sxXSAvIDJ9IEgke2RpbWVuc2lvbnNbMF19YCB9KSk7XG59XG5mdW5jdGlvbiBEb3RQYXR0ZXJuKHsgY29sb3IsIHJhZGl1cyB9KSB7XG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwgeyBjeDogcmFkaXVzLCBjeTogcmFkaXVzLCByOiByYWRpdXMsIGZpbGw6IGNvbG9yIH0pO1xufVxuXG5jb25zdCBkZWZhdWx0Q29sb3IgPSB7XG4gICAgW0JhY2tncm91bmRWYXJpYW50LkRvdHNdOiAnIzkxOTE5YScsXG4gICAgW0JhY2tncm91bmRWYXJpYW50LkxpbmVzXTogJyNlZWUnLFxuICAgIFtCYWNrZ3JvdW5kVmFyaWFudC5Dcm9zc106ICcjZTJlMmUyJyxcbn07XG5jb25zdCBkZWZhdWx0U2l6ZSA9IHtcbiAgICBbQmFja2dyb3VuZFZhcmlhbnQuRG90c106IDEsXG4gICAgW0JhY2tncm91bmRWYXJpYW50LkxpbmVzXTogMSxcbiAgICBbQmFja2dyb3VuZFZhcmlhbnQuQ3Jvc3NdOiA2LFxufTtcbmNvbnN0IHNlbGVjdG9yID0gKHMpID0+ICh7IHRyYW5zZm9ybTogcy50cmFuc2Zvcm0sIHBhdHRlcm5JZDogYHBhdHRlcm4tJHtzLnJmSWR9YCB9KTtcbmZ1bmN0aW9uIEJhY2tncm91bmQoeyBpZCwgdmFyaWFudCA9IEJhY2tncm91bmRWYXJpYW50LkRvdHMsIFxuLy8gb25seSB1c2VkIGZvciBkb3RzIGFuZCBjcm9zc1xuZ2FwID0gMjAsIFxuLy8gb25seSB1c2VkIGZvciBsaW5lcyBhbmQgY3Jvc3NcbnNpemUsIGxpbmVXaWR0aCA9IDEsIG9mZnNldCA9IDIsIGNvbG9yLCBzdHlsZSwgY2xhc3NOYW1lLCB9KSB7XG4gICAgY29uc3QgcmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgdHJhbnNmb3JtLCBwYXR0ZXJuSWQgfSA9IHVzZVN0b3JlKHNlbGVjdG9yLCBzaGFsbG93KTtcbiAgICBjb25zdCBwYXR0ZXJuQ29sb3IgPSBjb2xvciB8fCBkZWZhdWx0Q29sb3JbdmFyaWFudF07XG4gICAgY29uc3QgcGF0dGVyblNpemUgPSBzaXplIHx8IGRlZmF1bHRTaXplW3ZhcmlhbnRdO1xuICAgIGNvbnN0IGlzRG90cyA9IHZhcmlhbnQgPT09IEJhY2tncm91bmRWYXJpYW50LkRvdHM7XG4gICAgY29uc3QgaXNDcm9zcyA9IHZhcmlhbnQgPT09IEJhY2tncm91bmRWYXJpYW50LkNyb3NzO1xuICAgIGNvbnN0IGdhcFhZID0gQXJyYXkuaXNBcnJheShnYXApID8gZ2FwIDogW2dhcCwgZ2FwXTtcbiAgICBjb25zdCBzY2FsZWRHYXAgPSBbZ2FwWFlbMF0gKiB0cmFuc2Zvcm1bMl0gfHwgMSwgZ2FwWFlbMV0gKiB0cmFuc2Zvcm1bMl0gfHwgMV07XG4gICAgY29uc3Qgc2NhbGVkU2l6ZSA9IHBhdHRlcm5TaXplICogdHJhbnNmb3JtWzJdO1xuICAgIGNvbnN0IHBhdHRlcm5EaW1lbnNpb25zID0gaXNDcm9zcyA/IFtzY2FsZWRTaXplLCBzY2FsZWRTaXplXSA6IHNjYWxlZEdhcDtcbiAgICBjb25zdCBwYXR0ZXJuT2Zmc2V0ID0gaXNEb3RzXG4gICAgICAgID8gW3NjYWxlZFNpemUgLyBvZmZzZXQsIHNjYWxlZFNpemUgLyBvZmZzZXRdXG4gICAgICAgIDogW3BhdHRlcm5EaW1lbnNpb25zWzBdIC8gb2Zmc2V0LCBwYXR0ZXJuRGltZW5zaW9uc1sxXSAvIG9mZnNldF07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3dfX2JhY2tncm91bmQnLCBjbGFzc05hbWVdKSwgc3R5bGU6IHtcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB9LCByZWY6IHJlZiwgXCJkYXRhLXRlc3RpZFwiOiBcInJmX19iYWNrZ3JvdW5kXCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdHRlcm5cIiwgeyBpZDogcGF0dGVybklkICsgaWQsIHg6IHRyYW5zZm9ybVswXSAlIHNjYWxlZEdhcFswXSwgeTogdHJhbnNmb3JtWzFdICUgc2NhbGVkR2FwWzFdLCB3aWR0aDogc2NhbGVkR2FwWzBdLCBoZWlnaHQ6IHNjYWxlZEdhcFsxXSwgcGF0dGVyblVuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCIsIHBhdHRlcm5UcmFuc2Zvcm06IGB0cmFuc2xhdGUoLSR7cGF0dGVybk9mZnNldFswXX0sLSR7cGF0dGVybk9mZnNldFsxXX0pYCB9LCBpc0RvdHMgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChEb3RQYXR0ZXJuLCB7IGNvbG9yOiBwYXR0ZXJuQ29sb3IsIHJhZGl1czogc2NhbGVkU2l6ZSAvIG9mZnNldCB9KSkgOiAoUmVhY3QuY3JlYXRlRWxlbWVudChMaW5lUGF0dGVybiwgeyBkaW1lbnNpb25zOiBwYXR0ZXJuRGltZW5zaW9ucywgY29sb3I6IHBhdHRlcm5Db2xvciwgbGluZVdpZHRoOiBsaW5lV2lkdGggfSkpKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwgeyB4OiBcIjBcIiwgeTogXCIwXCIsIHdpZHRoOiBcIjEwMCVcIiwgaGVpZ2h0OiBcIjEwMCVcIiwgZmlsbDogYHVybCgjJHtwYXR0ZXJuSWQgKyBpZH0pYCB9KSkpO1xufVxuQmFja2dyb3VuZC5kaXNwbGF5TmFtZSA9ICdCYWNrZ3JvdW5kJztcbnZhciBCYWNrZ3JvdW5kJDEgPSBtZW1vKEJhY2tncm91bmQpO1xuXG5leHBvcnQgeyBCYWNrZ3JvdW5kJDEgYXMgQmFja2dyb3VuZCwgQmFja2dyb3VuZFZhcmlhbnQgfTtcbiIsICJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VTdG9yZSwgdXNlTm9kZUlkLCBnZXROb2Rlc0JvdW5kcywgaW50ZXJuYWxzU3ltYm9sLCBQb3NpdGlvbiB9IGZyb20gJ0ByZWFjdGZsb3cvY29yZSc7XG5pbXBvcnQgY2MgZnJvbSAnY2xhc3NjYXQnO1xuaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ3p1c3RhbmQvc2hhbGxvdyc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuXG5jb25zdCBzZWxlY3RvciA9IChzdGF0ZSkgPT4gc3RhdGUuZG9tTm9kZT8ucXVlcnlTZWxlY3RvcignLnJlYWN0LWZsb3dfX3JlbmRlcmVyJyk7XG5mdW5jdGlvbiBOb2RlVG9vbGJhclBvcnRhbCh7IGNoaWxkcmVuIH0pIHtcbiAgICBjb25zdCB3cmFwcGVyUmVmID0gdXNlU3RvcmUoc2VsZWN0b3IpO1xuICAgIGlmICghd3JhcHBlclJlZikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgd3JhcHBlclJlZik7XG59XG5cbmNvbnN0IG5vZGVFcXVhbGl0eUZuID0gKGEsIGIpID0+IGE/LnBvc2l0aW9uQWJzb2x1dGU/LnggPT09IGI/LnBvc2l0aW9uQWJzb2x1dGU/LnggJiZcbiAgICBhPy5wb3NpdGlvbkFic29sdXRlPy55ID09PSBiPy5wb3NpdGlvbkFic29sdXRlPy55ICYmXG4gICAgYT8ud2lkdGggPT09IGI/LndpZHRoICYmXG4gICAgYT8uaGVpZ2h0ID09PSBiPy5oZWlnaHQgJiZcbiAgICBhPy5zZWxlY3RlZCA9PT0gYj8uc2VsZWN0ZWQgJiZcbiAgICBhPy5baW50ZXJuYWxzU3ltYm9sXT8ueiA9PT0gYj8uW2ludGVybmFsc1N5bWJvbF0/Lno7XG5jb25zdCBub2Rlc0VxdWFsaXR5Rm4gPSAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgobm9kZSwgaSkgPT4gbm9kZUVxdWFsaXR5Rm4obm9kZSwgYltpXSkpO1xufTtcbmNvbnN0IHN0b3JlU2VsZWN0b3IgPSAoc3RhdGUpID0+ICh7XG4gICAgdHJhbnNmb3JtOiBzdGF0ZS50cmFuc2Zvcm0sXG4gICAgbm9kZU9yaWdpbjogc3RhdGUubm9kZU9yaWdpbixcbiAgICBzZWxlY3RlZE5vZGVzQ291bnQ6IHN0YXRlLmdldE5vZGVzKCkuZmlsdGVyKChub2RlKSA9PiBub2RlLnNlbGVjdGVkKS5sZW5ndGgsXG59KTtcbmZ1bmN0aW9uIGdldFRyYW5zZm9ybShub2RlUmVjdCwgdHJhbnNmb3JtLCBwb3NpdGlvbiwgb2Zmc2V0LCBhbGlnbikge1xuICAgIGxldCBhbGlnbm1lbnRPZmZzZXQgPSAwLjU7XG4gICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgIGFsaWdubWVudE9mZnNldCA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFsaWduID09PSAnZW5kJykge1xuICAgICAgICBhbGlnbm1lbnRPZmZzZXQgPSAxO1xuICAgIH1cbiAgICAvLyBwb3NpdGlvbiA9PT0gUG9zaXRpb24uVG9wXG4gICAgLy8gd2Ugc2V0IHRoZSB4IGFueSB5IHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyIGJhc2VkIG9uIHRoZSBub2RlcyBwb3NpdGlvblxuICAgIGxldCBwb3MgPSBbXG4gICAgICAgIChub2RlUmVjdC54ICsgbm9kZVJlY3Qud2lkdGggKiBhbGlnbm1lbnRPZmZzZXQpICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzBdLFxuICAgICAgICBub2RlUmVjdC55ICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzFdIC0gb2Zmc2V0LFxuICAgIF07XG4gICAgLy8gYW5kIHRoYW4gc2hpZnQgaXQgYmFzZWQgb24gdGhlIGFsaWdubWVudC4gVGhlIHNoaWZ0IHZhbHVlcyBhcmUgaW4gJS5cbiAgICBsZXQgc2hpZnQgPSBbLTEwMCAqIGFsaWdubWVudE9mZnNldCwgLTEwMF07XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgICBjYXNlIFBvc2l0aW9uLlJpZ2h0OlxuICAgICAgICAgICAgcG9zID0gW1xuICAgICAgICAgICAgICAgIChub2RlUmVjdC54ICsgbm9kZVJlY3Qud2lkdGgpICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzBdICsgb2Zmc2V0LFxuICAgICAgICAgICAgICAgIChub2RlUmVjdC55ICsgbm9kZVJlY3QuaGVpZ2h0ICogYWxpZ25tZW50T2Zmc2V0KSAqIHRyYW5zZm9ybVsyXSArIHRyYW5zZm9ybVsxXSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzaGlmdCA9IFswLCAtMTAwICogYWxpZ25tZW50T2Zmc2V0XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkJvdHRvbTpcbiAgICAgICAgICAgIHBvc1sxXSA9IChub2RlUmVjdC55ICsgbm9kZVJlY3QuaGVpZ2h0KSAqIHRyYW5zZm9ybVsyXSArIHRyYW5zZm9ybVsxXSArIG9mZnNldDtcbiAgICAgICAgICAgIHNoaWZ0WzFdID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkxlZnQ6XG4gICAgICAgICAgICBwb3MgPSBbXG4gICAgICAgICAgICAgICAgbm9kZVJlY3QueCAqIHRyYW5zZm9ybVsyXSArIHRyYW5zZm9ybVswXSAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICAobm9kZVJlY3QueSArIG5vZGVSZWN0LmhlaWdodCAqIGFsaWdubWVudE9mZnNldCkgKiB0cmFuc2Zvcm1bMl0gKyB0cmFuc2Zvcm1bMV0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgc2hpZnQgPSBbLTEwMCwgLTEwMCAqIGFsaWdubWVudE9mZnNldF07XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtwb3NbMF19cHgsICR7cG9zWzFdfXB4KSB0cmFuc2xhdGUoJHtzaGlmdFswXX0lLCAke3NoaWZ0WzFdfSUpYDtcbn1cbmZ1bmN0aW9uIE5vZGVUb29sYmFyKHsgbm9kZUlkLCBjaGlsZHJlbiwgY2xhc3NOYW1lLCBzdHlsZSwgaXNWaXNpYmxlLCBwb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgb2Zmc2V0ID0gMTAsIGFsaWduID0gJ2NlbnRlcicsIC4uLnJlc3QgfSkge1xuICAgIGNvbnN0IGNvbnRleHROb2RlSWQgPSB1c2VOb2RlSWQoKTtcbiAgICBjb25zdCBub2Rlc1NlbGVjdG9yID0gdXNlQ2FsbGJhY2soKHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVJZHMgPSBBcnJheS5pc0FycmF5KG5vZGVJZCkgPyBub2RlSWQgOiBbbm9kZUlkIHx8IGNvbnRleHROb2RlSWQgfHwgJyddO1xuICAgICAgICByZXR1cm4gbm9kZUlkcy5yZWR1Y2UoKGFjYywgaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5ub2RlSW50ZXJuYWxzLmdldChpZCk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGFjYy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuICAgIH0sIFtub2RlSWQsIGNvbnRleHROb2RlSWRdKTtcbiAgICBjb25zdCBub2RlcyA9IHVzZVN0b3JlKG5vZGVzU2VsZWN0b3IsIG5vZGVzRXF1YWxpdHlGbik7XG4gICAgY29uc3QgeyB0cmFuc2Zvcm0sIG5vZGVPcmlnaW4sIHNlbGVjdGVkTm9kZXNDb3VudCB9ID0gdXNlU3RvcmUoc3RvcmVTZWxlY3Rvciwgc2hhbGxvdyk7XG4gICAgY29uc3QgaXNBY3RpdmUgPSB0eXBlb2YgaXNWaXNpYmxlID09PSAnYm9vbGVhbicgPyBpc1Zpc2libGUgOiBub2Rlcy5sZW5ndGggPT09IDEgJiYgbm9kZXNbMF0uc2VsZWN0ZWQgJiYgc2VsZWN0ZWROb2Rlc0NvdW50ID09PSAxO1xuICAgIGlmICghaXNBY3RpdmUgfHwgIW5vZGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgbm9kZVJlY3QgPSBnZXROb2Rlc0JvdW5kcyhub2Rlcywgbm9kZU9yaWdpbik7XG4gICAgY29uc3QgekluZGV4ID0gTWF0aC5tYXgoLi4ubm9kZXMubWFwKChub2RlKSA9PiAobm9kZVtpbnRlcm5hbHNTeW1ib2xdPy56IHx8IDEpICsgMSkpO1xuICAgIGNvbnN0IHdyYXBwZXJTdHlsZSA9IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNmb3JtKG5vZGVSZWN0LCB0cmFuc2Zvcm0sIHBvc2l0aW9uLCBvZmZzZXQsIGFsaWduKSxcbiAgICAgICAgekluZGV4LFxuICAgICAgICAuLi5zdHlsZSxcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChOb2RlVG9vbGJhclBvcnRhbCwgbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHN0eWxlOiB3cmFwcGVyU3R5bGUsIGNsYXNzTmFtZTogY2MoWydyZWFjdC1mbG93X19ub2RlLXRvb2xiYXInLCBjbGFzc05hbWVdKSwgLi4ucmVzdCB9LCBjaGlsZHJlbikpKTtcbn1cblxuZXhwb3J0IHsgTm9kZVRvb2xiYXIgfTtcbiIsICIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYnNpZGlhbiBJbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuaW1wb3J0IHsgQXBwLCBNb2RhbCwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogXHUwNDE4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0MzJcdTA0M0VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzIsIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQ0NSBcdTA0MzIgXHUwNDNDXHUwNDNFXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRVx1MDQzQVx1MDQzRFx1MDQzRSBHcmFwaFNldHRpbmdzTW9kYWwuXHJcbiAqL1xyXG5pbnRlcmZhY2UgR3JhcGhTZXR0aW5nc01vZGFsUHJvcHMge1xyXG4gICAgYXBwOiBBcHA7XHJcbiAgICBncmFwaElkOiBzdHJpbmc7XHJcbiAgICBncmFwaFRpdGxlOiBzdHJpbmc7XHJcbiAgICBpbml0aWFsQ3VzdG9tU3lzdGVtUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgb25TYXZlOiAoZ3JhcGhJZDogc3RyaW5nLCBjdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGwpID0+IFByb21pc2U8dm9pZD47XHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdyYXBoU2V0dGluZ3NNb2RhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vKipcclxuICogXHUwNDFDXHUwNDNFXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRVx1MDQzQVx1MDQzRFx1MDQzRSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0Nlx1MDQzOFx1MDQ0NFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0FcdTA0NDBcdTA0MzVcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEdyYXBoU2V0dGluZ3NNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuICAgIHByaXZhdGUgZ3JhcGhJZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBncmFwaFRpdGxlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHByaXZhdGUgaW5pdGlhbEN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHByaXZhdGUgb25TYXZlOiAoZ3JhcGhJZDogc3RyaW5nLCBjdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGwpID0+IFByb21pc2U8dm9pZD47XHJcblxyXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHByb3BzOiBHcmFwaFNldHRpbmdzTW9kYWxQcm9wcykge1xyXG4gICAgICAgIHN1cGVyKGFwcCk7XHJcbiAgICAgICAgdGhpcy5ncmFwaElkID0gcHJvcHMuZ3JhcGhJZDtcclxuICAgICAgICB0aGlzLmdyYXBoVGl0bGUgPSBwcm9wcy5ncmFwaFRpdGxlO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU3lzdGVtUHJvbXB0ID0gcHJvcHMuaW5pdGlhbEN1c3RvbVN5c3RlbVByb21wdDtcclxuICAgICAgICB0aGlzLmluaXRpYWxDdXN0b21TeXN0ZW1Qcm9tcHQgPSBwcm9wcy5pbml0aWFsQ3VzdG9tU3lzdGVtUHJvbXB0O1xyXG4gICAgICAgIHRoaXMub25TYXZlID0gcHJvcHMub25TYXZlO1xyXG5cclxuICAgICAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dChgXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMDogJHt0aGlzLmdyYXBoVGl0bGV9YCk7XHJcbiAgICAgICAgdGhpcy5tb2RhbEVsLmFkZENsYXNzKCdsbG0tYWdlbnQtZ3JhcGgtc2V0dGluZ3MtbW9kYWwnKTtcclxuICAgIH1cclxuXHJcbiAgICBvbk9wZW4oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XHJcblxyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5c3RlbSBQcm9tcHQgU2V0dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50RWwpXHJcbiAgICAgICAgICAgIC5zZXROYW1lKCdcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MicpXHJcbiAgICAgICAgICAgIC5zZXREZXNjKCdcdTA0MkRcdTA0NDJcdTA0M0VcdTA0NDIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NENcdTA0NDFcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFIFx1MDQzM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwLiBcdTA0MUVcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0NENcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRCXHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIuJylcclxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKHRleHRBcmVhID0+IHtcclxuICAgICAgICAgICAgICAgIHRleHRBcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKCdcdTA0MTJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuLi4nKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLmN1c3RvbVN5c3RlbVByb21wdCB8fCAnJylcclxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbVN5c3RlbVByb21wdCA9IHZhbHVlLnRyaW0oKSA9PT0gJycgPyBudWxsIDogdmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGV4dEFyZWEuaW5wdXRFbC5yb3dzID0gNjtcclxuICAgICAgICAgICAgICAgIHRleHRBcmVhLmlucHV0RWwuc3R5bGUubWluV2lkdGggPSAnNDAwcHgnO1xyXG4gICAgICAgICAgICAgICAgdGV4dEFyZWEuaW5wdXRFbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFjdGlvbiBCdXR0b25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBuZXcgU2V0dGluZyhjb250ZW50RWwpXHJcbiAgICAgICAgICAgIC5hZGRCdXR0b24oYnV0dG9uID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KCdcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDJcdTA0NEMnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRDdGEoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vblNhdmUodGhpcy5ncmFwaElkLCB0aGlzLmN1c3RvbVN5c3RlbVByb21wdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmFkZEJ1dHRvbihidXR0b24gPT4ge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ1x1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzAgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5JylcclxuICAgICAgICAgICAgICAgICAgICAuc2V0Q2xhc3MoJ21vZC13YXJuaW5nJylcclxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25TYXZlKHRoaXMuZ3JhcGhJZCwgbnVsbCk7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBudWxsIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDFcdTA0MzBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnXHUwNDFFXHUwNDQyXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDMwJylcclxuICAgICAgICAgICAgICAgICAgICAub25DbGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuICAgIH1cclxufSIsICIvKlxyXG4gKiBDaGF0VmlldyBcdTA0NDNcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDIFx1MDQzOFx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQ0NFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQzRVx1MDQzQyBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAsIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5LFxyXG4gKiBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDM3XHUwNDMwXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDRCIExMTS1cdTA0MzBcdTA0MzNcdTA0MzVcdTA0M0RcdTA0NDJcdTA0NDMgXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NEIsIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQ0RiBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSXRlbVZpZXcsIE5vdGljZSwgV29ya3NwYWNlTGVhZiB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgQ2hhdFBhbmVsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9DaGF0UGFuZWwnO1xyXG5pbXBvcnQgTExNQWdlbnRQbHVnaW4gZnJvbSAnbWFpbic7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnQgfSBmcm9tICdzcmMvY29tcG9uZW50cy9tb2RlbHMvQ2hhdEhpc3RvcnlJdGVtJztcclxuXHJcbmV4cG9ydCBjb25zdCBDSEFUX1ZJRVdfVFlQRSA9ICdsbG0tYWdlbnQtY2hhdC12aWV3JztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENoYXQgVmlldyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaGF0VmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcclxuXHRwbHVnaW46IExMTUFnZW50UGx1Z2luO1xyXG5cdGNoYXRIaXN0b3J5OiBhbnlbXTtcclxuXHRzZWxlY3RlZEdyYXBoSWQ6IHN0cmluZyB8IG51bGw7XHJcblx0Y3VycmVudE5vZGU6IHN0cmluZyB8IG51bGw7XHJcblx0Y2hhdENvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XHJcblx0Y2hhdFBhbmVsOiBDaGF0UGFuZWwgfCBudWxsO1xyXG5cdGF2YWlsYWJsZU1vZGVsczogc3RyaW5nW107XHJcblx0Y3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xyXG5cdGN1cnJlbnRTdHJlYW1pbmdOb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihsZWFmOiBXb3Jrc3BhY2VMZWFmLCBwbHVnaW46IExMTUFnZW50UGx1Z2luKSB7XHJcblx0XHRzdXBlcihsZWFmKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdFx0dGhpcy5jaGF0SGlzdG9yeSA9IFtdO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEdyYXBoSWQgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XHJcblx0XHR0aGlzLmNoYXRQYW5lbCA9IG51bGw7XHJcblx0XHR0aGlzLmF2YWlsYWJsZU1vZGVscyA9IFtdO1xyXG5cdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgPSBudWxsO1xyXG5cdH1cclxuXHJcblx0Z2V0Vmlld1R5cGUoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBDSEFUX1ZJRVdfVFlQRTtcclxuXHR9XHJcblxyXG5cdGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gJ0xMTSBBZ2VudCBDaGF0JztcclxuXHR9XHJcblxyXG5cdGdldEljb24oKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAnbWVzc2FnZS1jaXJjbGUnO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGNvbnRhaW5lci5lbXB0eSgpO1xyXG5cclxuXHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAgKFx1MDQzMVx1MDQzNVx1MDQzNyBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzgpXHJcblx0XHR0aGlzLmNoYXRDb250YWluZXIgPSBjb250YWluZXIuY3JlYXRlRGl2KCkgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblx0XHR0aGlzLmNoYXRDb250YWluZXIuYWRkQ2xhc3MoJ2xsbS1hZ2VudC1jaGF0LWNvbnRhaW5lcicpO1xyXG5cclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNDXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM4XHJcblx0XHRhd2FpdCB0aGlzLmZldGNoQXZhaWxhYmxlTW9kZWxzKCk7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0NDdcdTA0MzBcdTA0NDIgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQ0MSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0NDdcdTA0MzVcdTA0MzkgcGx1Z2luXHJcblx0XHR0aGlzLmNoYXRQYW5lbCA9IG5ldyBDaGF0UGFuZWwodGhpcy5jaGF0Q29udGFpbmVyLCB7XHJcblx0XHRcdGNoYXRIaXN0b3J5OiB0aGlzLmNoYXRIaXN0b3J5LFxyXG5cdFx0XHRvblNlbmRNZXNzYWdlOiB0aGlzLmhhbmRsZVNlbmRNZXNzYWdlLmJpbmQodGhpcyksXHJcblx0XHRcdGF2YWlsYWJsZU1vZGVsczogdGhpcy5hdmFpbGFibGVNb2RlbHMsXHJcblx0XHRcdHNlbGVjdGVkTW9kZWw6IHRoaXMucGx1Z2luLnNldHRpbmdzLmRlZmF1bHRNb2RlbCB8fCAnZ2VtaW5pLTIuNS1mbGFzaCcsXHJcblx0XHRcdHBsdWdpbjogdGhpcy5wbHVnaW4sXHJcblx0XHRcdGN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdDogdGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHRcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdub2RlLXNlbGVjdGVkJywgdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignbmV3LWNoYXQnLCB0aGlzLmhhbmRsZU5ld0NoYXQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignZ3JhcGgtc2VsZWN0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoU2VsZWN0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbigncmVnZW5lcmF0ZS1tZXNzYWdlJywgdGhpcy5oYW5kbGVSZWdlbmVyYXRlTWVzc2FnZS5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCd3cy1ub2RlLXR5cGUtY2hhbmdlZCcsIHRoaXMuaGFuZGxlTm9kZVR5cGVDaGFuZ2VkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3N0YXJ0LW5ldy1pbmRlcGVuZGVudC1jaGF0JywgdGhpcy5oYW5kbGVTdGFydE5ld0luZGVwZW5kZW50Q2hhdC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdncmFwaC1jdXN0b20tcHJvbXB0LXVwZGF0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoQ3VzdG9tUHJvbXB0VXBkYXRlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzdG9wLXN0cmVhbS1yZXF1ZXN0JywgdGhpcy5oYW5kbGVTdG9wU3RyZWFtUmVxdWVzdC5iaW5kKHRoaXMpKTsgLy8gXHUwNDFEXHUwNDFFXHUwNDEyXHUwNDFFXHUwNDE1XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignc3RyZWFtLXN0YXJ0ZWQnLCB0aGlzLmhhbmRsZVN0cmVhbVN0YXJ0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignc3RyZWFtLWVuZGVkJywgdGhpcy5oYW5kbGVTdHJlYW1FbmRlZC5iaW5kKHRoaXMpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9uQ2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0dGhpcy5jaGF0UGFuZWwuZGVzdHJveSgpO1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbCA9IG51bGw7XHJcblx0XHR9XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ25vZGUtc2VsZWN0ZWQnLCB0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ25ldy1jaGF0JywgdGhpcy5oYW5kbGVOZXdDaGF0KTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignZ3JhcGgtc2VsZWN0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoU2VsZWN0ZWQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdyZWdlbmVyYXRlLW1lc3NhZ2UnLCB0aGlzLmhhbmRsZVJlZ2VuZXJhdGVNZXNzYWdlKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignd3Mtbm9kZS10eXBlLWNoYW5nZWQnLCB0aGlzLmhhbmRsZU5vZGVUeXBlQ2hhbmdlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3N0YXJ0LW5ldy1pbmRlcGVuZGVudC1jaGF0JywgdGhpcy5oYW5kbGVTdGFydE5ld0luZGVwZW5kZW50Q2hhdCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcsIHRoaXMuaGFuZGxlR3JhcGhDdXN0b21Qcm9tcHRVcGRhdGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignc3RvcC1zdHJlYW0tcmVxdWVzdCcsIHRoaXMuaGFuZGxlU3RvcFN0cmVhbVJlcXVlc3QpOyAvLyBcdTA0MURcdTA0MUVcdTA0MTJcdTA0MUVcdTA0MTVcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignc3RyZWFtLXN0YXJ0ZWQnLCB0aGlzLmhhbmRsZVN0cmVhbVN0YXJ0ZWQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdzdHJlYW0tZW5kZWQnLCB0aGlzLmhhbmRsZVN0cmVhbUVuZGVkKTtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvLyBUT0RPOiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0M0JcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDNFXHUwNDQyIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzRFx1MDQ0RiBcdTA0MzRcdTA0M0UgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIGBjaGF0SGlzdG9yeWAgXHUwNDM4IFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzIgYGNoYXRQYW5lbGAuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCAtIElEIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzguXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgZmV0Y2hNZXNzYWdlc0Zyb21Sb290VG9Ob2RlKG5vZGVJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Ly8gXHUwNDIzXHUwNDMxXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNDXHUwNDQxXHUwNDRGLCBcdTA0NDdcdTA0NDJcdTA0M0Ugc2VsZWN0ZWRHcmFwaElkIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFxyXG5cdFx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdzZWxlY3RlZEdyYXBoSWQgXHUwNDNEXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRC4gXHUwNDFEXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM3XHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuJyk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCB1cmwgPSBub2RlSWRcclxuXHRcdFx0XHQ/IGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L21lc3NhZ2VzLyR7dGhpcy5zZWxlY3RlZEdyYXBoSWR9LyR7bm9kZUlkfWBcclxuXHRcdFx0XHQ6IGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L21lc3NhZ2VzLyR7dGhpcy5zZWxlY3RlZEdyYXBoSWR9L2xhc3RgO1xyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0Mzk6ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7ZXJyb3JUZXh0fWApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblxyXG5cdFx0XHR0aGlzLmNoYXRIaXN0b3J5ID1cclxuXHRcdFx0XHRkYXRhLm1hcCgobXNnOiBhbnkpID0+ICh7XHJcblx0XHRcdFx0XHQuLi5tc2csXHJcblx0XHRcdFx0XHR0eXBlOiBtc2cudHlwZSB8fCBtc2cucm9sZSAvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgdHlwZSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QywgXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1IHJvbGUgXHUwNDNBXHUwNDMwXHUwNDNBIGZhbGxiYWNrXHJcblx0XHRcdFx0fSkpIHx8IFtdO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIzXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1LCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNDXHUwNDRCIFx1MDQ0MVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzMlx1MDQzMFx1MDQzQlx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDQxIFx1MDQzRFx1MDQzNS1cdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NEJcdTA0M0MgXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNDXHJcblx0XHRcdGlmICh0aGlzLmNoYXRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHQvLyBcdTA0MjNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgY3VycmVudE5vZGUgXHUwNDNEXHUwNDMwIElEIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNFx1MDQzRFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzhcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jaGF0SGlzdG9yeVt0aGlzLmNoYXRIaXN0b3J5Lmxlbmd0aCAtIDFdLm5vZGVfaWQ7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7IC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwLCBjdXJyZW50X25vZGVfaWQgXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1IG51bGxcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5jaGF0UGFuZWwudXBkYXRlSGlzdG9yeSh0aGlzLmNoYXRIaXN0b3J5KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0Mzk6JywgZXJyb3IpO1xyXG5cdFx0XHQvLyBPcHRpb25hbGx5OiBzaG93IGEgbm90aWNlIHRvIHRoZSB1c2VyXHJcblx0XHRcdC8vIG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5OiAke2Vycm9yLm1lc3NhZ2V9YCk7XHJcblxyXG5cdFx0XHQvKiBcdTA0MjFcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0M0RcdTA0M0UsIFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzhcdTA0M0I6IHRoaXMuY2hhdEhpc3RvcnkgPSBbXTsgLy8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDM1XHJcblx0XHRcdHRoaXMuY3VycmVudE5vZGUgPSBudWxsOyAvLyBcdTA0MjFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgY3VycmVudE5vZGUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzNVxyXG5cdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0XHR9Ki9cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzOSBcdTA0NDEgXHUwNDMxXHUwNDREXHUwNDNBXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDMwLlxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxyXG5cdCAqL1xyXG5cdGFzeW5jIGZldGNoQXZhaWxhYmxlTW9kZWxzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9tb2RlbHNgKTtcclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0Mzk6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuYXZhaWxhYmxlTW9kZWxzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNDXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDM5OicsIGVycm9yKTtcclxuXHRcdFx0Ly8gRmFsbGJhY2sgXHUwNDNBIFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzQyBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0M0NcclxuXHRcdFx0dGhpcy5hdmFpbGFibGVNb2RlbHMgPSBbJ2dlbWluaS0yLjUtZmxhc2gnLCAnZ3B0LTRvLW1pbmknLCAnY2xhdWRlLTMtNS1zb25uZXQtMjAyNDEwMjInXTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2ZW50IEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRhc3luYyBoYW5kbGVTZW5kTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHNlbGVjdGVkTW9kZWw/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudFtdKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdFx0bmV3IE5vdGljZSgnXHUwNDEzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzRFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0QgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRFx1MDQzNSBcdTA0MzhcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0QuIFx1MDQxRlx1MDQzRVx1MDQzNlx1MDQzMFx1MDQzQlx1MDQ0M1x1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMCwgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDNEXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDdcdTA0MzBcdTA0NDIgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkuJywgMzAwMCk7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdzZWxlY3RlZEdyYXBoSWQgaXMgbnVsbCBpbiBoYW5kbGVTZW5kTWVzc2FnZS4gQ3VycmVudCBzdGF0ZTonLCB7XHJcblx0XHRcdFx0XHRzZWxlY3RlZEdyYXBoSWQ6IHRoaXMuc2VsZWN0ZWRHcmFwaElkLFxyXG5cdFx0XHRcdFx0Y3VycmVudE5vZGU6IHRoaXMuY3VycmVudE5vZGVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlRm9sZGVyID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuXHJcblx0XHRcdC8vIFx1MDQyOFx1MDQzMFx1MDQzMyAxOiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NTFcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0RiBcdTA0NDEgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHUwNDNDXHUwNDM4XHJcblx0XHRcdGNvbnN0IHNlbmRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L2NoYXQvc2VuZGAsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcclxuXHRcdFx0XHRoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxyXG5cdFx0XHRcdFx0Z3JhcGhfaWQ6IHRoaXMuc2VsZWN0ZWRHcmFwaElkLFxyXG5cdFx0XHRcdFx0cGFyZW50X25vZGVfaWQ6IHRoaXMuY3VycmVudE5vZGUsXHJcblx0XHRcdFx0XHRhdHRhY2htZW50czogYXR0YWNobWVudHMgfHwgW10sXHJcblx0XHRcdFx0XHRjYWNoZV9mb2xkZXI6IGNhY2hlRm9sZGVyXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXNlbmRSZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGOiAke3NlbmRSZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHNlbmRSZXN1bHQgPSBhd2FpdCBzZW5kUmVzcG9uc2UuanNvbigpO1xyXG5cdFx0XHRjb25zdCB1c2VyTm9kZUlkID0gc2VuZFJlc3VsdC5ub2RlX2lkO1xyXG5cclxuXHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnZ3JhcGgtc2VsZWN0ZWQnLCB7XHJcblx0XHRcdFx0Z3JhcGhJZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsXHJcblx0XHRcdFx0Y3VycmVudE5vZGU6IHVzZXJOb2RlSWRcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MjhcdTA0MzBcdTA0MzMgMjogXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzOFx1MDQzRFx1MDQzMyBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzBcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdFx0Y29uc3Qgc3lzdGVtUHJvbXB0VG9Vc2UgPVxyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgIT09IG51bGwgPyB0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA6IHRoaXMucGx1Z2luLnNldHRpbmdzLnN5c3RlbVByb21wdDtcclxuXHJcblx0XHRcdFx0YXdhaXQgdGhpcy5zdHJlYW1MTE1SZXNwb25zZSh0aGlzLnNlbGVjdGVkR3JhcGhJZCwgdXNlck5vZGVJZCwgc2VsZWN0ZWRNb2RlbCwgbnVsbCwgc3lzdGVtUHJvbXB0VG9Vc2UsIGNhY2hlRm9sZGVyKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0dyYXBoIElEIFx1MDQzRFx1MDQzNSBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NTFcdTA0M0QgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RjonLCBlcnJvcik7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMDogJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gLCA1MDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDAgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzUuIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQzRSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwXHJcblx0ICogXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0NEMgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7eyBub2RlSWQ6IHN0cmluZyB9fSBkYXRhIC0gXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyLCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzBcdTA0NDlcdTA0MzhcdTA0MzkgSUQgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMC5cclxuXHQgKi9cclxuXHRoYW5kbGVOb2RlU2VsZWN0ZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gZGF0YS5ub2RlSWQ7XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQpIHtcclxuXHRcdFx0dGhpcy5mZXRjaE1lc3NhZ2VzRnJvbVJvb3RUb05vZGUoZGF0YS5ub2RlSWQpLnRoZW4oKCkgPT4ge1xyXG5cdFx0XHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0M0JcdTA0MzggXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM4XHUwNDNEXHUwNDMzIFx1MDQzMiBcdTA0M0RcdTA0MzVcdTA0MzlcclxuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkKSB7XHJcblx0XHRcdFx0XHRjb25zdCBpc0luTmV3QnJhbmNoID0gdGhpcy5jaGF0SGlzdG9yeS5zb21lKChtc2cpID0+IG1zZy5ub2RlX2lkID09PSB0aGlzLmN1cnJlbnRTdHJlYW1pbmdOb2RlSWQpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZVN0b3BCdXR0b25WaXNpYmlsaXR5KGlzSW5OZXdCcmFuY2gsIGlzSW5OZXdCcmFuY2ggPyB0aGlzLmN1cnJlbnRTdHJlYW1pbmdOb2RlSWQgOiBudWxsKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzAgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC4gXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwXHJcblx0ICogXHUwNDM4IFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4LlxyXG5cdCAqL1xyXG5cdGFzeW5jIGhhbmRsZU5ld0NoYXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLmNoYXRIaXN0b3J5ID0gW107XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcclxuXHRcdC8vdGhpcy5zZWxlY3RlZEdyYXBoSWQgPSBudWxsO1xyXG5cdFx0Ly90aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0YXdhaXQgdGhpcy5jaGF0UGFuZWwudXBkYXRlSGlzdG9yeSh0aGlzLmNoYXRIaXN0b3J5KTtcclxuXHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlQ3VzdG9tU3lzdGVtUHJvbXB0U3RhdHVzKG51bGwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM4XHUwNDM3IGBHcmFwaFZpZXdgLiBcdTA0MjNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlR3JhcGhTZWxlY3RlZChkYXRhOiB7IGdyYXBoSWQ6IHN0cmluZzsgY3VycmVudE5vZGU6IHN0cmluZyB8IG51bGwgfSk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEdyYXBoSWQgPSBkYXRhLmdyYXBoSWQ7XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gZGF0YS5jdXJyZW50Tm9kZTtcclxuXHRcdC8vIFx1MDQxMlx1MDQzMFx1MDQzNlx1MDQzRFx1MDQzRTogY3VzdG9tX3N5c3RlbV9wcm9tcHQgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRCBcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzcgJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1LFxyXG5cdFx0Ly8gXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDM1IFx1MDQzM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzIgR3JhcGhWaWV3IFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBmZXRjaEdyYXBoRGF0YS5cclxuXHRcdC8vIFx1MDQxN1x1MDQzNFx1MDQzNVx1MDQ0MVx1MDQ0QyBcdTA0M0NcdTA0NEIgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0MzBcdTA0MzVcdTA0M0MgdGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDRGXHUwNDNDXHUwNDQzXHUwNDRFLFxyXG5cdFx0Ly8gXHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzNlx1MDQzOFx1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQywgXHUwNDQ3XHUwNDQyXHUwNDNFIEdyYXBoVmlldyBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyLlxyXG5cdFx0YXdhaXQgdGhpcy5mZXRjaE1lc3NhZ2VzRnJvbVJvb3RUb05vZGUoZGF0YS5jdXJyZW50Tm9kZSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzhcdTA0NDIgXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyIExMTS5cclxuXHQgKi9cclxuXHRhc3luYyBzdHJlYW1MTE1SZXNwb25zZShcclxuXHRcdGdyYXBoSWQ6IHN0cmluZyxcclxuXHRcdHVzZXJOb2RlSWQ6IHN0cmluZyxcclxuXHRcdHNlbGVjdGVkTW9kZWw/OiBzdHJpbmcsXHJcblx0XHRleGlzdGluZ0Fzc2lzdGFudE5vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGwsXHJcblx0XHRzeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGwgPSBudWxsLFxyXG5cdFx0Y2FjaGVGb2xkZXI/OiBzdHJpbmdcclxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnN0IGJvZHkgPSB7XHJcblx0XHRcdGdyYXBoX2lkOiBncmFwaElkLFxyXG5cdFx0XHR1c2VyX25vZGVfaWQ6IHVzZXJOb2RlSWQsXHJcblx0XHRcdHN5c3RlbV9wcm9tcHQ6IHN5c3RlbVByb21wdCxcclxuXHRcdFx0bW9kZWw6IHNlbGVjdGVkTW9kZWwgfHwgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdE1vZGVsLFxyXG5cdFx0XHRjYWNoZV9mb2xkZXI6IGNhY2hlRm9sZGVyXHJcblx0XHR9O1xyXG5cclxuXHRcdGlmIChleGlzdGluZ0Fzc2lzdGFudE5vZGVJZCkge1xyXG5cdFx0XHRPYmplY3QuYXNzaWduKGJvZHksIHsgZXhpc3RpbmdfYXNzaXN0YW50X25vZGVfaWQ6IGV4aXN0aW5nQXNzaXN0YW50Tm9kZUlkIH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuXHRcdGxldCBhc3Npc3RhbnROb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlcjxVaW50OEFycmF5PiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vY2hhdC9zdHJlYW1gLCB7XHJcblx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXHJcblx0XHRcdFx0aGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXHJcblx0XHRcdFx0c2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzOFx1MDQzRFx1MDQzM1x1MDQzMDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICghcmVzcG9uc2UuYm9keSkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgYm9keSBpcyBudWxsJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcclxuXHJcblx0XHRcdGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcclxuXHRcdFx0bGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnO1xyXG5cclxuXHRcdFx0d2hpbGUgKHRydWUpIHtcclxuXHRcdFx0XHRpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcblx0XHRcdFx0aWYgKGRvbmUpIGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjb25zdCBjaHVuayA9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcclxuXHRcdFx0XHRjb25zdCBsaW5lcyA9IGNodW5rLnNwbGl0KCdcXG4nKTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XHJcblx0XHRcdFx0XHRpZiAobGluZS5zdGFydHNXaXRoKCdkYXRhOiAnKSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsaW5lLnNsaWNlKDYpKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChkYXRhLnR5cGUgPT09ICdub2RlX2NyZWF0ZWQnKSB7XHJcblx0XHRcdFx0XHRcdFx0YXNzaXN0YW50Tm9kZUlkID0gZGF0YS5ub2RlX2lkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdHJlYW0tc3RhcnRlZCcsIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5vZGVJZDogYXNzaXN0YW50Tm9kZUlkLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udHJvbGxlcjogYWJvcnRDb250cm9sbGVyXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLnJldXNlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jbGVhclN0cmVhbWluZ01lc3NhZ2UoYXNzaXN0YW50Tm9kZUlkKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnZ3JhcGgtc2VsZWN0ZWQnLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRncmFwaElkOiBncmFwaElkLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudE5vZGU6IGFzc2lzdGFudE5vZGVJZFxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ2NodW5rJyAmJiBhc3Npc3RhbnROb2RlSWQpIHtcclxuXHRcdFx0XHRcdFx0XHRhY2N1bXVsYXRlZENvbnRlbnQgKz0gZGF0YS5jb250ZW50O1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMudXBkYXRlU3RyZWFtaW5nTWVzc2FnZShhc3Npc3RhbnROb2RlSWQsIGFjY3VtdWxhdGVkQ29udGVudCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnZXJyb3InKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwOicsIGRhdGEuZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChhc3Npc3RhbnROb2RlSWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMubWFya05vZGVBc0Vycm9yKGFzc2lzdGFudE5vZGVJZCwgZGF0YS5lcnJvcik7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1zZWxlY3RlZCcsIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Z3JhcGhJZDogZ3JhcGhJZCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudE5vZGU6IGFzc2lzdGFudE5vZGVJZFxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnc3RyZWFtLWVuZGVkJywgeyBub2RlSWQ6IGFzc2lzdGFudE5vZGVJZCB9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnZG9uZScpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmN1cnJlbnROb2RlID0gYXNzaXN0YW50Tm9kZUlkO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLXNlbGVjdGVkJywge1xyXG5cdFx0XHRcdFx0XHRcdFx0Z3JhcGhJZDogZ3JhcGhJZCxcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnROb2RlOiBhc3Npc3RhbnROb2RlSWRcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGFzc2lzdGFudE5vZGVJZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnc3RyZWFtLWVuZGVkJywgeyBub2RlSWQ6IGFzc2lzdGFudE5vZGVJZCB9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuXHRcdFx0aWYgKGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdcdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M0MgXHUwNDMxXHUwNDRCXHUwNDNCIFx1MDQzRVx1MDQ0Mlx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0MnKTtcclxuXHRcdFx0XHRpZiAoYXNzaXN0YW50Tm9kZUlkKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdHJlYW0tZW5kZWQnLCB7IG5vZGVJZDogYXNzaXN0YW50Tm9kZUlkIH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aHJvdyBlcnJvcjsgLy8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzNSBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzhcclxuXHRcdFx0fVxyXG5cdFx0fSBmaW5hbGx5IHtcclxuXHRcdFx0cmVhZGVyPy5yZWxlYXNlTG9jaygpO1xyXG5cdFx0XHRpZiAoYXNzaXN0YW50Tm9kZUlkKSB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnc3RyZWFtLWVuZGVkJywgeyBub2RlSWQ6IGFzc2lzdGFudE5vZGVJZCB9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOCBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAsIFx1MDQzRlx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQ0N1x1MDQzMFx1MDQ0RiBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzQVx1MDQ0My5cclxuXHQgKiBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzM1x1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzOCBcdTA0M0EgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBub2RlSWQgLSBJRCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAsIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQ0Qy5cclxuXHQgKi9cclxuXHRjbGVhclN0cmVhbWluZ01lc3NhZ2Uobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGNvbnN0IG1lc3NhZ2VJbmRleCA9IHRoaXMuY2hhdEhpc3RvcnkuZmluZEluZGV4KChtc2cpID0+IG1zZy5ub2RlX2lkID09PSBub2RlSWQpO1xyXG5cdFx0aWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0dGhpcy5jaGF0SGlzdG9yeVttZXNzYWdlSW5kZXhdLmNvbnRlbnQgPSAnXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQzMC4uLic7XHJcblx0XHRcdHRoaXMuY2hhdEhpc3RvcnlbbWVzc2FnZUluZGV4XS50eXBlID0gJ2xsbSc7IC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQ0Mlx1MDQzOFx1MDQzRiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgTExNXHJcblx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UsIFx1MDQ0MVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Q1x1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDNCXHUwNDMwXHUwNDMzXHUwNDM4XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUhpc3RvcnkodGhpcy5jaGF0SGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR1cGRhdGVTdHJlYW1pbmdNZXNzYWdlKG5vZGVJZDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGxhc3RNZXNzYWdlID0gdGhpcy5jaGF0SGlzdG9yeVt0aGlzLmNoYXRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xyXG5cdFx0aWYgKGxhc3RNZXNzYWdlICYmIGxhc3RNZXNzYWdlLm5vZGVfaWQgPT09IG5vZGVJZCkge1xyXG5cdFx0XHRsYXN0TWVzc2FnZS5jb250ZW50ID0gY29udGVudDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuY2hhdEhpc3RvcnkucHVzaCh7XHJcblx0XHRcdFx0cm9sZTogJ2Fzc2lzdGFudCcsXHJcblx0XHRcdFx0Y29udGVudDogY29udGVudCxcclxuXHRcdFx0XHRub2RlX2lkOiBub2RlSWQsXHJcblx0XHRcdFx0Z3JhcGhfaWQ6IHRoaXMuc2VsZWN0ZWRHcmFwaElkIHx8ICcnXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bWFya05vZGVBc0Vycm9yKG5vZGVJZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV07XHJcblx0XHRpZiAobGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2Uubm9kZV9pZCA9PT0gbm9kZUlkKSB7XHJcblx0XHRcdGxhc3RNZXNzYWdlLnR5cGUgPSAnZXJyb3InO1xyXG5cdFx0XHRsYXN0TWVzc2FnZS5jb250ZW50ID0gZXJyb3JNZXNzYWdlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0M0RcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNEXHUwNDM4XHUwNDM5LCBcdTA0M0ZcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4IFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDXHJcblx0XHRcdGNvbnN0IG1lc3NhZ2VJbmRleCA9IHRoaXMuY2hhdEhpc3RvcnkuZmluZEluZGV4KChtc2cpID0+IG1zZy5ub2RlX2lkID09PSBub2RlSWQpO1xyXG5cdFx0XHRpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHRcdHRoaXMuY2hhdEhpc3RvcnlbbWVzc2FnZUluZGV4XS50eXBlID0gJ2Vycm9yJztcclxuXHRcdFx0XHR0aGlzLmNoYXRIaXN0b3J5W21lc3NhZ2VJbmRleF0uY29udGVudCA9IGVycm9yTWVzc2FnZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QsIFx1MDQzNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQ0Q1x1MDQ0Mlx1MDQzNSBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRVx1MDQzMSBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzVcclxuXHRcdFx0XHR0aGlzLmNoYXRIaXN0b3J5LnB1c2goe1xyXG5cdFx0XHRcdFx0cm9sZTogJ2Fzc2lzdGFudCcsXHJcblx0XHRcdFx0XHRjb250ZW50OiBlcnJvck1lc3NhZ2UsXHJcblx0XHRcdFx0XHRub2RlX2lkOiBub2RlSWQsXHJcblx0XHRcdFx0XHRncmFwaF9pZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQgfHwgJycsXHJcblx0XHRcdFx0XHR0eXBlOiAnZXJyb3InXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlSGlzdG9yeSh0aGlzLmNoYXRIaXN0b3J5KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGhhbmRsZVJlZ2VuZXJhdGVNZXNzYWdlKGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBub2RlSWQ6IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4OiBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QywgXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1IFx1MDQzM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOVxyXG5cdFx0XHRjb25zdCBzeXN0ZW1Qcm9tcHRUb1VzZSA9XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgIT09IG51bGwgPyB0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA6IHRoaXMucGx1Z2luLnNldHRpbmdzLnN5c3RlbVByb21wdDtcclxuXHJcblx0XHRcdGNvbnN0IGNhY2hlRm9sZGVyID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuXHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vY2hhdC9yZWdlbmVyYXRlYCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxyXG5cdFx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRcdGdyYXBoX2lkOiBkYXRhLmdyYXBoSWQsXHJcblx0XHRcdFx0XHRub2RlX2lkOiBkYXRhLm5vZGVJZCxcclxuXHRcdFx0XHRcdG1vZGVsOiBkYXRhLm1vZGVsLFxyXG5cdFx0XHRcdFx0c3lzdGVtX3Byb21wdDogc3lzdGVtUHJvbXB0VG9Vc2UsXHJcblx0XHRcdFx0XHRjYWNoZV9mb2xkZXI6IGNhY2hlRm9sZGVyXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4OiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cdFx0XHRjb25zdCBleGlzdGluZ0Fzc2lzdGFudE5vZGVJZCA9IHJlc3VsdC5leGlzdGluZ19hc3Npc3RhbnRfbm9kZV9pZDtcclxuXHRcdFx0Y29uc3QgdXNlck5vZGVJZCA9IHJlc3VsdC51c2VyX25vZGVfaWQ7XHJcblx0XHRcdGNvbnN0IG1vZGVsVG9Vc2UgPSByZXN1bHQubW9kZWw7XHJcblx0XHRcdGNvbnN0IHN5c3RlbVByb21wdEZyb21CYWNrZW5kID0gcmVzdWx0LnN5c3RlbV9wcm9tcHQ7XHJcblxyXG5cdFx0XHRpZiAoZGF0YS5ncmFwaElkKSB7XHJcblx0XHRcdFx0YXdhaXQgdGhpcy5zdHJlYW1MTE1SZXNwb25zZShkYXRhLmdyYXBoSWQsIHVzZXJOb2RlSWQsIG1vZGVsVG9Vc2UsIGV4aXN0aW5nQXNzaXN0YW50Tm9kZUlkLCBzeXN0ZW1Qcm9tcHRGcm9tQmFja2VuZCk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODonLCBlcnJvcik7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6ICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3J9YCwgNTAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzMCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNEXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBcdTA0MjFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBDaGF0VmlldywgXHUwNDNEXHUwNDNFIFx1MDQzRFx1MDQzNSBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDMwIEdyYXBoVmlldy5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVTdGFydE5ld0luZGVwZW5kZW50Q2hhdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRoaXMuY2hhdEhpc3RvcnkgPSBbXTtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xyXG5cdFx0Ly8gXHUwNDFFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIHRoaXMuc2VsZWN0ZWRHcmFwaElkIFx1MDQzMVx1MDQzNVx1MDQzNyBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzlcclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVDdXN0b21TeXN0ZW1Qcm9tcHRTdGF0dXMobnVsbCk7XHJcblx0XHR9XHJcblx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0U6IFx1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzRFx1MDQzRSBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0MzRcdTA0M0VcdTA0M0NcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRGIFx1MDQzRSBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzUgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMFxyXG5cdFx0bmV3IE5vdGljZSgnXHUwNDFEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDQyIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDdcdTA0MzBcdTA0NDIuIFx1MDQyMlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRC4nLCAyMDAwKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0b3BTdHJlYW1SZXF1ZXN0KGRhdGE6IHsgbm9kZUlkOiBzdHJpbmcgfSk6IHZvaWQge1xyXG5cdFx0Y29uc3QgY29udHJvbGxlciA9ICh0aGlzLnBsdWdpbiBhcyBhbnkpLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzPy5nZXQoZGF0YS5ub2RlSWQpO1xyXG5cdFx0aWYgKGNvbnRyb2xsZXIpIHtcclxuXHRcdFx0Y29udHJvbGxlci5hYm9ydCgpO1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MTNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzQy4nLCAyMDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0cmVhbVN0YXJ0ZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZzsgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCA9IGRhdGEubm9kZUlkO1xyXG5cdFx0Ly8gVE9ETzogXHUwNDEyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFIFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0QgXHUwNDMyIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQzOCxcclxuXHRcdC8vIFx1MDQ0Mi5cdTA0M0EuIFx1MDQ0MyBcdTA0M0RcdTA0MzBcdTA0NDEgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzQSBcdTA0M0NcdTA0M0VcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0NDMgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwICdzdHJlYW0tc3RhcnRlZCcgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzNVx1MDQ0OVx1MDQ1MSBcdTA0M0RcdTA0MzUgXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNFXHJcblx0XHQvLyBjb25zdCBpc0luQ3VycmVudEJyYW5jaCA9IHRoaXMuY2hhdEhpc3Rvcnkuc29tZSgobXNnKSA9PiBtc2cubm9kZV9pZCA9PT0gZGF0YS5ub2RlSWQpO1xyXG5cdFx0Ly8gaWYgKHRoaXMuY2hhdFBhbmVsICYmIGlzSW5DdXJyZW50QnJhbmNoKSB7XHJcblx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlU3RvcEJ1dHRvblZpc2liaWxpdHkodHJ1ZSwgZGF0YS5ub2RlSWQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aGFuZGxlU3RyZWFtRW5kZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkID09PSBkYXRhLm5vZGVJZCkge1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRTdHJlYW1pbmdOb2RlSWQgPSBudWxsO1xyXG5cdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVTdG9wQnV0dG9uVmlzaWJpbGl0eShmYWxzZSwgbnVsbCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdlYlNvY2tldCBFdmVudCBIYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0aGFuZGxlTm9kZVR5cGVDaGFuZ2VkKGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBub2RlSWQ6IHN0cmluZzsgbm9kZVR5cGU6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMFxyXG5cdFx0Y29uc3QgbWVzc2FnZUluZGV4ID0gdGhpcy5jaGF0SGlzdG9yeS5maW5kSW5kZXgoKG1zZykgPT4gbXNnLm5vZGVfaWQgPT09IGRhdGEubm9kZUlkKTtcclxuXHRcdGlmIChtZXNzYWdlSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdHRoaXMuY2hhdEhpc3RvcnlbbWVzc2FnZUluZGV4XS50eXBlID0gZGF0YS5ub2RlVHlwZTtcclxuXHRcdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlSGlzdG9yeSh0aGlzLmNoYXRIaXN0b3J5KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aGFuZGxlR3JhcGhDdXN0b21Qcm9tcHRVcGRhdGVkKGRhdGE6IHsgZ3JhcGhfaWQ6IHN0cmluZzsgY3VzdG9tX3N5c3RlbV9wcm9tcHQ6IHN0cmluZyB8IG51bGwgfSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRHcmFwaElkID09PSBkYXRhLmdyYXBoX2lkKSB7XHJcblx0XHRcdHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gZGF0YS5jdXN0b21fc3lzdGVtX3Byb21wdDtcclxuXHRcdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlQ3VzdG9tU3lzdGVtUHJvbXB0U3RhdHVzKHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkR3JhcGhJZCA9PT0gbnVsbCAmJiBkYXRhLmdyYXBoX2lkID09PSBudWxsKSB7XHJcblx0XHRcdC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFxyXG5cdFx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblx0XHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUN1c3RvbVN5c3RlbVByb21wdFN0YXR1cyhudWxsKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDEyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzBcclxuXHQgKi9cclxuXHRwcml2YXRlIGdldENhY2hlRm9sZGVyUGF0aCgpOiBzdHJpbmcge1xyXG5cdFx0Ly8gVE9ETzogXHUwNDFEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzksIFx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMCBjYWNoZUZvbGRlciBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzlcclxuXHRcdHJldHVybiB0aGlzLmNoYXRQYW5lbD8uY2FjaGVNYW5hZ2VyPy5nZXRDYWNoZUZvbGRlclBhdGgoKSA/PyAnJztcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MjNcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNEXHUwNDMwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDRCLlxyXG4gKiBcdTA0MUVcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDM4XHUwNDQxXHUwNDNBIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzIgXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDNCXHUwNDM4XHUwNDQ5XHUwNDM1IFx1MDQzOCBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDQzXHUwNDNCXHUwNDRDXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDNFXHUwNDMyLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IE5vdGljZSwgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBMTE1BZ2VudFBsdWdpbiBmcm9tICdtYWluJztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9jb21wbGV0ZUl0ZW0ge1xyXG5cdG5hbWU6IHN0cmluZztcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0dHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCc7XHJcblx0aWNvbjogc3RyaW5nOyAvLyBPYnNpZGlhbiBpY29uIG5hbWVcclxuXHRmaWxlPzogVEZpbGU7IC8vIFx1MDQyMVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIE9ic2lkaWFuXHJcbn1cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF1dG9jb21wbGV0ZSBNYW5hZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1dG9jb21wbGV0ZU1hbmFnZXIge1xyXG5cdHByaXZhdGUgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHRwcml2YXRlIGZpbGVDYWNoZTogTWFwPHN0cmluZywgQXV0b2NvbXBsZXRlSXRlbVtdPiA9IG5ldyBNYXAoKTtcclxuXHRwcml2YXRlIHByb21wdENhY2hlOiBNYXA8c3RyaW5nLCBBdXRvY29tcGxldGVJdGVtW10+ID0gbmV3IE1hcCgpO1xyXG5cdHByaXZhdGUgbGFzdENhY2hlVXBkYXRlID0gMDtcclxuXHRwcml2YXRlIHJlYWRvbmx5IENBQ0hFX1RUTCA9IDMwMDAwOyAvLyAzMCBcdTA0NDFcdTA0MzVcdTA0M0FcdTA0NDNcdTA0M0RcdTA0MzRcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5IHtudW1iZXJ9IE1BWF9UT1RBTF9JVEVNUyBcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwIFx1MDQzOCBcdTA0M0FcdTA0NERcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0c3RhdGljIE1BWF9UT1RBTF9JVEVNUyA9IDIwO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihwbHVnaW46IExMTUFnZW50UGx1Z2luKSB7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHRcdHRoaXMuc2V0dXBGaWxlV2F0Y2hlcigpO1xyXG5cdFx0Ly8gXHUwNDIxXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0EgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzBcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzZXR0aW5ncy1jaGFuZ2VkJywgdGhpcy5jbGVhckNhY2hlLmJpbmQodGhpcykpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzBcclxuXHQgKiBAcGFyYW0gcXVlcnkgLSBcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQxXHJcblx0ICogQHJldHVybnMgXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDMwXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0RmlsZU9wdGlvbnMocXVlcnk6IHN0cmluZyk6IFByb21pc2U8QXV0b2NvbXBsZXRlSXRlbVtdPiB7XHJcblx0XHRpZiAoIXRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZUZpbGVSZWZlcmVuY2VzKSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHJcblx0XHRhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlSWZOZWVkZWQoKTtcclxuXHJcblx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMuZmlsZUNhY2hlLmdldCgnYWxsJykgfHwgW107XHJcblxyXG5cdFx0aWYgKCFxdWVyeS50cmltKCkpIHtcclxuXHRcdFx0cmV0dXJuIGFsbEZpbGVzLnNsaWNlKDAsIEF1dG9jb21wbGV0ZU1hbmFnZXIuTUFYX1RPVEFMX0lURU1TKTsgLy8gXHUwNDFGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQ0Qlx1MDQzNSAxMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb3dlcmNhc2VRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRyZXR1cm4gYWxsRmlsZXNcclxuXHRcdFx0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJjYXNlUXVlcnkpIHx8IGl0ZW0ucGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyY2FzZVF1ZXJ5KSlcclxuXHRcdFx0LnNsaWNlKDAsIEF1dG9jb21wbGV0ZU1hbmFnZXIuTUFYX1RPVEFMX0lURU1TKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzBcclxuXHQgKiBAcGFyYW0gcXVlcnkgLSBcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDM3XHUwNDMwXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQxXHJcblx0ICogQHJldHVybnMgXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDMwXHJcblx0ICovXHJcblx0YXN5bmMgZ2V0UHJvbXB0T3B0aW9ucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxBdXRvY29tcGxldGVJdGVtW10+IHtcclxuXHRcdGlmICghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUHJvbXB0UmVmZXJlbmNlcykge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblxyXG5cdFx0YXdhaXQgdGhpcy51cGRhdGVDYWNoZUlmTmVlZGVkKCk7XHJcblxyXG5cdFx0Y29uc3QgYWxsUHJvbXB0cyA9IHRoaXMucHJvbXB0Q2FjaGUuZ2V0KCdhbGwnKSB8fCBbXTtcclxuXHJcblx0XHRpZiAoIXF1ZXJ5LnRyaW0oKSkge1xyXG5cdFx0XHRyZXR1cm4gYWxsUHJvbXB0cy5zbGljZSgwLCBBdXRvY29tcGxldGVNYW5hZ2VyLk1BWF9UT1RBTF9JVEVNUyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG93ZXJjYXNlUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0cmV0dXJuIGFsbFByb21wdHNcclxuXHRcdFx0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJjYXNlUXVlcnkpIHx8IGl0ZW0ucGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyY2FzZVF1ZXJ5KSlcclxuXHRcdFx0LnNsaWNlKDAsIEF1dG9jb21wbGV0ZU1hbmFnZXIuTUFYX1RPVEFMX0lURU1TKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0MzVcdTA0NDggKFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzQSlcclxuXHQgKi9cclxuXHRjbGVhckNhY2hlKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWxlQ2FjaGUuY2xlYXIoKTtcclxuXHRcdHRoaXMucHJvbXB0Q2FjaGUuY2xlYXIoKTtcclxuXHRcdHRoaXMubGFzdENhY2hlVXBkYXRlID0gMDtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzNVx1MDQ0OCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRVx1MDQzRCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzVcdTA0M0JcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZUNhY2hlSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xyXG5cdFx0aWYgKG5vdyAtIHRoaXMubGFzdENhY2hlVXBkYXRlID4gdGhpcy5DQUNIRV9UVEwpIHtcclxuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVDYWNoZSgpO1xyXG5cdFx0XHR0aGlzLmxhc3RDYWNoZVVwZGF0ZSA9IG5vdztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0MzVcdTA0NDggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIHVwZGF0ZUNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgZmlsZXMgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cdFx0Y29uc3QgZmlsZUl0ZW1zOiBBdXRvY29tcGxldGVJdGVtW10gPSBbXTtcclxuXHRcdGNvbnN0IHByb21wdEl0ZW1zOiBBdXRvY29tcGxldGVJdGVtW10gPSBbXTtcclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0VcdTA0M0FcclxuXHRcdGNvbnN0IG5vcm1hbGl6ZWRFeGNsdWRlZEZvbGRlcnMgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5leGNsdWRlZEZvbGRlcnNcclxuXHRcdFx0LmZpbHRlcigoZm9sZGVyKSA9PiBmb2xkZXIudHJpbSgpICE9PSAnJylcclxuXHRcdFx0Lm1hcCgoZm9sZGVyKSA9PiAoZm9sZGVyLmVuZHNXaXRoKCcvJykgPyBmb2xkZXIgOiBmb2xkZXIgKyAnLycpKSAvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzdcdTA0MzBcdTA0M0FcdTA0MzBcdTA0M0RcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzQlx1MDQ0RFx1MDQ0OFxyXG5cdFx0XHQubWFwKChmb2xkZXIpID0+IChmb2xkZXIuc3RhcnRzV2l0aCgnLycpID8gZm9sZGVyLnN1YnN0cmluZygxKSA6IGZvbGRlcikpOyAvLyBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0MVx1MDQzQlx1MDQ0RFx1MDQ0OFxyXG5cclxuXHRcdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCIFx1MDQzOFx1MDQzNyBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBXHJcblx0XHRcdGlmICh0aGlzLmlzRmlsZUluRXhjbHVkZWRGb2xkZXIoZmlsZSwgbm9ybWFsaXplZEV4Y2x1ZGVkRm9sZGVycykpIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgaXRlbTogQXV0b2NvbXBsZXRlSXRlbSA9IHtcclxuXHRcdFx0XHRuYW1lOiBmaWxlLmJhc2VuYW1lLFxyXG5cdFx0XHRcdHBhdGg6IGZpbGUucGF0aCxcclxuXHRcdFx0XHR0eXBlOiB0aGlzLmlzUHJvbXB0RmlsZShmaWxlKSA/ICdwcm9tcHQnIDogJ2ZpbGUnLFxyXG5cdFx0XHRcdGljb246IHRoaXMuZ2V0RmlsZUljb24oZmlsZSksXHJcblx0XHRcdFx0ZmlsZTogZmlsZVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKGl0ZW0udHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0XHRwcm9tcHRJdGVtcy5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZpbGVJdGVtcy5wdXNoKGl0ZW0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzRSBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzhcclxuXHRcdGZpbGVJdGVtcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcclxuXHRcdHByb21wdEl0ZW1zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xyXG5cclxuXHRcdHRoaXMuZmlsZUNhY2hlLnNldCgnYWxsJywgZmlsZUl0ZW1zKTtcclxuXHRcdHRoaXMucHJvbXB0Q2FjaGUuc2V0KCdhbGwnLCBwcm9tcHRJdGVtcyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0NDIsIFx1MDQ0Rlx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0JcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzQ1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgaXNQcm9tcHRGaWxlKGZpbGU6IFRGaWxlKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuXHRcdGlmICghcHJvbXB0c0ZvbGRlcikgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHRcdGNvbnN0IG5vcm1hbGl6ZWRQcm9tcHRzUGF0aCA9IHByb21wdHNGb2xkZXIucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpO1xyXG5cclxuXHRcdHJldHVybiBmaWxlLnBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUHJvbXB0c1BhdGggKyAnLycpIHx8IGZpbGUucGF0aCA9PT0gbm9ybWFsaXplZFByb21wdHNQYXRoO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDEyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0NDFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzUgT2JzaWRpYW4gXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNFXHUwNDNBXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRGaWxlSWNvbihmaWxlOiBURmlsZSk6IHN0cmluZyB7XHJcblx0XHRpZiAodGhpcy5pc1Byb21wdEZpbGUoZmlsZSkpIHtcclxuXHRcdFx0cmV0dXJuICd6YXAnOyAvLyBcdTA0MThcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MyBcdTA0M0ZcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRFXHJcblx0XHRjb25zdCBleHRlbnNpb24gPSBmaWxlLmV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0c3dpdGNoIChleHRlbnNpb24pIHtcclxuXHRcdFx0Y2FzZSAnbWQnOlxyXG5cdFx0XHRcdHJldHVybiAnZmlsZS10ZXh0JztcclxuXHRcdFx0Y2FzZSAnanMnOlxyXG5cdFx0XHRjYXNlICd0cyc6XHJcblx0XHRcdFx0cmV0dXJuICdjb2RlJztcclxuXHRcdFx0Y2FzZSAnanNvbic6XHJcblx0XHRcdFx0cmV0dXJuICdicmFja2V0cyc7XHJcblx0XHRcdGNhc2UgJ2Nzcyc6XHJcblx0XHRcdFx0cmV0dXJuICdwYWxldHRlJztcclxuXHRcdFx0Y2FzZSAncG5nJzpcclxuXHRcdFx0Y2FzZSAnanBnJzpcclxuXHRcdFx0Y2FzZSAnanBlZyc6XHJcblx0XHRcdGNhc2UgJ2dpZic6XHJcblx0XHRcdFx0cmV0dXJuICdpbWFnZSc7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuICdmaWxlJztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0dXBGaWxlV2F0Y2hlcigpOiB2b2lkIHtcclxuXHRcdHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcblx0XHRcdHRoaXMucGx1Z2luLmFwcC52YXVsdC5vbignY3JlYXRlJywgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuY2xlYXJDYWNoZSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLnBsdWdpbi5hcHAudmF1bHQub24oJ2RlbGV0ZScsICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmNsZWFyQ2FjaGUoKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5wbHVnaW4uYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jbGVhckNhY2hlKCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyLCBcdTA0M0RcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0MzIgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQzNyBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBLlxyXG5cdCAqIEBwYXJhbSBmaWxlIC0gXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIE9ic2lkaWFuLlxyXG5cdCAqIEBwYXJhbSBleGNsdWRlZEZvbGRlcnMgLSBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDNEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQzNVx1MDQzOSBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBLlxyXG5cdCAqIEByZXR1cm5zIHRydWUsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzMiBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1LlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgaXNGaWxlSW5FeGNsdWRlZEZvbGRlcihmaWxlOiBURmlsZSwgZXhjbHVkZWRGb2xkZXJzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnBhdGgudG9Mb3dlckNhc2UoKTsgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHJcblx0XHRmb3IgKGNvbnN0IGZvbGRlciBvZiBleGNsdWRlZEZvbGRlcnMpIHtcclxuXHRcdFx0Y29uc3Qgbm9ybWFsaXplZEZvbGRlciA9IGZvbGRlci50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzOFx1MDQzRFx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCBcdTA0NDEgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzhcclxuXHRcdFx0Ly8gXHUwNDE4XHUwNDNCXHUwNDM4IFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQ0Rlx1MDQzQ1x1MDQzRSBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzggKFx1MDQzRC5cdTA0M0YuIFwiZm9sZGVyL2ZpbGUubWRcIilcclxuXHRcdFx0aWYgKGZpbGVQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZEZvbGRlcikpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgaGFuZGxlRXh0ZXJuYWxGaWxlU2VsZWN0aW9uKCk6IFByb21pc2U8QXV0b2NvbXBsZXRlSXRlbSB8IG51bGw+IHtcclxuXHRcdGlmICghd2luZG93LmVsZWN0cm9uKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MCBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzNVx1MDQzRCBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDMyIGRlc2t0b3AtXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4JywgMzAwMCk7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZGlhbG9nLnNob3dPcGVuRGlhbG9nKHtcclxuXHRcdFx0XHRwcm9wZXJ0aWVzOiBbJ29wZW5GaWxlJ10sXHJcblx0XHRcdFx0dGl0bGU6ICdcdTA0MTJcdTA0NEJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0FcdTA0NDBcdTA0MzVcdTA0M0ZcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYnXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKHJlc3VsdC5jYW5jZWxlZCB8fCAhcmVzdWx0LmZpbGVQYXRocyB8fCByZXN1bHQuZmlsZVBhdGhzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBmaWxlUGF0aCA9IHJlc3VsdC5maWxlUGF0aHNbMF07XHJcblx0XHRcdGNvbnN0IHBhdGggPSB3aW5kb3cucmVxdWlyZSgncGF0aCcpO1xyXG5cdFx0XHRjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRuYW1lOiBmaWxlTmFtZSxcclxuXHRcdFx0XHRwYXRoOiBmaWxlUGF0aCxcclxuXHRcdFx0XHR0eXBlOiAnZXh0ZXJuYWwnLFxyXG5cdFx0XHRcdGljb246ICdwYXBlcmNsaXAnXHJcblx0XHRcdH07XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzA6JywgZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MUFcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EuIFx1MDQxRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0NEJcdTA0M0ZcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyXHJcbiAqIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzRcdTA0MzUgQC9AQCBcdTA0MzggIy8jIyBcdTA0NDEgXHUwNDQzXHUwNDNDXHUwNDNEXHUwNDRCXHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNVx1MDQzQyBcdTA0M0VcdTA0NDJcdTA0M0RcdTA0M0VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEF1dG9jb21wbGV0ZUl0ZW0sIEF1dG9jb21wbGV0ZU1hbmFnZXIgfSBmcm9tICcuL0F1dG9jb21wbGV0ZU1hbmFnZXInO1xyXG5pbXBvcnQgeyBSZWZlcmVuY2VNYXRjaCB9IGZyb20gJy4vUmVmZXJlbmNlUGFyc2VyJztcclxuaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBBdXRvY29tcGxldGUgQ29tcG9uZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUF1dG9jb21wbGV0ZSB7XHJcblx0cHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgZHJvcGRvd246IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgaW5wdXRFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHRwcml2YXRlIGF1dG9jb21wbGV0ZU1hbmFnZXI6IEF1dG9jb21wbGV0ZU1hbmFnZXI7XHJcblx0cHJpdmF0ZSBjdXJyZW50UmVmZXJlbmNlOiBSZWZlcmVuY2VNYXRjaCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0cHJpdmF0ZSBjdXJyZW50T3B0aW9uczogQXV0b2NvbXBsZXRlSXRlbVtdID0gW107XHJcblx0cHJpdmF0ZSBvbkl0ZW1TZWxlY3RlZENhbGxiYWNrPzogKGl0ZW06IEF1dG9jb21wbGV0ZUl0ZW0sIG1hdGNoOiBSZWZlcmVuY2VNYXRjaCkgPT4gdm9pZDtcclxuXHRwcml2YXRlIG1vdXNlSXNPdmVyRHJvcGRvd24gPSBmYWxzZTsgLy8gXHUwNDI0XHUwNDNCXHUwNDMwXHUwNDMzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQ1x1MDQ0Qlx1MDQ0OFx1MDQzOFxyXG5cclxuXHRjb25zdHJ1Y3RvcihpbnB1dEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhdXRvY29tcGxldGVNYW5hZ2VyOiBBdXRvY29tcGxldGVNYW5hZ2VyKSB7XHJcblx0XHR0aGlzLmlucHV0RWxlbWVudCA9IGlucHV0RWxlbWVudDtcclxuXHRcdHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlciA9IGF1dG9jb21wbGV0ZU1hbmFnZXI7XHJcblx0XHR0aGlzLmNvbnRhaW5lciA9IHRoaXMuaW5wdXRFbGVtZW50LmNsb3Nlc3QoJy5jaGF0LWlucHV0LWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuXHRcdHRoaXMuY3JlYXRlRHJvcGRvd24oKTtcclxuXHRcdHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDIgXHUwNDQxIFx1MDQzRVx1MDQzRlx1MDQ0Nlx1MDQzOFx1MDQ0Rlx1MDQzQ1x1MDQzOC5cclxuXHQgKiBAcGFyYW0gcmVmZXJlbmNlIC0gXHUwNDNFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyIFJlZmVyZW5jZU1hdGNoLCBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzOSBcdTA0NDBcdTA0MzVcdTA0NDRcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NDEuXHJcblx0ICogQHBhcmFtIGN1cnNvclJlY3QgLSBET01SZWN0IFx1MDQzRVx1MDQzMVx1MDQ0QVx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzMCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAsIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDM4LlxyXG5cdCAqL1xyXG5cdGFzeW5jIHNob3dBdXRvY29tcGxldGUocmVmZXJlbmNlOiBSZWZlcmVuY2VNYXRjaCwgY3Vyc29yUmVjdDogRE9NUmVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dGhpcy5jdXJyZW50UmVmZXJlbmNlID0gcmVmZXJlbmNlO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyICgkLCAhJCkgXHUwNDQxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQzIFx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0JcdTA0M0VcdTA0MzNcclxuXHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ2V4dGVybmFsJykge1xyXG5cdFx0XHRjb25zdCBzZWxlY3RlZEZpbGUgPSBhd2FpdCB0aGlzLmF1dG9jb21wbGV0ZU1hbmFnZXIuaGFuZGxlRXh0ZXJuYWxGaWxlU2VsZWN0aW9uKCk7XHJcblx0XHRcdGlmIChzZWxlY3RlZEZpbGUgJiYgdGhpcy5vbkl0ZW1TZWxlY3RlZENhbGxiYWNrKSB7XHJcblx0XHRcdFx0dGhpcy5vbkl0ZW1TZWxlY3RlZENhbGxiYWNrKHNlbGVjdGVkRmlsZSwgcmVmZXJlbmNlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDRDXHUwNDQ4XHUwNDM1XHJcblx0XHRjb25zdCBvcHRpb25zID1cclxuXHRcdFx0cmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJ1xyXG5cdFx0XHRcdD8gYXdhaXQgdGhpcy5hdXRvY29tcGxldGVNYW5hZ2VyLmdldEZpbGVPcHRpb25zKHJlZmVyZW5jZS5uYW1lKVxyXG5cdFx0XHRcdDogYXdhaXQgdGhpcy5hdXRvY29tcGxldGVNYW5hZ2VyLmdldFByb21wdE9wdGlvbnMocmVmZXJlbmNlLm5hbWUpO1xyXG5cclxuXHRcdGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aGlzLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuY3VycmVudE9wdGlvbnMgPSBvcHRpb25zO1xyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+PSB0aGlzLmN1cnJlbnRPcHRpb25zLmxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5yZW5kZXJPcHRpb25zKCk7XHJcblx0XHR0aGlzLnBvc2l0aW9uRHJvcGRvd24oY3Vyc29yUmVjdCk7XHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0MlxyXG5cdCAqL1xyXG5cdGhpZGVBdXRvY29tcGxldGUoKTogdm9pZCB7XHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR0aGlzLmN1cnJlbnRSZWZlcmVuY2UgPSBudWxsO1xyXG5cdFx0dGhpcy5jdXJyZW50T3B0aW9ucyA9IFtdO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0RcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQ4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0MzhcdTA0MzNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHQgKiBAcGFyYW0gZXZlbnQgLSBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDRCXHJcblx0ICogQHJldHVybnMgdHJ1ZSBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzRSBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0MzBcdTA0M0RcdTA0M0VcclxuXHQgKi9cclxuXHRoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcblx0XHQvLyBcdTA0MUNcdTA0NEIgXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDM4XHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzOCBFbnRlciBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDFcdTA0NEMgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDIgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDM4XHUwNDNDXHJcblx0XHRpZiAoIXRoaXMuaXNWaXNpYmxlKCkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdGNhc2UgJ0Fycm93RG93bic6XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQyXHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQ0M1x1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDZcdTA0NEJcclxuXHRcdFx0XHR0aGlzLm1vdmVTZWxlY3Rpb24oMSk7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRjYXNlICdBcnJvd1VwJzpcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDJcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDNBXHUwNDQzIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0QlxyXG5cdFx0XHRcdHRoaXMubW92ZVNlbGVjdGlvbigtMSk7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRjYXNlICdFbnRlcic6XHJcblx0XHRcdGNhc2UgJ1RhYic6XHJcblx0XHRcdFx0Ly8gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDNDIFRhYiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdEN1cnJlbnRJdGVtKCk7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRjYXNlICdFc2NhcGUnOlxyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0dGhpcy5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0M0VcdTA0M0JcdTA0M0JcdTA0MzFcdTA0MzVcdTA0M0EgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzMCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcclxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgLSBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFxyXG5cdCAqL1xyXG5cdG9uSXRlbVNlbGVjdGVkKGNhbGxiYWNrOiAoaXRlbTogQXV0b2NvbXBsZXRlSXRlbSwgbWF0Y2g6IFJlZmVyZW5jZU1hdGNoKSA9PiB2b2lkKTogdm9pZCB7XHJcblx0XHR0aGlzLm9uSXRlbVNlbGVjdGVkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQ0MiwgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDM1XHUwNDNEIFx1MDQzQlx1MDQzOCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcclxuXHQgKiBAcmV0dXJucyB0cnVlIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzVcdTA0M0RcclxuXHQgKi9cclxuXHRpc1Zpc2libGUoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzMlx1MDQ0Qlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzBcclxuXHQgKi9cclxuXHRwcml2YXRlIGNyZWF0ZURyb3Bkb3duKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5kcm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5kcm9wZG93bi5jbGFzc05hbWUgPSAncmVmZXJlbmNlLWF1dG9jb21wbGV0ZSc7XHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIGRyb3Bkb3duIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M0RcdTA0MzVcdTA0NDBcclxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZHJvcGRvd24pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzlcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcblx0XHQvLyBcdTA0MTdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzNSBcdTA0MzJcdTA0M0RcdTA0MzUgZHJvcGRvd25cclxuXHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0aWYgKCF0aGlzLmRyb3Bkb3duLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpICYmICF0aGlzLmlucHV0RWxlbWVudC5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkge1xyXG5cdFx0XHRcdHRoaXMuaGlkZUF1dG9jb21wbGV0ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQ1x1MDQ0Qlx1MDQ0OFx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQyXHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0UgYmx1clxyXG5cdFx0dGhpcy5kcm9wZG93bi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLm1vdXNlSXNPdmVyRHJvcGRvd24gPSB0cnVlO1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMubW91c2VJc092ZXJEcm9wZG93biA9IGZhbHNlO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzUgXHUwNDQ0XHUwNDNFXHUwNDNBXHUwNDQzXHUwNDQxXHUwNDMwIGlucHV0IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzQywgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzQ1x1MDQ0Qlx1MDQ0OFx1MDQ0QyBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM0IFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRFx1MDQzRVx1MDQzQ1xyXG5cdFx0dGhpcy5pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcclxuXHRcdFx0Ly8gXHUwNDE3XHUwNDMwXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0NDMgXHUwNDNEXHUwNDMwIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDXHJcblx0XHRcdGlmICghdGhpcy5tb3VzZUlzT3ZlckRyb3Bkb3duKSB7XHJcblx0XHRcdFx0dGhpcy5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQzRlx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzIgZHJvcGRvd25cclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbmRlck9wdGlvbnMoKTogdm9pZCB7XHJcblx0XHR0aGlzLmRyb3Bkb3duLmlubmVySFRNTCA9ICcnO1xyXG5cclxuXHRcdHRoaXMuY3VycmVudE9wdGlvbnMuZm9yRWFjaCgob3B0aW9uLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRjb25zdCBvcHRpb25FbGVtZW50ID0gdGhpcy5jcmVhdGVPcHRpb25FbGVtZW50KG9wdGlvbiwgaW5kZXggPT09IHRoaXMuc2VsZWN0ZWRJbmRleCk7XHJcblx0XHRcdHRoaXMuZHJvcGRvd24uYXBwZW5kQ2hpbGQob3B0aW9uRWxlbWVudCk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuc2Nyb2xsVG9TZWxlY3RlZCgpOyAvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzZcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzMlx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzRFxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHQgKiBAcGFyYW0gb3B0aW9uIC0gXHUwNDNFXHUwNDNGXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHQgKiBAcGFyYW0gaXNTZWxlY3RlZCAtIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzMCBcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDNGXHUwNDQ2XHUwNDM4XHUwNDRGXHJcblx0ICogQHJldHVybnMgSFRNTCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDNFXHUwNDNGXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0ICovXHJcblx0cHJpdmF0ZSBjcmVhdGVPcHRpb25FbGVtZW50KG9wdGlvbjogQXV0b2NvbXBsZXRlSXRlbSwgaXNTZWxlY3RlZDogYm9vbGVhbik6IEhUTUxFbGVtZW50IHtcclxuXHRcdGNvbnN0IG9wdGlvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0b3B0aW9uRGl2LmNsYXNzTmFtZSA9IGByZWZlcmVuY2Utb3B0aW9uICR7aXNTZWxlY3RlZCA/ICdzZWxlY3RlZCcgOiAnJ31gO1xyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzMFxyXG5cdFx0Y29uc3QgaWNvblNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcblx0XHRpY29uU3Bhbi5jbGFzc05hbWUgPSAncmVmZXJlbmNlLW9wdGlvbi1pY29uJztcclxuXHRcdHNldEljb24oaWNvblNwYW4sIG9wdGlvbi5pY29uKTtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0M0NcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcblx0XHRjb25zdCBuYW1lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdG5hbWVTcGFuLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2Utb3B0aW9uLW5hbWUnO1xyXG5cdFx0bmFtZVNwYW4udGV4dENvbnRlbnQgPSBvcHRpb24ubmFtZTtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0M1xyXG5cdFx0Y29uc3QgcGF0aFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcblx0XHRwYXRoU3Bhbi5jbGFzc05hbWUgPSAncmVmZXJlbmNlLW9wdGlvbi1wYXRoJztcclxuXHRcdHBhdGhTcGFuLnRleHRDb250ZW50ID0gb3B0aW9uLnBhdGg7XHJcblxyXG5cdFx0b3B0aW9uRGl2LmFwcGVuZENoaWxkKGljb25TcGFuKTtcclxuXHRcdG9wdGlvbkRpdi5hcHBlbmRDaGlsZChuYW1lU3Bhbik7XHJcblx0XHRvcHRpb25EaXYuYXBwZW5kQ2hpbGQocGF0aFNwYW4pO1xyXG5cclxuXHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzBcclxuXHRcdG9wdGlvbkRpdi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKG9wdGlvbik7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gb3B0aW9uRGl2O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDNFXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIGRyb3Bkb3duIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzBcclxuXHQgKiBAcGFyYW0gY3Vyc29yUmVjdCAtIERPTVJlY3QgXHUwNDNFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDMwIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMCwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzguXHJcblx0ICovXHJcblx0cHJpdmF0ZSBwb3NpdGlvbkRyb3Bkb3duKGN1cnNvclJlY3Q6IERPTVJlY3QpOiB2b2lkIHtcclxuXHRcdC8vIFx1MDQyN1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQ0QiwgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIGRpc3BsYXk6ICdibG9jaydcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG5cdFx0Y29uc3QgaW5wdXRSZWN0ID0gdGhpcy5pbnB1dEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRjb25zdCBjb250YWluZXJSZWN0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRjb25zdCBkcm9wZG93blJlY3QgPSB0aGlzLmRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRFx1MDQzMFxyXG5cdFx0Y29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDNFXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSBpbnB1dEVsZW1lbnQsIFx1MDQ0Mi5cdTA0M0EuIFx1MDQzRVx1MDQzRCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDMyIFx1MDQzRlx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0M0FcdTA0NDNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcclxuXHRcdC8vIFx1MDQxQlx1MDQzNVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0M0FcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDEgXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDRCXHUwNDNDIFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzBcclxuXHRcdGxldCBsZWZ0ID0gY3Vyc29yUmVjdC5sZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzNVx1MDQ0NFx1MDQzRVx1MDQzQlx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgLSBcdTA0M0ZcdTA0M0VcdTA0MzQgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDNDXHJcblx0XHRsZXQgdG9wID0gY3Vyc29yUmVjdC5ib3R0b20gLSBjb250YWluZXJSZWN0LnRvcCArIDU7IC8vICs1cHggXHUwNDNFXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0MzVcdTA0NDFcdTA0NDJcdTA0NEMgXHUwNDNCXHUwNDM4IFx1MDQzQ1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzRSBcdTA0NDFcdTA0M0RcdTA0MzhcdTA0MzdcdTA0NDNcclxuXHRcdGNvbnN0IHNwYWNlQmVsb3cgPSB2aWV3cG9ydEhlaWdodCAtIGN1cnNvclJlY3QuYm90dG9tO1xyXG5cdFx0Y29uc3Qgc3BhY2VBYm92ZSA9IGN1cnNvclJlY3QudG9wO1xyXG5cclxuXHRcdGlmIChzcGFjZUJlbG93IDwgZHJvcGRvd25SZWN0LmhlaWdodCArIDEwICYmIHNwYWNlQWJvdmUgPiBkcm9wZG93blJlY3QuaGVpZ2h0ICsgMTApIHtcclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzRFx1MDQzOFx1MDQzN1x1MDQ0MyBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0M0UgXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0NDMgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDNFLCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1XHUwNDQzXHJcblx0XHRcdHRvcCA9IGN1cnNvclJlY3QudG9wIC0gY29udGFpbmVyUmVjdC50b3AgLSBkcm9wZG93blJlY3QuaGVpZ2h0IC0gNTsgLy8gLTVweCBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzBcclxuXHRcdGNvbnN0IG1heFJpZ2h0ID0gaW5wdXRSZWN0LnJpZ2h0IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xyXG5cdFx0aWYgKGxlZnQgKyBkcm9wZG93blJlY3Qud2lkdGggPiBtYXhSaWdodCkge1xyXG5cdFx0XHRsZWZ0ID0gbWF4UmlnaHQgLSBkcm9wZG93blJlY3Qud2lkdGg7XHJcblx0XHRcdGlmIChsZWZ0IDwgMCkgbGVmdCA9IDA7IC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCwgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDM2XHUwNDM4XHUwNDNDXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQSBcdTA0M0JcdTA0MzVcdTA0MzJcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDRFXHJcblx0XHR9XHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzJcdTA0MzBcclxuXHRcdGlmIChsZWZ0IDwgMCkge1xyXG5cdFx0XHRsZWZ0ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcclxuXHRcdC8vIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDMgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDMwIFx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzUgaW5wdXRFbGVtZW50LCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDNEIFx1MDQzMVx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQ0OFx1MDQzNVxyXG5cdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MiBcdTA0NDFcdTA0M0JcdTA0MzhcdTA0NDhcdTA0M0FcdTA0M0VcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDNFXHUwNDM1XHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLm1pbldpZHRoID0gYCR7aW5wdXRSZWN0LndpZHRoIC8gMn1weGA7IC8vIFx1MDQxQ1x1MDQzOFx1MDQzRFx1MDQzOFx1MDQzQ1x1MDQ0M1x1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0MzhcdTA0M0RcdTA0MzAgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDRCIFx1MDQzOFx1MDQzRFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQzMFxyXG5cdFx0dGhpcy5kcm9wZG93bi5zdHlsZS53aWR0aCA9ICdhdXRvJzsgLy8gXHUwNDFGXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0MyBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDQzLCBcdTA0M0RcdTA0M0UgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSBtaW5XaWR0aFxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzIgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDM1XHJcblx0ICogQHBhcmFtIGRpcmVjdGlvbiAtIFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSAoMSA9IFx1MDQzMlx1MDQzRFx1MDQzOFx1MDQzNywgLTEgPSBcdTA0MzJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDUpXHJcblx0ICovXHJcblx0cHJpdmF0ZSBtb3ZlU2VsZWN0aW9uKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggKz0gZGlyZWN0aW9uO1xyXG5cclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPCAwKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoIC0gMTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJPcHRpb25zKCk7XHJcblx0XHR0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDNBIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0NDNcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWQoKTogdm9pZCB7XHJcblx0XHRjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLmRyb3Bkb3duLnF1ZXJ5U2VsZWN0b3IoJy5yZWZlcmVuY2Utb3B0aW9uLnNlbGVjdGVkJykgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHRpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XHJcblx0XHRcdHNlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NEJcdTA0MzFcdTA0MzhcdTA0NDBcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0Q3VycmVudEl0ZW0oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4ID49IDAgJiYgdGhpcy5zZWxlY3RlZEluZGV4IDwgdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGgpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RJdGVtKHRoaXMuY3VycmVudE9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NEJcdTA0MzFcdTA0MzhcdTA0NDBcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MlxyXG5cdCAqIEBwYXJhbSBpdGVtIC0gXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0SXRlbShpdGVtOiBBdXRvY29tcGxldGVJdGVtKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5vbkl0ZW1TZWxlY3RlZENhbGxiYWNrICYmIHRoaXMuY3VycmVudFJlZmVyZW5jZSkge1xyXG5cdFx0XHR0aGlzLm9uSXRlbVNlbGVjdGVkQ2FsbGJhY2soaXRlbSwgdGhpcy5jdXJyZW50UmVmZXJlbmNlKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuaGlkZUF1dG9jb21wbGV0ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQ0QlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5kcm9wZG93bi5wYXJlbnROb2RlKSB7XHJcblx0XHRcdHRoaXMuZHJvcGRvd24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MjBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQ0QiwgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDRGIFx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0NEJcdTA0M0MgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzRVx1MDQzOSBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDQwLlxyXG4gKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzRVx1MDQzNFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQzNSAoQC8jKSwgXHUwNDQyXHUwNDMwXHUwNDNBIFx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgKEBALyMjKSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzguXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBMTE1BZ2VudFBsdWdpbiBmcm9tICdtYWluJztcclxuaW1wb3J0IHsgRmlsZVJlZmVyZW5jZSwgUmVmZXJlbmNlUGFyc2VyIH0gZnJvbSAnLi9SZWZlcmVuY2VQYXJzZXInO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZUVuZ2luZSB9IGZyb20gJy4vVGVtcGxhdGVFbmdpbmUnO1xyXG5pbXBvcnQgeyBBdHRhY2htZW50LCBDaGF0SGlzdG9yeUl0ZW0gfSBmcm9tICdzcmMvY29tcG9uZW50cy9tb2RlbHMvQ2hhdEhpc3RvcnlJdGVtJztcclxuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIEV4cGFuZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZUV4cGFuZGVyIHtcclxuXHRwcml2YXRlIHBsdWdpbjogTExNQWdlbnRQbHVnaW47XHJcblx0cHJpdmF0ZSB0ZW1wbGF0ZUVuZ2luZTogVGVtcGxhdGVFbmdpbmU7XHJcblx0cHJpdmF0ZSBjYWNoZU1hbmFnZXI6IENhY2hlTWFuYWdlcjtcclxuXHJcblx0Y29uc3RydWN0b3IocGx1Z2luOiBMTE1BZ2VudFBsdWdpbiwgdGVtcGxhdGVFbmdpbmU6IFRlbXBsYXRlRW5naW5lKSB7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHRcdHRoaXMudGVtcGxhdGVFbmdpbmUgPSB0ZW1wbGF0ZUVuZ2luZTtcclxuXHRcdHRoaXMuY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcihwbHVnaW4pO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0NDFcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIChcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDNFXHUwNDM5IFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDApXHJcblx0ICogQHBhcmFtIHRleHQgLSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOFxyXG5cdCAqIEBwYXJhbSByZWZlcmVuY2VzIC0gXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDM4XHJcblx0ICogQHJldHVybnMgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQ0MSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4XHJcblx0ICovXHJcblx0YXN5bmMgZXhwYW5kUmVmZXJlbmNlcyh0ZXh0OiBzdHJpbmcsIHJlZmVyZW5jZXM6IEZpbGVSZWZlcmVuY2VbXSk6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIHRleHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGV4cGFuZGVkVGV4dCA9IHRleHQ7XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0M0VcdTA0NDIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQ2XHUwNDMwIFx1MDQzQSBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NDMsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDQxXHUwNDMxXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQzRFx1MDQzNFx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0QlxyXG5cdFx0Y29uc3Qgc29ydGVkUmVmZXJlbmNlcyA9IFsuLi5yZWZlcmVuY2VzXS5zb3J0KChhLCBiKSA9PiB7XHJcblx0XHRcdGNvbnN0IGFNYXRjaGVzID0gUmVmZXJlbmNlUGFyc2VyLnBhcnNlUmVmZXJlbmNlcyh0ZXh0KS5maWx0ZXIoKG0pID0+IG0ubmFtZSA9PT0gYS5uYW1lKTtcclxuXHRcdFx0Y29uc3QgYk1hdGNoZXMgPSBSZWZlcmVuY2VQYXJzZXIucGFyc2VSZWZlcmVuY2VzKHRleHQpLmZpbHRlcigobSkgPT4gbS5uYW1lID09PSBiLm5hbWUpO1xyXG5cdFx0XHRjb25zdCBhSW5kZXggPSBhTWF0Y2hlcy5sZW5ndGggPiAwID8gYU1hdGNoZXNbYU1hdGNoZXMubGVuZ3RoIC0gMV0uc3RhcnRJbmRleCA6IDA7XHJcblx0XHRcdGNvbnN0IGJJbmRleCA9IGJNYXRjaGVzLmxlbmd0aCA+IDAgPyBiTWF0Y2hlc1tiTWF0Y2hlcy5sZW5ndGggLSAxXS5zdGFydEluZGV4IDogMDtcclxuXHRcdFx0cmV0dXJuIGJJbmRleCAtIGFJbmRleDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHNvcnRlZFJlZmVyZW5jZXMpIHtcclxuXHRcdFx0ZXhwYW5kZWRUZXh0ID0gYXdhaXQgdGhpcy5leHBhbmRTaW5nbGVSZWZlcmVuY2UoZXhwYW5kZWRUZXh0LCByZWZlcmVuY2UpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBleHBhbmRlZFRleHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSwgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggKEBALyMjKVxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlcyAtIFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzlcclxuXHQgKiBAcmV0dXJucyBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICovXHJcblx0YXN5bmMgZXhwYW5kTWVzc2FnZUhpc3RvcnkobWVzc2FnZXM6IGFueVtdKTogUHJvbWlzZTxhbnlbXT4ge1xyXG5cdFx0Y29uc3QgZXhwYW5kZWRNZXNzYWdlcyA9IFtdO1xyXG5cclxuXHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xyXG5cdFx0XHRpZiAobWVzc2FnZS5yb2xlID09PSAndXNlcicpIHtcclxuXHRcdFx0XHRjb25zdCBleHBhbmRlZENvbnRlbnQgPSBhd2FpdCB0aGlzLmV4cGFuZFBlcm1hbmVudFJlZmVyZW5jZXMobWVzc2FnZS5jb250ZW50KTtcclxuXHRcdFx0XHRleHBhbmRlZE1lc3NhZ2VzLnB1c2goe1xyXG5cdFx0XHRcdFx0Li4ubWVzc2FnZSxcclxuXHRcdFx0XHRcdGNvbnRlbnQ6IGV4cGFuZGVkQ29udGVudFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGV4cGFuZGVkTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBleHBhbmRlZE1lc3NhZ2VzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzhcdTA0MzcgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCXHJcblx0ICovXHJcblx0YXN5bmMgZXh0cmFjdEF0dGFjaG1lbnRzKFxyXG5cdFx0dGV4dDogc3RyaW5nLFxyXG5cdFx0cmVmZXJlbmNlczogRmlsZVJlZmVyZW5jZVtdXHJcblx0KTogUHJvbWlzZTx7XHJcblx0XHRvcmlnaW5hbFRleHQ6IHN0cmluZztcclxuXHRcdGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W107XHJcblx0fT4ge1xyXG5cdFx0Y29uc3QgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdO1xyXG5cclxuXHRcdGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRsZXQgY2FjaGVkUGF0aDogc3RyaW5nO1xyXG5cdFx0XHRcdGxldCB1dWlkOiBzdHJpbmc7XHJcblx0XHRcdFx0bGV0IG1pbWVUeXBlOiBzdHJpbmc7XHJcblx0XHRcdFx0bGV0IHNvdXJjZVBhdGg6IHN0cmluZztcclxuXHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZS50eXBlID09PSAnZXh0ZXJuYWwnKSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MUFcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDNEXHUwNDM1XHUwNDQ4XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlxyXG5cdFx0XHRcdFx0Y29uc3QgY2FjaGVSZXN1bHQgPSBhd2FpdCB0aGlzLmNhY2hlTWFuYWdlci5jYWNoZUV4dGVybmFsRmlsZShyZWZlcmVuY2UucGF0aCk7XHJcblx0XHRcdFx0XHRjYWNoZWRQYXRoID0gY2FjaGVSZXN1bHQuY2FjaGVkUGF0aDtcclxuXHRcdFx0XHRcdHV1aWQgPSBjYWNoZVJlc3VsdC51dWlkO1xyXG5cdFx0XHRcdFx0bWltZVR5cGUgPSBjYWNoZVJlc3VsdC5taW1lVHlwZTtcclxuXHRcdFx0XHRcdHNvdXJjZVBhdGggPSByZWZlcmVuY2UucGF0aDsgLy8gXHUwNDEwXHUwNDMxXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRFXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDM5XHJcblx0XHRcdFx0fSBlbHNlIGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnKSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDM4XHUwNDM3IHZhdWx0XHJcblx0XHRcdFx0XHRjb25zdCBmaWxlID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChyZWZlcmVuY2UucGF0aCk7XHJcblx0XHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNhY2hlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuY2FjaGVWYXVsdEZpbGUoZmlsZSk7XHJcblx0XHRcdFx0XHRcdGNhY2hlZFBhdGggPSBjYWNoZVJlc3VsdC5jYWNoZWRQYXRoO1xyXG5cdFx0XHRcdFx0XHR1dWlkID0gY2FjaGVSZXN1bHQudXVpZDtcclxuXHRcdFx0XHRcdFx0bWltZVR5cGUgPSB0aGlzLmdldE1pbWVUeXBlKGZpbGUubmFtZSk7XHJcblx0XHRcdFx0XHRcdHNvdXJjZVBhdGggPSBmaWxlLnBhdGg7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKGBcdTA0MjRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCBcdTA0MzIgdmF1bHQ6ICR7cmVmZXJlbmNlLnBhdGh9YCk7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBwcm9tcHRcclxuXHRcdFx0XHRcdC8vIFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHJlZmVyZW5jZS5wYXRoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNhY2hlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuY2FjaGVWYXVsdEZpbGUoZmlsZSk7XHJcblx0XHRcdFx0XHRcdGNhY2hlZFBhdGggPSBjYWNoZVJlc3VsdC5jYWNoZWRQYXRoO1xyXG5cdFx0XHRcdFx0XHR1dWlkID0gY2FjaGVSZXN1bHQudXVpZDtcclxuXHRcdFx0XHRcdFx0bWltZVR5cGUgPSAndGV4dC9tYXJrZG93bic7XHJcblx0XHRcdFx0XHRcdHNvdXJjZVBhdGggPSBmaWxlLnBhdGg7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0VcdTA0NDIgcHJvbXB0c0ZvbGRlclxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKGBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRDogJHtyZWZlcmVuY2UucGF0aH1gKTtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRhdHRhY2htZW50cy5wdXNoKHtcclxuXHRcdFx0XHRcdHR5cGU6IHJlZmVyZW5jZS50eXBlLFxyXG5cdFx0XHRcdFx0bmFtZTogcmVmZXJlbmNlLm5hbWUsXHJcblx0XHRcdFx0XHRzb3VyY2VQYXRoOiBzb3VyY2VQYXRoLFxyXG5cdFx0XHRcdFx0Y2FjaGVkUGF0aDogY2FjaGVkUGF0aCxcclxuXHRcdFx0XHRcdHV1aWQ6IHV1aWQsXHJcblx0XHRcdFx0XHRwZXJtYW5lbnQ6IHJlZmVyZW5jZS5wZXJtYW5lbnQsXHJcblx0XHRcdFx0XHRtaW1lVHlwZTogbWltZVR5cGVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyAke3JlZmVyZW5jZS5uYW1lfTpgLCBlcnJvcik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRvcmlnaW5hbFRleHQ6IHRleHQsXHJcblx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0TWltZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHQvLyBcdTA0MjJcdTA0MzAgXHUwNDM2XHUwNDM1IFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzOFx1MDQzQVx1MDQzMCwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzMiBDYWNoZU1hbmFnZXJcclxuXHRcdGNvbnN0IGV4dCA9IGZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRjb25zdCBtaW1lVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcblx0XHRcdHR4dDogJ3RleHQvcGxhaW4nLFxyXG5cdFx0XHRtZDogJ3RleHQvbWFya2Rvd24nLFxyXG5cdFx0XHRqc29uOiAnYXBwbGljYXRpb24vanNvbicsXHJcblx0XHRcdGpzOiAndGV4dC9qYXZhc2NyaXB0JyxcclxuXHRcdFx0dHM6ICd0ZXh0L3R5cGVzY3JpcHQnLFxyXG5cdFx0XHRodG1sOiAndGV4dC9odG1sJyxcclxuXHRcdFx0Y3NzOiAndGV4dC9jc3MnLFxyXG5cdFx0XHRwZGY6ICdhcHBsaWNhdGlvbi9wZGYnLFxyXG5cdFx0XHRwbmc6ICdpbWFnZS9wbmcnLFxyXG5cdFx0XHRqcGc6ICdpbWFnZS9qcGVnJyxcclxuXHRcdFx0anBlZzogJ2ltYWdlL2pwZWcnLFxyXG5cdFx0XHRnaWY6ICdpbWFnZS9naWYnLFxyXG5cdFx0XHRzdmc6ICdpbWFnZS9zdmcreG1sJyxcclxuXHRcdFx0eG1sOiAnYXBwbGljYXRpb24veG1sJyxcclxuXHRcdFx0Y3N2OiAndGV4dC9jc3YnLFxyXG5cdFx0XHR6aXA6ICdhcHBsaWNhdGlvbi96aXAnLFxyXG5cdFx0XHRweTogJ3RleHQveC1weXRob24nLFxyXG5cdFx0XHRqYXZhOiAndGV4dC94LWphdmEnLFxyXG5cdFx0XHRjcHA6ICd0ZXh0L3gtYysrc3JjJyxcclxuXHRcdFx0YzogJ3RleHQveC1jc3JjJyxcclxuXHRcdFx0aDogJ3RleHQveC1jaGRyJyxcclxuXHRcdFx0c2g6ICdhcHBsaWNhdGlvbi94LXNoJyxcclxuXHRcdFx0eWFtbDogJ3RleHQveWFtbCcsXHJcblx0XHRcdHltbDogJ3RleHQveWFtbCdcclxuXHRcdH07XHJcblx0XHRyZXR1cm4gbWltZVR5cGVzW2V4dCB8fCAnJ10gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0MzNcdTA0M0VcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBMTE0gXHUwNDQxIFx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkuXHJcblx0ICogXHUwNDIwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgKEBALyMjKSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNEXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOC5cclxuXHQgKi9cclxuXHRhc3luYyBwcmVwYXJlTWVzc2FnZXNGb3JMTE0obWVzc2FnZXM6IENoYXRIaXN0b3J5SXRlbVtdLCBpc0xhc3RNZXNzYWdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRjb25zdCBwcmVwYXJlZE1lc3NhZ2VzID0gW107XHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRjb25zdCBtc2cgPSBtZXNzYWdlc1tpXTtcclxuXHRcdFx0Y29uc3QgaXNMYXN0ID0gaSA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMTtcclxuXHJcblx0XHRcdGlmIChtc2cucm9sZSA9PT0gJ3VzZXInICYmIG1zZy5hdHRhY2htZW50cyAmJiBtc2cuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdC8vIFx1MDQxRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDNBXHUwNDMwXHUwNDNBXHUwNDM4XHUwNDM1IFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRDXHJcblx0XHRcdFx0Y29uc3QgYXR0YWNobWVudHNUb0V4cGFuZCA9IG1zZy5hdHRhY2htZW50cy5maWx0ZXIoKGF0dCkgPT4gYXR0LnBlcm1hbmVudCB8fCAoaXNMYXN0ICYmIGlzTGFzdE1lc3NhZ2UpKTtcclxuXHJcblx0XHRcdFx0aWYgKGF0dGFjaG1lbnRzVG9FeHBhbmQubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0Ly8gXHUwNDI0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDEgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRCXHUwNDNDXHUwNDM4IFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rlx1MDQzQ1x1MDQzOFxyXG5cdFx0XHRcdFx0bGV0IGV4cGFuZGVkQ29udGVudCA9IG1zZy5jb250ZW50O1xyXG5cclxuXHRcdFx0XHRcdGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBhdHRhY2htZW50c1RvRXhwYW5kKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGZvcm1hdHRlZENvbnRlbnQgPSB0aGlzLmZvcm1hdENvbnRlbnRGb3JJbnNlcnRpb24oYXR0YWNobWVudC5jb250ZW50IHx8ICcnLCBhdHRhY2htZW50KTtcclxuXHRcdFx0XHRcdFx0ZXhwYW5kZWRDb250ZW50ICs9ICdcXG4nICsgZm9ybWF0dGVkQ29udGVudDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRwcmVwYXJlZE1lc3NhZ2VzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRyb2xlOiBtc2cucm9sZSxcclxuXHRcdFx0XHRcdFx0Y29udGVudDogZXhwYW5kZWRDb250ZW50XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QywgXHUwNDNEXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFXHJcblx0XHRcdFx0XHRwcmVwYXJlZE1lc3NhZ2VzLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRyb2xlOiBtc2cucm9sZSxcclxuXHRcdFx0XHRcdFx0Y29udGVudDogbXNnLmNvbnRlbnRcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVxyXG5cdFx0XHRcdHByZXBhcmVkTWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHRyb2xlOiBtc2cucm9sZSxcclxuXHRcdFx0XHRcdGNvbnRlbnQ6IG1zZy5jb250ZW50XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcHJlcGFyZWRNZXNzYWdlcztcclxuXHR9XHJcblxyXG5cdC8vIFRPRE86IFx1MDQxRlx1MDQ0MFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQxXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQ4XHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMyIC0gXHUwNDQxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcclxuXHQvLyBhc3luYyBleHBhbmRSZWZlcmVuY2VzV2l0aFNuYXBzaG90cyh0ZXh0OiBzdHJpbmcsIHJlZmVyZW5jZXM6IEZpbGVSZWZlcmVuY2VbXSwgbWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPHtleHBhbmRlZFRleHQ6IHN0cmluZywgc25hcHNob3RzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fT4ge1xyXG5cdC8vICAgICBjb25zdCBzbmFwc2hvdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuXHQvLyAgICAgbGV0IGV4cGFuZGVkVGV4dCA9IHRleHQ7XHJcblx0Ly9cclxuXHQvLyAgICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xyXG5cdC8vICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMubG9hZEZpbGVDb250ZW50KHJlZmVyZW5jZSk7XHJcblx0Ly8gICAgICAgICBpZiAoY29udGVudCAhPT0gbnVsbCkge1xyXG5cdC8vICAgICAgICAgICAgIHNuYXBzaG90c1tyZWZlcmVuY2UucGF0aF0gPSBjb250ZW50O1xyXG5cdC8vICAgICAgICAgICAgIGV4cGFuZGVkVGV4dCA9IGF3YWl0IHRoaXMuZXhwYW5kU2luZ2xlUmVmZXJlbmNlKGV4cGFuZGVkVGV4dCwgcmVmZXJlbmNlLCBjb250ZW50KTtcclxuXHQvLyAgICAgICAgIH1cclxuXHQvLyAgICAgfVxyXG5cdC8vXHJcblx0Ly8gICAgIHJldHVybiB7IGV4cGFuZGVkVGV4dCwgc25hcHNob3RzIH07XHJcblx0Ly8gfVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0NDMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDQzIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzVcclxuXHQgKiBAcGFyYW0gdGV4dCAtIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDM4XHJcblx0ICogQHBhcmFtIHJlZmVyZW5jZSAtIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDRGXHJcblx0ICogQHBhcmFtIHByZWxvYWRlZENvbnRlbnQgLSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IChcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQ4XHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMyKVxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDNFXHUwNDM5IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzRVx1MDQzOVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgZXhwYW5kU2luZ2xlUmVmZXJlbmNlKHRleHQ6IHN0cmluZywgcmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlLCBwcmVsb2FkZWRDb250ZW50Pzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHRcdGNvbnN0IGNvbnRlbnQgPSBwcmVsb2FkZWRDb250ZW50IHx8IChhd2FpdCB0aGlzLmxvYWRGaWxlQ29udGVudChyZWZlcmVuY2UpKTtcclxuXHJcblx0XHRpZiAoY29udGVudCA9PT0gbnVsbCkge1xyXG5cdFx0XHRjb25zb2xlLndhcm4oYFx1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4OiAke3JlZmVyZW5jZS5uYW1lfWApO1xyXG5cdFx0XHRyZXR1cm4gdGV4dDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDMwXHUwNDQyXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDNEIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEJcclxuXHRcdGNvbnN0IHByZWZpeCA9IHJlZmVyZW5jZS5wZXJtYW5lbnQgPyAocmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJyA/ICdAQCcgOiAnIyMnKSA6IHJlZmVyZW5jZS50eXBlID09PSAnZmlsZScgPyAnQCcgOiAnIyc7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzMCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzhcclxuXHRcdGNvbnN0IGVzY2FwZWROYW1lID0gdGhpcy5lc2NhcGVSZWdFeHAocmVmZXJlbmNlLm5hbWUpO1xyXG5cdFx0Y29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYCR7dGhpcy5lc2NhcGVSZWdFeHAocHJlZml4KX0oPzpcIiR7ZXNjYXBlZE5hbWV9XCJ8JHtlc2NhcGVkTmFtZX0pKD89XFxcXHN8JHxbXlxcXFx3LV0pYCwgJ2cnKTtcclxuXHJcblx0XHQvLyBcdTA0MjRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzhcclxuXHRcdGNvbnN0IGZvcm1hdHRlZENvbnRlbnQgPSB0aGlzLmZvcm1hdENvbnRlbnRGb3JJbnNlcnRpb24oY29udGVudCwgcmVmZXJlbmNlKTtcclxuXHJcblx0XHRyZXR1cm4gdGV4dC5yZXBsYWNlKHBhdHRlcm4sIGZvcm1hdHRlZENvbnRlbnQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IChAQC8jIykgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNVxyXG5cdCAqIEBwYXJhbSB0ZXh0IC0gXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzhcclxuXHQgKiBAcmV0dXJucyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4XHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyBleHBhbmRQZXJtYW5lbnRSZWZlcmVuY2VzKHRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRjb25zdCBtYXRjaGVzID0gUmVmZXJlbmNlUGFyc2VyLnBhcnNlUmVmZXJlbmNlcyh0ZXh0KTtcclxuXHRcdGNvbnN0IHBlcm1hbmVudE1hdGNoZXMgPSBtYXRjaGVzLmZpbHRlcigobWF0Y2gpID0+IG1hdGNoLnByZWZpeC5sZW5ndGggPT09IDIpOyAvLyBAQCBcdTA0MzhcdTA0M0JcdTA0MzggIyNcclxuXHJcblx0XHRpZiAocGVybWFuZW50TWF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIHRleHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGV4cGFuZGVkVGV4dCA9IHRleHQ7XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0M0VcdTA0NDIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQ2XHUwNDMwIFx1MDQzQSBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NDNcclxuXHRcdGNvbnN0IHNvcnRlZE1hdGNoZXMgPSBbLi4ucGVybWFuZW50TWF0Y2hlc10uc29ydCgoYSwgYikgPT4gYi5zdGFydEluZGV4IC0gYS5zdGFydEluZGV4KTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IG1hdGNoIG9mIHNvcnRlZE1hdGNoZXMpIHtcclxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlID0ge1xyXG5cdFx0XHRcdHR5cGU6IG1hdGNoLnR5cGUsXHJcblx0XHRcdFx0bmFtZTogbWF0Y2gubmFtZSxcclxuXHRcdFx0XHRwYXRoOiBhd2FpdCB0aGlzLnJlc29sdmVGaWxlUGF0aChtYXRjaC5uYW1lLCBtYXRjaC50eXBlKSxcclxuXHRcdFx0XHRwZXJtYW5lbnQ6IHRydWVcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmxvYWRGaWxlQ29udGVudChyZWZlcmVuY2UpO1xyXG5cdFx0XHRpZiAoY29udGVudCAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlZENvbnRlbnQgPSB0aGlzLmZvcm1hdENvbnRlbnRGb3JJbnNlcnRpb24oY29udGVudCwgcmVmZXJlbmNlKTtcclxuXHRcdFx0XHRleHBhbmRlZFRleHQgPSBleHBhbmRlZFRleHQuc3Vic3RyaW5nKDAsIG1hdGNoLnN0YXJ0SW5kZXgpICsgZm9ybWF0dGVkQ29udGVudCArIGV4cGFuZGVkVGV4dC5zdWJzdHJpbmcobWF0Y2guZW5kSW5kZXgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4cGFuZGVkVGV4dDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcblx0ICogQHBhcmFtIHJlZmVyZW5jZSAtIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHJcblx0ICogQHJldHVybnMgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCBcdTA0MzhcdTA0M0JcdTA0MzggbnVsbCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgbG9hZEZpbGVDb250ZW50KHJlZmVyZW5jZTogRmlsZVJlZmVyZW5jZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgZmlsZSA9IHRoaXMuZmluZEZpbGUocmVmZXJlbmNlLnBhdGgsIHJlZmVyZW5jZS50eXBlKTtcclxuXHRcdFx0aWYgKCFmaWxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQucmVhZChmaWxlKTtcclxuXHJcblx0XHRcdC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzRFx1MDQ0QlxyXG5cdFx0XHRpZiAocmVmZXJlbmNlLnR5cGUgPT09ICdwcm9tcHQnKSB7XHJcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMudGVtcGxhdGVFbmdpbmUuZXhwYW5kUHJvbXB0VGVtcGxhdGUoY29udGVudCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBjb250ZW50O1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgJHtyZWZlcmVuY2UucGF0aH06YCwgZXJyb3IpO1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNGXHUwNDNFIFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQzOFxyXG5cdCAqIEBwYXJhbSBwYXRoIC0gXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NDNcclxuXHQgKiBAcGFyYW0gdHlwZSAtIFx1MDQ0Mlx1MDQzOFx1MDQzRiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHQgKiBAcmV0dXJucyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDM4XHUwNDNCXHUwNDM4IG51bGxcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRGaWxlKHBhdGg6IHN0cmluZywgdHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcpOiBURmlsZSB8IG51bGwge1xyXG5cdFx0bGV0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHBhdGgpO1xyXG5cclxuXHRcdGlmICghZmlsZSAmJiB0eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDQyXHUwNDM4IFx1MDQzMiBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyXHJcblx0XHRcdGNvbnN0IHByb21wdHNGb2xkZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRzRm9sZGVyO1xyXG5cdFx0XHRpZiAocHJvbXB0c0ZvbGRlcikge1xyXG5cdFx0XHRcdGNvbnN0IGZ1bGxQYXRoID0gYCR7cHJvbXB0c0ZvbGRlcn0vJHtwYXRofWA7XHJcblx0XHRcdFx0ZmlsZSA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZnVsbFBhdGgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZpbGUgaW5zdGFuY2VvZiBURmlsZSA/IGZpbGUgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0MyBcdTA0M0ZcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4XHJcblx0ICogQHBhcmFtIG5hbWUgLSBcdTA0MzhcdTA0M0NcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcblx0ICogQHBhcmFtIHR5cGUgLSBcdTA0NDJcdTA0MzhcdTA0M0YgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDQzXHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlRmlsZVBhdGgobmFtZTogc3RyaW5nLCB0eXBlOiAnZmlsZScgfCAncHJvbXB0Jyk6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRpZiAodHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0Y29uc3QgcHJvbXB0c0ZvbGRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXI7XHJcblx0XHRcdHJldHVybiBwcm9tcHRzRm9sZGVyID8gYCR7cHJvbXB0c0ZvbGRlcn0vJHtuYW1lfS5tZGAgOiBgJHtuYW1lfS5tZGA7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdTA0MThcdTA0NDlcdTA0MzVcdTA0M0MgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzMiBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0M0JcdTA0MzhcdTA0NDlcdTA0MzVcclxuXHRcdFx0Y29uc3QgZmlsZXMgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xyXG5cdFx0XHRjb25zdCBtYXRjaGluZ0ZpbGUgPSBmaWxlcy5maW5kKChmKSA9PiBmLmJhc2VuYW1lID09PSBuYW1lKTtcclxuXHRcdFx0cmV0dXJuIG1hdGNoaW5nRmlsZSA/IG1hdGNoaW5nRmlsZS5wYXRoIDogYCR7bmFtZX0ubWRgO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDI0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQzMiBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHQgKiBAcGFyYW0gY29udGVudCAtIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHQgKiBAcGFyYW0gcmVmZXJlbmNlIC0gXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzVcclxuXHQgKiBAcmV0dXJucyBcdTA0M0VcdTA0NDJcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmb3JtYXRDb250ZW50Rm9ySW5zZXJ0aW9uKGNvbnRlbnQ6IHN0cmluZywgcmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlKTogc3RyaW5nIHtcclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0VcdTA0M0EgXHUwNDQxIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOSBcdTA0M0UgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDM1XHJcblx0XHRjb25zdCBoZWFkZXIgPSBgXFxuXFxuLS0tIFx1MDQyMVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSAke3JlZmVyZW5jZS50eXBlID09PSAncHJvbXB0JyA/ICdcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAnIDogJ1x1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCd9OiAke3JlZmVyZW5jZS5uYW1lfSAtLS1cXG5gO1xyXG5cdFx0Y29uc3QgZm9vdGVyID0gYFxcbi0tLSBcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDYgJHtyZWZlcmVuY2UudHlwZSA9PT0gJ3Byb21wdCcgPyAnXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwJyA6ICdcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAnfTogJHtyZWZlcmVuY2UubmFtZX0gLS0tXFxuXFxuYDtcclxuXHJcblx0XHRyZXR1cm4gaGVhZGVyICsgY29udGVudC50cmltKCkgKyBmb290ZXI7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MkRcdTA0M0FcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdCAqIEBwYXJhbSBzdHJpbmcgLSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0RFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0RFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzBcclxuXHQgKi9cclxuXHRwcml2YXRlIGVzY2FwZVJlZ0V4cChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcblx0fVxyXG59XHJcbiIsICIvKipcclxuICogXHUwNDFGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgKEAvQEApIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0NEIgKCMvIyMpIFx1MDQzMiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5LlxyXG4gKiBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDM4XHUwNDQxXHUwNDNBIFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzNSBcdTA0MzggXHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMi5cclxuICovXHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcmZhY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2VNYXRjaCB7XHJcbiAgICBmdWxsTWF0Y2g6IHN0cmluZztcclxuICAgIHByZWZpeDogc3RyaW5nOyAvLyBcdTA0MjJcdTA0MzVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0NEMgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBALCAhQCwgIywgISMsICQsICEkXHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBzdGFydEluZGV4OiBudW1iZXI7XHJcbiAgICBlbmRJbmRleDogbnVtYmVyO1xyXG4gICAgdHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcgfCAnZXh0ZXJuYWwnO1xyXG4gICAgcGVybWFuZW50OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVSZWZlcmVuY2Uge1xyXG4gICAgdHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcgfCAnZXh0ZXJuYWwnO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgcGF0aDogc3RyaW5nO1xyXG4gICAgcGVybWFuZW50OiBib29sZWFuO1xyXG4gICAgdXVpZD86IHN0cmluZztcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFBhcnNlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2VQYXJzZXIge1xyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzJcdTA0NDFcdTA0MzUgQC9AQCBcdTA0MzggIy8jIyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzhcclxuXHQgKiBAcGFyYW0gdGV4dCAtIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRzdGF0aWMgcGFyc2VSZWZlcmVuY2VzKHRleHQ6IHN0cmluZyk6IFJlZmVyZW5jZU1hdGNoW10ge1xyXG5cdFx0Y29uc3QgbWF0Y2hlczogUmVmZXJlbmNlTWF0Y2hbXSA9IFtdO1xyXG5cclxuXHRcdGNvbnN0IHJlZ2V4ID0gLyghW0AjJF18W0AjJF0pKD86XCIoW15cIl0rKVwifChbXlxcc0AjJFwiIV0rKSkvZztcclxuXHJcblx0XHRsZXQgbWF0Y2g7XHJcblx0XHR3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcclxuXHRcdFx0Y29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XHJcblx0XHRcdGNvbnN0IHF1b3RlZE5hbWUgPSBtYXRjaFsyXTtcclxuXHRcdFx0Y29uc3QgdW5xdW90ZWROYW1lID0gbWF0Y2hbM107XHJcblx0XHRcdGNvbnN0IG5hbWUgPSBxdW90ZWROYW1lIHx8IHVucXVvdGVkTmFtZTtcclxuXHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0MzhcdTA0M0YgXHUwNDNGXHUwNDNFIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDMwIChcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgISlcclxuXHRcdFx0Y29uc3QgdHlwZUNoYXIgPSBwcmVmaXgucmVwbGFjZSgnIScsICcnKTtcclxuXHRcdFx0bGV0IHR5cGU6ICdmaWxlJyB8ICdwcm9tcHQnIHwgJ2V4dGVybmFsJztcclxuXHJcblx0XHRcdGlmICh0eXBlQ2hhciA9PT0gJ0AnKSB0eXBlID0gJ2ZpbGUnO1xyXG5cdFx0XHRlbHNlIGlmICh0eXBlQ2hhciA9PT0gJyMnKSB0eXBlID0gJ3Byb21wdCc7XHJcblx0XHRcdGVsc2UgdHlwZSA9ICdleHRlcm5hbCc7IC8vICRcclxuXHJcblx0XHRcdG1hdGNoZXMucHVzaCh7XHJcblx0XHRcdFx0ZnVsbE1hdGNoOiBtYXRjaFswXSxcclxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeCxcclxuXHRcdFx0XHRuYW1lOiBuYW1lLFxyXG5cdFx0XHRcdHN0YXJ0SW5kZXg6IG1hdGNoLmluZGV4LFxyXG5cdFx0XHRcdGVuZEluZGV4OiBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCxcclxuXHRcdFx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0XHRcdHBlcm1hbmVudDogcHJlZml4LnN0YXJ0c1dpdGgoJyEnKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF0Y2hlcztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQ0MiwgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzOCBcdTA0M0RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDhcdTA0NTFcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4XHJcblx0ICogQHBhcmFtIHRleHQgLSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHBhcmFtIGN1cnNvclBvc2l0aW9uIC0gXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzNSBcdTA0MzhcdTA0M0JcdTA0MzggbnVsbFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRDdXJyZW50UmVmZXJlbmNlKHRleHQ6IHN0cmluZywgY3Vyc29yUG9zaXRpb246IG51bWJlcik6IFJlZmVyZW5jZU1hdGNoIHwgbnVsbCB7XHJcblx0XHRjb25zdCBiZWZvcmVDdXJzb3IgPSB0ZXh0LnN1YnN0cmluZygwLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDE3XHUwNDFDXHUwNDE1XHUwNDFEXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M0FcdTA0MzAgIUAsICEjLCAhJFxyXG5cdFx0Y29uc3QgaW5jb21wbGV0ZVJlZ2V4ID0gLyghW0AjJF18W0AjJF0pKFteXFxzQCMkXCIhXSo/KSQvO1xyXG5cdFx0Y29uc3QgbWF0Y2ggPSBiZWZvcmVDdXJzb3IubWF0Y2goaW5jb21wbGV0ZVJlZ2V4KTtcclxuXHJcblx0XHRpZiAobWF0Y2gpIHtcclxuXHRcdFx0Y29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XHJcblx0XHRcdGNvbnN0IHBhcnRpYWxOYW1lID0gbWF0Y2hbMl07XHJcblx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBiZWZvcmVDdXJzb3IubGVuZ3RoIC0gbWF0Y2hbMF0ubGVuZ3RoO1xyXG5cclxuXHRcdFx0Y29uc3QgdHlwZUNoYXIgPSBwcmVmaXgucmVwbGFjZSgnIScsICcnKTtcclxuXHRcdFx0bGV0IHR5cGU6ICdmaWxlJyB8ICdwcm9tcHQnIHwgJ2V4dGVybmFsJztcclxuXHJcblx0XHRcdGlmICh0eXBlQ2hhciA9PT0gJ0AnKSB0eXBlID0gJ2ZpbGUnO1xyXG5cdFx0XHRlbHNlIGlmICh0eXBlQ2hhciA9PT0gJyMnKSB0eXBlID0gJ3Byb21wdCc7XHJcblx0XHRcdGVsc2UgdHlwZSA9ICdleHRlcm5hbCc7XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdGZ1bGxNYXRjaDogbWF0Y2hbMF0sXHJcblx0XHRcdFx0cHJlZml4OiBwcmVmaXgsXHJcblx0XHRcdFx0bmFtZTogcGFydGlhbE5hbWUsXHJcblx0XHRcdFx0c3RhcnRJbmRleDogc3RhcnRJbmRleCxcclxuXHRcdFx0XHRlbmRJbmRleDogY3Vyc29yUG9zaXRpb24sXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRwZXJtYW5lbnQ6IHByZWZpeC5zdGFydHNXaXRoKCchJylcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxMlx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzNFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDNEXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBAey4uLn0gXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBXHJcblx0ICogQHBhcmFtIHByb21wdENvbnRlbnQgLSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDQwXHUwNDM1XHUwNDM3XHUwNDQzXHUwNDNCXHUwNDRDXHUwNDQyXHUwNDMwXHUwNDQyIFx1MDQzMlx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzNFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOFxyXG5cdCAqL1xyXG5cdHN0YXRpYyB2YWxpZGF0ZVByb21wdFJlZmVyZW5jZXMocHJvbXB0Q29udGVudDogc3RyaW5nKTogeyB2YWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcclxuXHRcdGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0NDlcdTA0MzVcdTA0M0MgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBAey4uLn1cclxuXHRcdGNvbnN0IHRlbXBsYXRlUmVnZXggPSAvQFxceyhbXn1dKylcXH0vZztcclxuXHRcdGNvbnN0IG1hdGNoZXMgPSBwcm9tcHRDb250ZW50Lm1hdGNoQWxsKHRlbXBsYXRlUmVnZXgpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xyXG5cdFx0XHRjb25zdCByZWZlcmVuY2VOYW1lID0gbWF0Y2hbMV0udHJpbSgpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDM1XHJcblx0XHRcdGlmICghcmVmZXJlbmNlTmFtZSkge1xyXG5cdFx0XHRcdGVycm9ycy5wdXNoKGBcdTA0MUZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwIFx1MDQzMiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggJHttYXRjaC5pbmRleH1gKTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQ0MiBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDM0XHUwNDNFXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QlxyXG5cdFx0XHRpZiAoIS9eW2EtekEtWjAtOV8tXSskLy50ZXN0KHJlZmVyZW5jZU5hbWUpKSB7XHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goYFx1MDQxRFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzNSBcIiR7cmVmZXJlbmNlTmFtZX1cImApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXHJcblx0XHRcdGVycm9yczogZXJyb3JzXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzOFx1MDQzNyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAsIFx1MDQzRVx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQ0Rlx1MDQ0MVx1MDQ0QyBcdTA0M0RcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzMFx1MDQ0NS5cclxuXHQgKiBcdTA0MUZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFIFx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzRVx1MDQzQyBAey4uLn0uXHJcblx0ICogQHBhcmFtIHByb21wdENvbnRlbnQgLSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0ICogQHBhcmFtIHByZWZpeGVzIC0gXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzRVx1MDQzMiwgXHUwNDNGXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzQyBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCAoXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCBbJ0AnXSwgWycjJ10sIFsnQCcsICcjJ10pLiBcdTA0MUZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFIFsnQCddLlxyXG5cdCAqIEByZXR1cm5zIFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0QgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBXHJcblx0ICovXHJcblx0c3RhdGljIGV4dHJhY3RUZW1wbGF0ZVJlZmVyZW5jZXMocHJvbXB0Q29udGVudDogc3RyaW5nLCBwcmVmaXhlczogQXJyYXk8J0AnIHwgJyMnPiA9IFsnQCddKTogc3RyaW5nW10ge1xyXG5cdFx0Y29uc3QgcmVmZXJlbmNlczogc3RyaW5nW10gPSBbXTtcclxuXHRcdGxldCBwcmVmaXhSZWdleFBhcnQ6IHN0cmluZztcclxuXHJcblx0XHRpZiAocHJlZml4ZXMuaW5jbHVkZXMoJ0AnKSAmJiBwcmVmaXhlcy5pbmNsdWRlcygnIycpKSB7XHJcblx0XHRcdHByZWZpeFJlZ2V4UGFydCA9ICdbI0BdJzsgLy8gXHUwNDE4XHUwNDQ5XHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzMFx1MDQzQSBALCBcdTA0NDJcdTA0MzBcdTA0M0EgXHUwNDM4ICNcclxuXHRcdH0gZWxzZSBpZiAocHJlZml4ZXMuaW5jbHVkZXMoJ0AnKSkge1xyXG5cdFx0XHRwcmVmaXhSZWdleFBhcnQgPSAnQCc7IC8vIFx1MDQxOFx1MDQ0OVx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgQFxyXG5cdFx0fSBlbHNlIGlmIChwcmVmaXhlcy5pbmNsdWRlcygnIycpKSB7XHJcblx0XHRcdHByZWZpeFJlZ2V4UGFydCA9ICcjJzsgLy8gXHUwNDE4XHUwNDQ5XHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSAjXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDM5IFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDM1XHUwNDNGXHUwNDNFXHUwNDM0XHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDRCXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQ0QiwgXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzQyBcdTA0M0RcdTA0MzhcdTA0NDdcdTA0MzVcdTA0MzNcdTA0M0VcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQyMFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzMCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDQxIFx1MDQzNFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQzQ1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0NDRcdTA0MzhcdTA0M0FcdTA0NDFcdTA0M0VcdTA0M0NcclxuXHRcdGNvbnN0IHRlbXBsYXRlUmVnZXggPSBuZXcgUmVnRXhwKGAke3ByZWZpeFJlZ2V4UGFydH1cXFxceyhbXn1dKylcXFxcfWAsICdnJyk7XHJcblx0XHRjb25zdCBtYXRjaGVzID0gcHJvbXB0Q29udGVudC5tYXRjaEFsbCh0ZW1wbGF0ZVJlZ2V4KTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcclxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlTmFtZSA9IG1hdGNoWzFdLnRyaW0oKTtcclxuXHRcdFx0aWYgKHJlZmVyZW5jZU5hbWUgJiYgIXJlZmVyZW5jZXMuaW5jbHVkZXMocmVmZXJlbmNlTmFtZSkpIHtcclxuXHRcdFx0XHRyZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVmZXJlbmNlcztcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MjNcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1XHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMiAoXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDM4XHUwNDQ1LCBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0NDUsIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMikuXHJcbiAqIFx1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgXHUwNDQxIFVVSUQgXHUwNDMyIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBURmlsZSwgbm9ybWFsaXplUGF0aCB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJzsgLy8gXHUwNDFEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QzogbnBtIGluc3RhbGwgdXVpZCBAdHlwZXMvdXVpZFxyXG5cclxuZXhwb3J0IGNsYXNzIENhY2hlTWFuYWdlciB7XHJcbiAgICBwcml2YXRlIHBsdWdpbjogTExNQWdlbnRQbHVnaW47XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKHBsdWdpbjogTExNQWdlbnRQbHVnaW4pIHtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMwXHUwNDMxXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRFXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVGb2xkZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWZDYWNoZUZvbGRlcjtcclxuICAgICAgICBcclxuICAgICAgICAvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSwgXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0NDJcdTA0M0RcdTA0M0VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgdmF1bHRcclxuICAgICAgICBpZiAoIXRoaXMuaXNBYnNvbHV0ZVBhdGgoY2FjaGVGb2xkZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpICsgJy8nICsgY2FjaGVGb2xkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjYWNoZUZvbGRlcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0NDIsIFx1MDQ0Rlx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzQ1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzQWJzb2x1dGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIFdpbmRvd3M6IEM6XFwsIEQ6XFwsIFx1MDQzOCBcdTA0NDIuXHUwNDM0LlxyXG4gICAgICAgIGlmICgvXlthLXpBLVpdOlxcXFwvLnRlc3QocGF0aCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIC8vIFVuaXg6IC9cclxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCcvJykpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDQzIFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRVx1MDQzRFx1MDQzMCBcdTA0M0RcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlQ2FjaGVGb2xkZXJFeGlzdHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXdpbmRvdy5yZXF1aXJlKSByZXR1cm47IC8vIFdlYiBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NEZcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmcyA9IHdpbmRvdy5yZXF1aXJlKCdmcycpLnByb21pc2VzO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhjYWNoZVBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBhd2FpdCBmcy5ta2RpcihjYWNoZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBcdTA0MUFcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzOFx1MDQzNyB2YXVsdFxyXG4gICAgICovXHJcbiAgICBhc3luYyBjYWNoZVZhdWx0RmlsZShmaWxlOiBURmlsZSk6IFByb21pc2U8eyB1dWlkOiBzdHJpbmc7IGNhY2hlZFBhdGg6IHN0cmluZyB9PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVDYWNoZUZvbGRlckV4aXN0cygpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHV1aWQgPSB1dWlkdjQoKTtcclxuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlLmV4dGVuc2lvbjtcclxuICAgICAgICBjb25zdCBjYWNoZWRGaWxlTmFtZSA9IGAke2ZpbGUuYmFzZW5hbWV9LSR7dXVpZH0uJHtleHRlbnNpb259YDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5wbHVnaW4uYXBwLnZhdWx0LnJlYWRCaW5hcnkoZmlsZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXJQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBjb25zdCBjYWNoZWRGaWxlUGF0aCA9IGAke2NhY2hlRm9sZGVyUGF0aH0vJHtjYWNoZWRGaWxlTmFtZX1gO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghd2luZG93LnJlcXVpcmUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcdTA0MUFcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDNEXHUwNDNFIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzIgZGVza3RvcCBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzgnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZnMgPSB3aW5kb3cucmVxdWlyZSgnZnMnKS5wcm9taXNlcztcclxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoY2FjaGVkRmlsZVBhdGgsIEJ1ZmZlci5mcm9tKGNvbnRlbnQpKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB1dWlkOiB1dWlkLFxyXG4gICAgICAgICAgICBjYWNoZWRQYXRoOiBjYWNoZWRGaWxlTmFtZSAvLyBcdTA0MUVcdTA0NDJcdTA0M0RcdTA0M0VcdTA0NDFcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBcdTA0MUFcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDNEXHUwNDM1XHUwNDQ4XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlxyXG4gICAgICovXHJcbiAgICBhc3luYyBjYWNoZUV4dGVybmFsRmlsZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8eyB1dWlkOiBzdHJpbmc7IGNhY2hlZFBhdGg6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBtaW1lVHlwZTogc3RyaW5nIH0+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNhY2hlRm9sZGVyRXhpc3RzKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1x1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0M0RcdTA0M0UgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzMiBkZXNrdG9wIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmcyA9IHdpbmRvdy5yZXF1aXJlKCdmcycpLnByb21pc2VzO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB3aW5kb3cucmVxdWlyZSgncGF0aCcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShhYnNvbHV0ZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShhYnNvbHV0ZVBhdGgpO1xyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlTmFtZSkuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgcGF0aC5leHRuYW1lKGZpbGVOYW1lKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdXVpZCA9IHV1aWR2NCgpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEZpbGVOYW1lID0gYCR7YmFzZU5hbWV9LSR7dXVpZH0uJHtleHRlbnNpb259YDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjYWNoZUZvbGRlclBhdGggPSB0aGlzLmdldENhY2hlRm9sZGVyUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEZpbGVQYXRoID0gYCR7Y2FjaGVGb2xkZXJQYXRofS8ke2NhY2hlZEZpbGVOYW1lfWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGNhY2hlZEZpbGVQYXRoLCBjb250ZW50KTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB1dWlkOiB1dWlkLFxyXG4gICAgICAgICAgICBjYWNoZWRQYXRoOiBjYWNoZWRGaWxlTmFtZSxcclxuICAgICAgICAgICAgbmFtZTogZmlsZU5hbWUsXHJcbiAgICAgICAgICAgIG1pbWVUeXBlOiB0aGlzLmdldE1pbWVUeXBlKGZpbGVOYW1lKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogXHUwNDEyXHUwNDNFXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzNVx1MDQ0OCBcdTA0MzhcdTA0MzcgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZXN0b3JlQ2FjaGUoc291cmNlUGF0aDogc3RyaW5nLCB0eXBlOiAnZmlsZScgfCAncHJvbXB0JyB8ICdleHRlcm5hbCcsIHV1aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdleHRlcm5hbCcpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgc291cmNlUGF0aCAtIFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhY2hlRXh0ZXJuYWxGaWxlKHNvdXJjZVBhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhY2hlZFBhdGg7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZmlsZScpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgc291cmNlUGF0aCAtIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOVxyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChzb3VyY2VQYXRoKTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZVZhdWx0RmlsZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FjaGVkUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG4gICAgICAgICAgICBjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmlzQWJzb2x1dGVQYXRoKHNvdXJjZVBhdGgpIFxyXG4gICAgICAgICAgICAgICAgPyBzb3VyY2VQYXRoIFxyXG4gICAgICAgICAgICAgICAgOiBgJHtwcm9tcHRzRm9sZGVyfS8ke3NvdXJjZVBhdGh9YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZ1bGxQYXRoKTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZVZhdWx0RmlsZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FjaGVkUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDMyXHUwNDNFXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQVx1MDQzNVx1MDQ0OCBcdTA0MzRcdTA0M0JcdTA0NEYgJHtzb3VyY2VQYXRofWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQyN1x1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDM4XHUwNDM3IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZWFkQ2FjaGVkRmlsZShjYWNoZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXJQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2NhY2hlRm9sZGVyUGF0aH0vJHtjYWNoZWRQYXRofWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1x1MDQyN1x1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzAgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDNEXHUwNDNFIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzIgZGVza3RvcCBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzgnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZnMgPSB3aW5kb3cucmVxdWlyZSgnZnMnKS5wcm9taXNlcztcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNhY2hlZEZpbGVFeGlzdHMoY2FjaGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXJQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2NhY2hlRm9sZGVyUGF0aH0vJHtjYWNoZWRQYXRofWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZzID0gd2luZG93LnJlcXVpcmUoJ2ZzJykucHJvbWlzZXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgZ2V0TWltZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZXh0ID0gZmlsZU5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBtaW1lVHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgICAgICAgIHR4dDogJ3RleHQvcGxhaW4nLFxyXG4gICAgICAgICAgICBtZDogJ3RleHQvbWFya2Rvd24nLFxyXG4gICAgICAgICAgICBqc29uOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgIGpzOiAndGV4dC9qYXZhc2NyaXB0JyxcclxuICAgICAgICAgICAgdHM6ICd0ZXh0L3R5cGVzY3JpcHQnLFxyXG4gICAgICAgICAgICBodG1sOiAndGV4dC9odG1sJyxcclxuICAgICAgICAgICAgY3NzOiAndGV4dC9jc3MnLFxyXG4gICAgICAgICAgICBwZGY6ICdhcHBsaWNhdGlvbi9wZGYnLFxyXG4gICAgICAgICAgICBwbmc6ICdpbWFnZS9wbmcnLFxyXG4gICAgICAgICAgICBqcGc6ICdpbWFnZS9qcGVnJyxcclxuICAgICAgICAgICAganBlZzogJ2ltYWdlL2pwZWcnLFxyXG4gICAgICAgICAgICBnaWY6ICdpbWFnZS9naWYnLFxyXG4gICAgICAgICAgICBzdmc6ICdpbWFnZS9zdmcreG1sJyxcclxuICAgICAgICAgICAgd2VicDogJ2ltYWdlL3dlYnAnLFxyXG4gICAgICAgICAgICB4bWw6ICdhcHBsaWNhdGlvbi94bWwnLFxyXG4gICAgICAgICAgICBjc3Y6ICd0ZXh0L2NzdicsXHJcbiAgICAgICAgICAgIHppcDogJ2FwcGxpY2F0aW9uL3ppcCcsXHJcbiAgICAgICAgICAgIHB5OiAndGV4dC94LXB5dGhvbicsXHJcbiAgICAgICAgICAgIGphdmE6ICd0ZXh0L3gtamF2YScsXHJcbiAgICAgICAgICAgIGNwcDogJ3RleHQveC1jKytzcmMnLFxyXG4gICAgICAgICAgICBjOiAndGV4dC94LWNzcmMnLFxyXG4gICAgICAgICAgICBoOiAndGV4dC94LWNoZHInLFxyXG4gICAgICAgICAgICBzaDogJ2FwcGxpY2F0aW9uL3gtc2gnLFxyXG4gICAgICAgICAgICB5YW1sOiAndGV4dC95YW1sJyxcclxuICAgICAgICAgICAgeW1sOiAndGV4dC95YW1sJ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIG1pbWVUeXBlc1tleHQgfHwgJyddIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xyXG4gICAgfVxyXG59IiwgImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmNvbnN0IGJ5dGVUb0hleCA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAgIHJldHVybiAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgdXVpZCA9IHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCk7XG4gICAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZDtcbn1cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTtcbiIsICJsZXQgZ2V0UmFuZG9tVmFsdWVzO1xuY29uc3Qgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gICAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gPT09ICd1bmRlZmluZWQnIHx8ICFjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZG9tVmFsdWVzID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG4gICAgfVxuICAgIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufVxuIiwgImNvbnN0IHJhbmRvbVVVSUQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCAmJiBjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byk7XG5leHBvcnQgZGVmYXVsdCB7IHJhbmRvbVVVSUQgfTtcbiIsICJpbXBvcnQgbmF0aXZlIGZyb20gJy4vbmF0aXZlLmpzJztcbmltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHsgdW5zYWZlU3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZnVuY3Rpb24gX3Y0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tID8/IG9wdGlvbnMucm5nPy4oKSA/PyBybmcoKTtcbiAgICBpZiAocm5kcy5sZW5ndGggPCAxNikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhbmRvbSBieXRlcyBsZW5ndGggbXVzdCBiZSA+PSAxNicpO1xuICAgIH1cbiAgICBybmRzWzZdID0gKHJuZHNbNl0gJiAweDBmKSB8IDB4NDA7XG4gICAgcm5kc1s4XSA9IChybmRzWzhdICYgMHgzZikgfCAweDgwO1xuICAgIGlmIChidWYpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDE2ID4gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVVSUQgYnl0ZSByYW5nZSAke29mZnNldH06JHtvZmZzZXQgKyAxNX0gaXMgb3V0IG9mIGJ1ZmZlciBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuIHVuc2FmZVN0cmluZ2lmeShybmRzKTtcbn1cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKG5hdGl2ZS5yYW5kb21VVUlEICYmICFidWYgJiYgIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZS5yYW5kb21VVUlEKCk7XG4gICAgfVxuICAgIHJldHVybiBfdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpO1xufVxuZXhwb3J0IGRlZmF1bHQgdjQ7XG4iLCAiLyoqXHJcbiAqIFx1MDQxNFx1MDQzMlx1MDQzOFx1MDQzNlx1MDQzRVx1MDQzQSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDQxIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOCBAey4uLn0uXHJcbiAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0QgXHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDRDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzggXHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBSZWZlcmVuY2VQYXJzZXIgfSBmcm9tICcuL1JlZmVyZW5jZVBhcnNlcic7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZW1wbGF0ZSBFbmdpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVFbmdpbmUge1xyXG5cdHByaXZhdGUgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHJcblx0Y29uc3RydWN0b3IocGx1Z2luOiBMTE1BZ2VudFBsdWdpbikge1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzRVx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIsIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQ0RiBAey4uLn0gXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4LlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQyXHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0N1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NEUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0Nlx1MDQzOFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzBcdTA0NDUuXHJcblx0ICogQHBhcmFtIHByb21wdENvbnRlbnQgLSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0ICogQHBhcmFtIGV4cGFuZGVkUmVmZXJlbmNlcyAtIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzOFx1MDQzOSBTZXQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQ0Nlx1MDQzNVx1MDQzRlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzhcclxuXHQgKiBAcmV0dXJucyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHJcblx0ICovXHJcblx0YXN5bmMgZXhwYW5kUHJvbXB0VGVtcGxhdGUocHJvbXB0Q29udGVudDogc3RyaW5nLCBleHBhbmRlZFJlZmVyZW5jZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IEB7Li4ufVxyXG5cdFx0Y29uc3QgdGVtcGxhdGVSZWZlcmVuY2VzID0gUmVmZXJlbmNlUGFyc2VyLmV4dHJhY3RUZW1wbGF0ZVJlZmVyZW5jZXMocHJvbXB0Q29udGVudCwgWydAJywgJyMnXSk7XHJcblxyXG5cdFx0aWYgKHRlbXBsYXRlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIHByb21wdENvbnRlbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzQlx1MDQzOFx1MDQ0OVx1MDQzNSBPYnNpZGlhbiBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0QgXHUwNDQwXHUwNDMwXHUwNDM3IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0MzkgXHUwNDQ2XHUwNDM1XHUwNDNGXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4IFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOFxyXG5cdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0MzFcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzRVx1MDQzMiB2YXVsdC5nZXRGaWxlcygpXHJcblx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRGaWxlcygpO1xyXG5cclxuXHRcdGxldCBleHBhbmRlZENvbnRlbnQgPSBwcm9tcHRDb250ZW50O1xyXG5cclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDQzIFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdFx0Zm9yIChjb25zdCByZWZlcmVuY2VOYW1lIG9mIHRlbXBsYXRlUmVmZXJlbmNlcykge1xyXG5cdFx0XHRpZiAoZXhwYW5kZWRSZWZlcmVuY2VzLmhhcyhyZWZlcmVuY2VOYW1lKSkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihcclxuXHRcdFx0XHRcdGBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzAgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFwiJHtyZWZlcmVuY2VOYW1lfVwiLiBcdTA0MThcdTA0MzNcdTA0M0RcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDdcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4LmBcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGNvbnRpbnVlOyAvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQ0M1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQ0MyBcdTA0MzIgU2V0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDNFXHUwNDMyXHJcblx0XHRcdGV4cGFuZGVkUmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlTmFtZSk7XHJcblxyXG5cdFx0XHRjb25zdCByZWZlcmVuY2VkQ29udGVudCA9IGF3YWl0IHRoaXMubG9hZFByb21wdENvbnRlbnQocmVmZXJlbmNlTmFtZSwgYWxsRmlsZXMpO1xyXG5cdFx0XHRpZiAocmVmZXJlbmNlZENvbnRlbnQgIT09IG51bGwpIHtcclxuXHRcdFx0XHQvLyBcdTA0MjBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDNFXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0XHRcdFx0Y29uc3QgZXhwYW5kZWROZXN0ZWRDb250ZW50ID0gYXdhaXQgdGhpcy5leHBhbmRQcm9tcHRUZW1wbGF0ZShyZWZlcmVuY2VkQ29udGVudCwgZXhwYW5kZWRSZWZlcmVuY2VzKTtcclxuXHJcblx0XHRcdFx0Ly8gXHUwNDE3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0MzJcdTA0NDVcdTA0M0VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgQHtyZWZlcmVuY2VOYW1lfSBcdTA0MzhcdTA0M0JcdTA0MzggI3tyZWZlcmVuY2VOYW1lfSBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1XHJcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgWyNAXT9cXFxceyR7dGhpcy5lc2NhcGVSZWdFeHAocmVmZXJlbmNlTmFtZSl9XFxcXH1gLCAnZycpO1xyXG5cdFx0XHRcdGV4cGFuZGVkQ29udGVudCA9IGV4cGFuZGVkQ29udGVudC5yZXBsYWNlKHRlbXBsYXRlUGF0dGVybiwgZXhwYW5kZWROZXN0ZWRDb250ZW50KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QsIFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0Q1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihgXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFwiJHtyZWZlcmVuY2VOYW1lfVwiIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QuYCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDQzIFx1MDQzOFx1MDQzNyBTZXQgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzNVx1MDQ1MSBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzgsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDQ4XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzQyBcdTA0MzJcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzBcdTA0M0MgXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4XHJcblx0XHRcdGV4cGFuZGVkUmVmZXJlbmNlcy5kZWxldGUocmVmZXJlbmNlTmFtZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4cGFuZGVkQ29udGVudDtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBwcm9tcHROYW1lIC0gXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDNCXHUwNDM4IG51bGwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0RcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIGxvYWRQcm9tcHRDb250ZW50KHByb21wdE5hbWU6IHN0cmluZywgYWxsRmlsZXM6IFRGaWxlW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuXHRcdGNvbnN0IHByb21wdEZpbGUgPSB0aGlzLmZpbmRQcm9tcHRGaWxlKHByb21wdE5hbWUsIGFsbEZpbGVzKTtcclxuXHJcblx0XHRpZiAoIXByb21wdEZpbGUpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLmFwcC52YXVsdC5yZWFkKHByb21wdEZpbGUpO1xyXG5cdFx0XHRyZXR1cm4gY29udGVudC50cmltKCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCBcIiR7cHJvbXB0TmFtZX1cIjpgLCBlcnJvcik7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBwcm9tcHROYW1lIC0gXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDNCXHUwNDM4IG51bGxcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRQcm9tcHRGaWxlKHByb21wdE5hbWU6IHN0cmluZywgYWxsRmlsZXM6IFRGaWxlW10pOiBURmlsZSB8IG51bGwge1xyXG5cdFx0Lypjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuXHRcdGlmICghcHJvbXB0c0ZvbGRlcikge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyLCBcdTA0NDNcdTA0MzFcdTA0MzhcdTA0NDBcdTA0MzBcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1L1x1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0NDhcdTA0MzhcclxuXHRcdGNvbnN0IG5vcm1hbGl6ZWRQcm9tcHRzUGF0aCA9IHByb21wdHNGb2xkZXIucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpOyovXHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDQ5XHUwNDM1XHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM5IFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzIgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMiAoXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzNVx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzBcdTA0NDUpLCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgTWFya2Rvd24tXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDNDXHJcblx0XHQvLyBcdTA0MzggXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQ0RiAoXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RikgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNGXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MSBwcm9tcHROYW1lXHJcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgYWxsRmlsZXMpIHtcclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBNYXJrZG93biBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0M0VcdTA0M0QgXHUwNDMyIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgKFx1MDQzMVx1MDQzNVx1MDQzNyBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYpIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0NcdTA0NEJcdTA0M0MgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRTogZmlsZS5wYXRoLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByb21wdHNQYXRofS9gXHJcblx0XHRcdGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJyAmJiBmaWxlLmJhc2VuYW1lID09PSBwcm9tcHROYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZpbGU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyRFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHBhcmFtIHN0cmluZyAtIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHJldHVybnMgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4IFx1MDQ0M1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzMiBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzUuXHJcbiAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0JcdTA0MzhcdTA0NDdcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIvXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDBcdTA0M0RcdTA0NEJcdTA0NDUvXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBGaWxlUmVmZXJlbmNlIH0gZnJvbSAnLi9SZWZlcmVuY2VQYXJzZXInO1xyXG5pbXBvcnQgeyBzZXRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIEJveCBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQm94IHtcclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NTFcdTA0NDIgXHUwNDMyXHUwNDM4XHUwNDM3XHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4XHJcblx0ICogQHBhcmFtIHJlZmVyZW5jZSAtIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0UgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1XHJcblx0ICogQHJldHVybnMgSFRNTCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICovXHJcblx0c3RhdGljIGNyZWF0ZUJveChyZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcblx0XHRib3guY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJzsgLy8gXHUwNDE0XHUwNDFFXHUwNDExXHUwNDEwXHUwNDEyXHUwNDFCXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MTRcdTA0MzVcdTA0M0JcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxIFx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQzQ1xyXG5cdFx0Ym94LmNsYXNzTmFtZSA9IHRoaXMuZ2V0Qm94Q2xhc3NlcyhyZWZlcmVuY2UpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScsIHJlZmVyZW5jZS50eXBlKTtcclxuXHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLW5hbWUnLCByZWZlcmVuY2UubmFtZSk7XHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1wYXRoJywgcmVmZXJlbmNlLnBhdGgpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JywgcmVmZXJlbmNlLnBlcm1hbmVudC50b1N0cmluZygpKTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBVVUlELCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDXHJcblx0XHRpZiAocmVmZXJlbmNlLnV1aWQpIHtcclxuXHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdXVpZCcsIHJlZmVyZW5jZS51dWlkKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQzXHJcblx0XHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0aWNvbi5jbGFzc05hbWUgPSAncmVmZXJlbmNlLWJveC1pY29uJztcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEIgXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFIHNldEljb24gXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMVx1MDQzRVx1MDQzQlx1MDQzNVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0XHRpY29uLnRleHRDb250ZW50ID0gdGhpcy5nZXRJY29uU3ltYm9sKHJlZmVyZW5jZSk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNDXHJcblx0XHRjb25zdCBuYW1lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdG5hbWVTcGFuLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2UtYm94LW5hbWUnO1xyXG5cdFx0bmFtZVNwYW4udGV4dENvbnRlbnQgPSByZWZlcmVuY2UubmFtZTtcclxuXHJcblx0XHRib3guYXBwZW5kQ2hpbGQoaWNvbik7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQobmFtZVNwYW4pO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0NcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzAgKFRPRE86IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzMFx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMpXHJcblx0XHRib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdC8vIFRPRE86IFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0NcdTA0M0VcdTA0NDJcdTA0NDAgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG5cdFx0XHRjb25zb2xlLmxvZygnQ2xpY2tlZCByZWZlcmVuY2U6JywgcmVmZXJlbmNlKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBib3g7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVxyXG5cdCAqIEBwYXJhbSBib3hFbGVtZW50IC0gXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzMFxyXG5cdCAqIEBwYXJhbSByZWZlcmVuY2UgLSBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzVcclxuXHQgKi9cclxuXHRzdGF0aWMgdXBkYXRlQm94KGJveEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiB2b2lkIHtcclxuXHRcdGJveEVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5nZXRCb3hDbGFzc2VzKHJlZmVyZW5jZSk7XHJcblx0XHRib3hFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScsIHJlZmVyZW5jZS50eXBlKTtcclxuXHRcdGJveEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1uYW1lJywgcmVmZXJlbmNlLm5hbWUpO1xyXG5cdFx0Ym94RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLXBhdGgnLCByZWZlcmVuY2UucGF0aCk7XHJcblx0XHRib3hFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JywgcmVmZXJlbmNlLnBlcm1hbmVudC50b1N0cmluZygpKTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBVVUlELCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDXHJcblx0XHRpZiAocmVmZXJlbmNlLnV1aWQpIHtcclxuXHRcdFx0Ym94RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLXV1aWQnLCByZWZlcmVuY2UudXVpZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaWNvbkVsZW1lbnQgPSBib3hFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWZlcmVuY2UtYm94LWljb24nKTtcclxuXHRcdGNvbnN0IG5hbWVFbGVtZW50ID0gYm94RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucmVmZXJlbmNlLWJveC1uYW1lJyk7XHJcblxyXG5cdFx0aWYgKGljb25FbGVtZW50KSB7XHJcblx0XHRcdC8vIFx1MDQxOFx1MDQxN1x1MDQxQ1x1MDQxNVx1MDQxRFx1MDQxNVx1MDQxRFx1MDQxRTogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0Ugc2V0SWNvblxyXG5cdFx0XHRpY29uRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0SWNvblN5bWJvbChyZWZlcmVuY2UpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChuYW1lRWxlbWVudCkge1xyXG5cdFx0XHRuYW1lRWxlbWVudC50ZXh0Q29udGVudCA9IHJlZmVyZW5jZS5uYW1lO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0UgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICogQHBhcmFtIGJveEVsZW1lbnQgLSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzVcclxuXHQgKi9cclxuXHRzdGF0aWMgZXh0cmFjdFJlZmVyZW5jZShib3hFbGVtZW50OiBIVE1MRWxlbWVudCk6IEZpbGVSZWZlcmVuY2UgfCBudWxsIHtcclxuXHRcdGNvbnN0IHR5cGUgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScpIGFzICdmaWxlJyB8ICdwcm9tcHQnIHwgJ2V4dGVybmFsJztcclxuXHRcdGNvbnN0IG5hbWUgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtbmFtZScpO1xyXG5cdFx0Y29uc3QgcGF0aCA9IGJveEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1wYXRoJyk7XHJcblx0XHRjb25zdCBwZXJtYW5lbnQgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JykgPT09ICd0cnVlJztcclxuXHRcdGNvbnN0IHV1aWQgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdXVpZCcpO1xyXG5cclxuXHRcdGlmICghdHlwZSB8fCAhbmFtZSB8fCAhcGF0aCkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRwYXRoLFxyXG5cdFx0XHRwZXJtYW5lbnQsXHJcblx0XHRcdHV1aWQ6IHV1aWQgfHwgdW5kZWZpbmVkXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgQ1NTIFx1MDQzQVx1MDQzQlx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Qm94Q2xhc3NlcyhyZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiBzdHJpbmcge1xyXG5cdFx0Y29uc3QgYmFzZUNsYXNzID0gJ3JlZmVyZW5jZS1ib3gnO1xyXG5cdFx0Y29uc3QgdHlwZUNsYXNzID0gcmVmZXJlbmNlLnR5cGU7XHJcblx0XHRjb25zdCBwZXJtYW5lbnRDbGFzcyA9IHJlZmVyZW5jZS5wZXJtYW5lbnQgPyAncGVybWFuZW50JyA6ICdzaW5nbGUnO1xyXG5cclxuXHRcdHJldHVybiBgJHtiYXNlQ2xhc3N9ICR7dHlwZUNsYXNzfSAke3Blcm1hbmVudENsYXNzfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4XHJcblx0ICogXHUwNDE4XHUwNDE3XHUwNDFDXHUwNDE1XHUwNDFEXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MjJcdTA0MzVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0NEMgXHUwNDMyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzRVx1MDQzQSBPYnNpZGlhblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldEljb25TeW1ib2wocmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlKTogc3RyaW5nIHtcclxuXHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0cmV0dXJuICdcdTI2QTEnOyAvLyBcdTA0MUNcdTA0M0VcdTA0M0JcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ2V4dGVybmFsJykge1xyXG5cdFx0XHRyZXR1cm4gJ1x1RDgzRFx1RENDRSc7IC8vIFx1MDQxN1x1MDQzRFx1MDQzMFx1MDQzQSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0M0JcdTA0MzBcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOFx1MDQzNyB2YXVsdCBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgQFxyXG5cdFx0cmV0dXJuICdcdUQ4M0RcdURDQzQnO1xyXG5cdH1cclxufVxyXG4iLCAiLypcclxuICogXHUwNDIzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQyBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0M0VcdTA0M0MgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLCBcdTA0MzJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0NEYgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSxcclxuICogXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDM3XHUwNDMwXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRGIFx1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0MuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ2hhdEhpc3RvcnlJdGVtLCBBdHRhY2htZW50IH0gZnJvbSAnLi9tb2RlbHMvQ2hhdEhpc3RvcnlJdGVtJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlTWFuYWdlciB9IGZyb20gJy4uL3JlZmVyZW5jZXMvQXV0b2NvbXBsZXRlTWFuYWdlcic7XHJcbmltcG9ydCB7IFJlZmVyZW5jZUF1dG9jb21wbGV0ZSB9IGZyb20gJy4uL3JlZmVyZW5jZXMvUmVmZXJlbmNlQXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlRXhwYW5kZXIgfSBmcm9tICcuLi9yZWZlcmVuY2VzL1JlZmVyZW5jZUV4cGFuZGVyJztcclxuaW1wb3J0IHsgVGVtcGxhdGVFbmdpbmUgfSBmcm9tICcuLi9yZWZlcmVuY2VzL1RlbXBsYXRlRW5naW5lJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlUGFyc2VyLCBGaWxlUmVmZXJlbmNlLCBSZWZlcmVuY2VNYXRjaCB9IGZyb20gJy4uL3JlZmVyZW5jZXMvUmVmZXJlbmNlUGFyc2VyJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlQm94IH0gZnJvbSAnLi4vcmVmZXJlbmNlcy9SZWZlcmVuY2VCb3gnO1xyXG5pbXBvcnQgeyBBdXRvY29tcGxldGVJdGVtIH0gZnJvbSAnLi4vcmVmZXJlbmNlcy9BdXRvY29tcGxldGVNYW5hZ2VyJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBNYXJrZG93blJlbmRlcmVyLCBzZXRJY29uLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICdzcmMvdXRpbHMvRGlhbG9nJztcclxuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnc3JjL3JlZmVyZW5jZXMvQ2FjaGVNYW5hZ2VyJztcclxuXHJcbmludGVyZmFjZSBDaGF0UGFuZWxQcm9wcyB7XHJcblx0Y2hhdEhpc3Rvcnk6IENoYXRIaXN0b3J5SXRlbVtdO1xyXG5cdG9uU2VuZE1lc3NhZ2U6IChtZXNzYWdlOiBzdHJpbmcsIHNlbGVjdGVkTW9kZWw/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudFtdKSA9PiB2b2lkO1xyXG5cdGF2YWlsYWJsZU1vZGVscz86IHN0cmluZ1tdO1xyXG5cdHNlbGVjdGVkTW9kZWw/OiBzdHJpbmc7XHJcblx0cGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHRjdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaGF0UGFuZWwge1xyXG5cdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcblx0cHJvcHM6IENoYXRQYW5lbFByb3BzO1xyXG5cdGNoYXRIaXN0b3J5OiBDaGF0SGlzdG9yeUl0ZW1bXTtcclxuXHRtZXNzYWdlSW5wdXQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cdHNlbmRCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdHN1Z2dlc3Rpb25zQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRtb2RlbFNlbGVjdEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0bW9kZWxEcm9wZG93bjogSFRNTERpdkVsZW1lbnQ7XHJcblx0c2VsZWN0ZWRNb2RlbDogc3RyaW5nO1xyXG5cdGN1c3RvbVByb21wdEluZGljYXRvcjogSFRNTFNwYW5FbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0Y3VycmVudFN0cmVhbWluZ05vZGVJZDogc3RyaW5nIHwgbnVsbDtcclxuXHRzdG9wQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHJcblx0Ly8gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XHJcblx0YXR0YWNoRmlsZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0ZmlsZUlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cdGF0dGFjaGVkRmlsZXNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xyXG5cdGN1cnJlbnRBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBTeXN0ZW0gRmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGNhY2hlTWFuYWdlcjogQ2FjaGVNYW5hZ2VyO1xyXG5cclxuXHRwcml2YXRlIGF1dG9jb21wbGV0ZU1hbmFnZXI6IEF1dG9jb21wbGV0ZU1hbmFnZXI7XHJcblx0cHJpdmF0ZSByZWZlcmVuY2VBdXRvY29tcGxldGU6IFJlZmVyZW5jZUF1dG9jb21wbGV0ZTtcclxuXHRwcml2YXRlIHJlZmVyZW5jZUV4cGFuZGVyOiBSZWZlcmVuY2VFeHBhbmRlcjtcclxuXHRwcml2YXRlIHRlbXBsYXRlRW5naW5lOiBUZW1wbGF0ZUVuZ2luZTtcclxuXHRwcml2YXRlIGN1cnJlbnRSZWZlcmVuY2VzOiBGaWxlUmVmZXJlbmNlW10gPSBbXTtcclxuXHRwcml2YXRlIGlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcm9wczogQ2hhdFBhbmVsUHJvcHMpIHtcclxuXHRcdHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cdFx0dGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cdFx0dGhpcy5jaGF0SGlzdG9yeSA9IHByb3BzLmNoYXRIaXN0b3J5IHx8IFtdO1xyXG5cdFx0dGhpcy5zZWxlY3RlZE1vZGVsID0gcHJvcHMuc2VsZWN0ZWRNb2RlbCB8fCAnZ2VtaW5pLTIuNS1mbGFzaCc7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0QiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZVN5c3RlbSgpO1xyXG5cclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlUGxhY2Vob2xkZXIoKTogdm9pZCB7XHJcblx0XHRjb25zdCBpc0VtcHR5ID0gdGhpcy5tZXNzYWdlSW5wdXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJyc7XHJcblx0XHRjb25zdCBpc0ZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm1lc3NhZ2VJbnB1dDtcclxuXHJcblx0XHRpZiAoaXNFbXB0eSAmJiAhaXNGb2N1c2VkKSB7XHJcblx0XHRcdHRoaXMubWVzc2FnZUlucHV0LmNsYXNzTGlzdC5hZGQoJ2lzLWVtcHR5Jyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1lbXB0eScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dG9nZ2xlTW9kZWxEcm9wZG93bigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snO1xyXG5cdFx0aWYgKGlzVmlzaWJsZSkge1xyXG5cdFx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQ0QiBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG5cdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5tb2RlbFNlbGVjdEJ1dHRvbi5jbG9zZXN0KCcuY2hhdC1pbnB1dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcblx0XHRjb25zdCBtb2RlbFNlbGVjdEJ1dHRvblJlY3QgPSB0aGlzLm1vZGVsU2VsZWN0QnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gXHUwNDFFXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0QiBcdTA0NDdcdTA0MzBcdTA0NDItXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4XHJcblx0XHRjb25zdCBkcm9wZG93blJlY3QgPSB0aGlzLm1vZGVsRHJvcGRvd24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBjaGF0UGFuZWxcclxuXHRcdC8vIFx1MDQxQlx1MDQzNVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0M0FcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDEgXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDRCXHUwNDNDIFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFxyXG5cdFx0bGV0IGxlZnQgPSBtb2RlbFNlbGVjdEJ1dHRvblJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCAtIDU7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDM1XHUwNDQ0XHUwNDNFXHUwNDNCXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSAtIFx1MDQzRlx1MDQzRVx1MDQzNCBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0M0VcdTA0MzlcclxuXHRcdGxldCB0b3AgPSBtb2RlbFNlbGVjdEJ1dHRvblJlY3QuaGVpZ2h0O1xyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDNGXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBkcm9wZG93biBcdTA0NDFcdTA0M0RcdTA0MzhcdTA0MzdcdTA0NDNcclxuXHRcdGNvbnN0IHNwYWNlQmVsb3cgPSB2aWV3cG9ydEhlaWdodCAtIG1vZGVsU2VsZWN0QnV0dG9uUmVjdC5ib3R0b207XHJcblx0XHRjb25zdCBzcGFjZUFib3ZlID0gbW9kZWxTZWxlY3RCdXR0b25SZWN0LnRvcDtcclxuXHJcblx0XHRpZiAoc3BhY2VCZWxvdyA8IGRyb3Bkb3duUmVjdC5oZWlnaHQgKyAxMCAmJiBzcGFjZUFib3ZlID4gZHJvcGRvd25SZWN0LmhlaWdodCArIDEwKSB7XHJcblx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0M0RcdTA0MzhcdTA0MzdcdTA0NDMgXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDNFIFx1MDQzQ1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMCBcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1XHUwNDQzIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQzRSwgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0M1xyXG5cdFx0XHR0b3AgPSAtZHJvcGRvd25SZWN0LmhlaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzBcclxuXHRcdGNvbnN0IG1heFJpZ2h0ID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGNvbnRhaW5lclJlY3QubGVmdDtcclxuXHRcdGlmIChsZWZ0ICsgZHJvcGRvd25SZWN0LndpZHRoID4gbWF4UmlnaHQpIHtcclxuXHRcdFx0bGVmdCA9IG1heFJpZ2h0IC0gZHJvcGRvd25SZWN0LndpZHRoIC0gNTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzJcdTA0MzBcclxuXHRcdGlmIChsZWZ0IDwgMCkge1xyXG5cdFx0XHRsZWZ0ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcclxuXHRcdHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUucmlnaHQgPSAnYXV0byc7IC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MSByaWdodCwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIGxlZnQgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDNCIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzRFx1MDQzRVxyXG5cclxuXHRcdC8vIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0NcdTA0MzhcdTA0M0RcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NDNcdTA0NEUgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDQzIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRFx1MDQzMCwgXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzNSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzhcclxuXHRcdGxldCBtaW5XaWR0aCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3Qud2lkdGggLyAyLCBkcm9wZG93blJlY3Qud2lkdGgpO1xyXG5cdFx0dGhpcy5tb2RlbERyb3Bkb3duLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG5cdFx0dGhpcy5tb2RlbERyb3Bkb3duLnN0eWxlLndpZHRoID0gJ2F1dG8nOyAvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDQzIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDMsIFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRDXHUwNDQ4XHUwNDM1IG1pbldpZHRoXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNb2RlbERyb3Bkb3duKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnByb3BzLmF2YWlsYWJsZU1vZGVscykgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMubW9kZWxEcm9wZG93bi5pbm5lckhUTUwgPSB0aGlzLnByb3BzLmF2YWlsYWJsZU1vZGVsc1xyXG5cdFx0XHQubWFwKFxyXG5cdFx0XHRcdChtb2RlbCkgPT4gYFxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RlbC1vcHRpb25cIiBkYXRhLW1vZGVsPVwiJHttb2RlbH1cIj5cclxuXHRcdFx0XHRcdCR7bW9kZWx9XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdGBcclxuXHRcdFx0KVxyXG5cdFx0XHQuam9pbignJyk7XHJcblxyXG5cdFx0Ly8gQWRkIGV2ZW50IGxpc3RlbmVycyB0byBtb2RlbCBvcHRpb25zXHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24ucXVlcnlTZWxlY3RvckFsbCgnLm1vZGVsLW9wdGlvbicpLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG5cdFx0XHRvcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0Lm1vZGVsO1xyXG5cdFx0XHRcdGlmIChtb2RlbCkge1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRTZWxlY3RlZE1vZGVsKG1vZGVsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZXRTZWxlY3RlZE1vZGVsKG1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRNb2RlbCA9IG1vZGVsO1xyXG5cdFx0Y29uc3QgbW9kZWxOYW1lRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNzZWxlY3RlZC1tb2RlbC1uYW1lJyk7XHJcblx0XHRpZiAobW9kZWxOYW1lRWxlbWVudCkge1xyXG5cdFx0XHRtb2RlbE5hbWVFbGVtZW50LnRleHRDb250ZW50ID0gbW9kZWw7XHJcblx0XHR9XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHR9XHJcblxyXG5cdGhhbmRsZUlucHV0KCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLm1lc3NhZ2VJbnB1dC50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdGNvbnN0IGNvbW1hbmRzID0gWycvaGVscCcsICcvaW1hZ2luZScsICcvYW5hbHl6ZScsICcvc3VidGl0bGVzX21lZXQnLCAnL3N1YnRpdGxlc190ZWFtcycsICcvc3VtbWFyaXplJywgJy9jaGF0J107XHJcblxyXG5cdFx0aWYgKHZhbHVlLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG5cdFx0XHRjb25zdCBmaWx0ZXJlZENvbW1hbmRzID0gY29tbWFuZHMuZmlsdGVyKChjbWQpID0+IGNtZC5zdGFydHNXaXRoKHZhbHVlLnRvTG93ZXJDYXNlKCkpKTtcclxuXHRcdFx0dGhpcy5zaG93U3VnZ2VzdGlvbnMoZmlsdGVyZWRDb21tYW5kcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2hvd1N1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSk6IHZvaWQge1xyXG5cdFx0aWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5pbm5lckhUTUwgPSBzdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IGA8ZGl2IGNsYXNzPVwic3VnZ2VzdGlvbi1pdGVtXCI+JHtzdWdnZXN0aW9ufTwvZGl2PmApLmpvaW4oJycpO1xyXG5cclxuXHRcdHRoaXMuc3VnZ2VzdGlvbnNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzOCBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0M0VcdTA0MzIgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0dGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc3VnZ2VzdGlvbi1pdGVtJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMubWVzc2FnZUlucHV0LnRleHRDb250ZW50ID0gaXRlbS50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0XHRcdHRoaXMubWVzc2FnZUlucHV0LmZvY3VzKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRoaWRlU3VnZ2VzdGlvbnMoKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyByZW5kZXJIaXN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgaGlzdG9yeUNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNjaGF0LWhpc3RvcnknKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGhpc3RvcnlDb250YWluZXIuZW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmNoYXRIaXN0b3J5KSB7XHJcblx0XHRcdGNvbnN0IG1lc3NhZ2VFbCA9IGhpc3RvcnlDb250YWluZXIuY3JlYXRlRGl2KHtcclxuXHRcdFx0XHRjbHM6IGBtZXNzYWdlICR7bXNnLnJvbGV9IG1lc3NhZ2UtdHlwZS0ke21zZy50eXBlIHx8ICdkZWZhdWx0J30gZ3JvdXAvdHVybi1tZXNzYWdlc2BcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUNcdTA0MzVcdTA0NDJcdTA0MzBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEZcclxuXHRcdFx0Y29uc3QgbWV0YURpdiA9IG1lc3NhZ2VFbC5jcmVhdGVEaXYoeyBjbHM6ICdjaGF0LW1ldGEnIH0pO1xyXG5cdFx0XHRjb25zdCBzZW5kZXJJbmZvRGl2ID0gbWV0YURpdi5jcmVhdGVEaXYoeyBjbHM6ICdjaGF0LXNlbmRlci1pbmZvJyB9KTtcclxuXHRcdFx0Y29uc3QgaWNvbkRpdiA9IHNlbmRlckluZm9EaXYuY3JlYXRlRGl2KHsgY2xzOiAnY2hhdC1tZXNzYWdlLWljb24nIH0pO1xyXG5cdFx0XHRpY29uRGl2LmlubmVySFRNTCA9XHJcblx0XHRcdFx0bXNnLnJvbGUgPT09ICd1c2VyJ1xyXG5cdFx0XHRcdFx0PyBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS11c2VyXCI+PHBhdGggZD1cIk0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyXCI+PC9wYXRoPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCI0XCI+PC9jaXJjbGU+PC9zdmc+YFxyXG5cdFx0XHRcdFx0OiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS1ib3RcIj48cGF0aCBkPVwiTTEyIDhWNEg4XCI+PC9wYXRoPjxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxMlwiIHg9XCI0XCIgeT1cIjhcIiByeD1cIjJcIj48L3JlY3Q+PHBhdGggZD1cIk0yIDE0aDJcIj48L3BhdGg+PHBhdGggZD1cIk0yMCAxNGgyXCI+PC9wYXRoPjxwYXRoIGQ9XCJNMTUgMTN2MlwiPjwvcGF0aD48cGF0aCBkPVwiTTkgMTN2MlwiPjwvcGF0aD48L3N2Zz5gO1xyXG5cdFx0XHRzZW5kZXJJbmZvRGl2LmNyZWF0ZVNwYW4oeyBjbHM6ICdjaGF0LXJvbGUtbGFiZWwnLCB0ZXh0OiB0aGlzLmdldFJvbGVMYWJlbChtc2cucm9sZSkgfSk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcdTA0NEJcclxuXHRcdFx0aWYgKG1zZy5hdHRhY2htZW50cyAmJiBtc2cuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRzQ29udGFpbmVyID0gbWVzc2FnZUVsLmNyZWF0ZURpdih7IGNsczogJ21lc3NhZ2UtYXR0YWNobWVudHMnIH0pO1xyXG5cclxuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgbXNnLmF0dGFjaG1lbnRzKSB7XHJcblx0XHRcdFx0XHRjb25zdCBib3ggPSB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRCb3goYXR0YWNobWVudCk7XHJcblx0XHRcdFx0XHRhdHRhY2htZW50c0NvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRjb25zdCBjb250ZW50RGl2ID0gbWVzc2FnZUVsLmNyZWF0ZURpdih7IGNsczogJ2NoYXQtbWVzc2FnZS1jb250ZW50JyB9KTtcclxuXHRcdFx0YXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihtc2cuY29udGVudCwgY29udGVudERpdiwgJycsIHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHJcblx0XHRcdHRoaXMuY3JlYXRlTWVzc2FnZVRvb2xzZXQobWVzc2FnZUVsLCBtc2cuY29udGVudCwgbXNnLm5vZGVfaWQsIG1zZy5ncmFwaF9pZCB8fCAnJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDNBXHUwNDMwXHJcblx0XHRpZiAodGhpcy5jaGF0SGlzdG9yeS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmNsb3Nlc3QoJy52aWV3LWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0XHRpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbEhlaWdodDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDEgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOC5cclxuXHQgKi9cclxuXHRwcml2YXRlIGNyZWF0ZUF0dGFjaG1lbnRCb3goYXR0YWNobWVudDogQXR0YWNobWVudCk6IEhUTUxFbGVtZW50IHtcclxuXHRcdGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDRCIFx1MDQzMiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M0NcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDNFXHUwNDQyIFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQzMCBcdTA0MzggcGVybWFuZW50XHJcblx0XHRjb25zdCBwZXJtYW5lbnRDbGFzcyA9IGF0dGFjaG1lbnQucGVybWFuZW50ID8gJ3Blcm1hbmVudCcgOiAnc2luZ2xlJztcclxuXHRcdGJveC5jbGFzc05hbWUgPSBgcmVmZXJlbmNlLWJveCBhdHRhY2htZW50LWJveCAke2F0dGFjaG1lbnQudHlwZX0gJHtwZXJtYW5lbnRDbGFzc30gY2xpY2thYmxlYDtcclxuXHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnLCBhdHRhY2htZW50LnR5cGUpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJywgYXR0YWNobWVudC5uYW1lKTtcclxuXHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc291cmNlLXBhdGgnLCBhdHRhY2htZW50LnNvdXJjZVBhdGgpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1jYWNoZWQtcGF0aCcsIGF0dGFjaG1lbnQuY2FjaGVkUGF0aCk7XHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXV1aWQnLCBhdHRhY2htZW50LnV1aWQpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1wZXJtYW5lbnQnLCBTdHJpbmcoYXR0YWNobWVudC5wZXJtYW5lbnQpKTtcclxuXHJcblx0XHRib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuaGFuZGxlQXR0YWNobWVudENsaWNrKGF0dGFjaG1lbnQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Y29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdGljb24uY2xhc3NOYW1lID0gJ3JlZmVyZW5jZS1pY29uJztcclxuXHJcblx0XHRpZiAoYXR0YWNobWVudC50eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1MjZBMSc7XHJcblx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2V4dGVybmFsJykge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDRSc7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNCc7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdG5hbWUuY2xhc3NOYW1lID0gJ3JlZmVyZW5jZS1uYW1lJztcclxuXHRcdG5hbWUudGV4dENvbnRlbnQgPSBhdHRhY2htZW50Lm5hbWU7XHJcblxyXG5cdFx0Ym94LmFwcGVuZENoaWxkKGljb24pO1xyXG5cdFx0Ym94LmFwcGVuZENoaWxkKG5hbWUpO1xyXG5cclxuXHRcdHJldHVybiBib3g7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBIFx1MDQzRlx1MDQzRSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcdTA0NDMgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVBdHRhY2htZW50Q2xpY2soYXR0YWNobWVudDogQXR0YWNobWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzBcclxuXHRcdGNvbnN0IGNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIodGhpcy5wcm9wcy5wbHVnaW4pO1xyXG5cdFx0Y29uc3QgY2FjaGVFeGlzdHMgPSBhd2FpdCBjYWNoZU1hbmFnZXIuY2FjaGVkRmlsZUV4aXN0cyhhdHRhY2htZW50LmNhY2hlZFBhdGgpO1xyXG5cclxuXHRcdGxldCBwYXRoVG9PcGVuOiBzdHJpbmc7XHJcblxyXG5cdFx0aWYgKGNhY2hlRXhpc3RzKSB7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHJcblx0XHRcdGNvbnN0IGNhY2hlRm9sZGVyUGF0aCA9IHRoaXMucHJvcHMucGx1Z2luLnNldHRpbmdzLnJlZkNhY2hlRm9sZGVyO1xyXG5cdFx0XHRwYXRoVG9PcGVuID0gdGhpcy5wcm9wcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSArICcvJyArIGNhY2hlRm9sZGVyUGF0aCArICcvJyArIGF0dGFjaG1lbnQuY2FjaGVkUGF0aDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFx1MDQxQVx1MDQzNVx1MDQ0OCBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNELCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlxyXG5cdFx0XHRpZiAoYXR0YWNobWVudC50eXBlID09PSAnZXh0ZXJuYWwnKSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IGF0dGFjaG1lbnQuc291cmNlUGF0aDsgLy8gXHUwNDIzXHUwNDM2XHUwNDM1IFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOVxyXG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ZpbGUnKSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IHRoaXMucHJvcHMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgKyAnLycgKyBhdHRhY2htZW50LnNvdXJjZVBhdGg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IHRoaXMucHJvcHMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXIgKyAnLycgKyBhdHRhY2htZW50LnNvdXJjZVBhdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm9wZW5FeHRlcm5hbEZpbGUocGF0aFRvT3Blbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzOFx1MDQzNyBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0M0JcdTA0MzhcdTA0NDlcdTA0MzAgT2JzaWRpYW5cclxuXHQgKi9cclxuXHRwcml2YXRlIG9wZW5WYXVsdEZpbGUocGF0aDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zdCBmaWxlID0gdGhpcy5wcm9wcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcclxuXHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0dGhpcy5wcm9wcy5wbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5vcGVuRmlsZShmaWxlKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNEOiAke3BhdGh9YCwgMzAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBUT0RPOiBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0Mzkgd2luZG93LmVsZWN0cm9uLnNoZWxsLm9wZW5QYXRoKGFic29sdXRlUGF0aCkgXHUwNDNEXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MlxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzRlx1MDQzRSBcdTA0MzBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM4XHJcblx0ICovXHJcblx0cHJpdmF0ZSBvcGVuRXh0ZXJuYWxGaWxlKGFic29sdXRlUGF0aDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRpZiAoIXdpbmRvdy5yZXF1aXJlKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignXHUwNDFEXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM3XHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzMiBcdTA0MzJcdTA0MzVcdTA0MzEtXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4OicsIGFic29sdXRlUGF0aCk7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzRFx1MDQzRSBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDMyIGRlc2t0b3AtXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4JywgMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCB7IGV4ZWMgfSA9IHdpbmRvdy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XHJcblx0XHRcdGNvbnN0IHBhdGggPSB3aW5kb3cucmVxdWlyZSgncGF0aCcpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNFx1MDQ0MyBcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzRVx1MDQ0MiBcdTA0M0ZcdTA0M0JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0NEJcclxuXHRcdFx0bGV0IGNvbW1hbmQ6IHN0cmluZztcclxuXHRcdFx0Y29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtO1xyXG5cclxuXHRcdFx0aWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcblx0XHRcdFx0Ly8gV2luZG93czogXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIHN0YXJ0XHJcblx0XHRcdFx0Y29tbWFuZCA9IGBzdGFydCBcIlwiIFwiJHthYnNvbHV0ZVBhdGh9XCJgO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG5cdFx0XHRcdC8vIG1hY09TOiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0Mgb3BlblxyXG5cdFx0XHRcdGNvbW1hbmQgPSBgb3BlbiBcIiR7YWJzb2x1dGVQYXRofVwiYDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBMaW51eDogXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIHhkZy1vcGVuXHJcblx0XHRcdFx0Y29tbWFuZCA9IGB4ZGctb3BlbiBcIiR7YWJzb2x1dGVQYXRofVwiYDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZXhlYyhjb21tYW5kLCAoZXJyb3I6IEVycm9yIHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwOicsIGVycm9yKTtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQjogJHtlcnJvci5tZXNzYWdlfWAsIDMwMDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQ0Mlx1MDQzQVx1MDQzNSBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCOicsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShgXHUwNDFEXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQ0MVx1MDQ0QyBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCOiAke2Vycm9yLm1lc3NhZ2V9YCwgMzAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDQzXHUwNDRFIFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDNFXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFx1MDQyMFx1MDQzRVx1MDQzQlx1MDQ0QyBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIChcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsICd1c2VyJywgJ2Fzc2lzdGFudCcpLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFx1MDQxQlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDQwXHUwNDNFXHUwNDNCXHUwNDM4LlxyXG5cdCAqL1xyXG5cdGdldFJvbGVMYWJlbChyb2xlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoIChyb2xlKSB7XHJcblx0XHRcdGNhc2UgJ3VzZXInOlxyXG5cdFx0XHRcdHJldHVybiAnXHUwNDEyXHUwNDRCOic7XHJcblx0XHRcdGNhc2UgJ2Fzc2lzdGFudCc6XHJcblx0XHRcdFx0cmV0dXJuICdMTE0gXHUwNDEwXHUwNDMzXHUwNDM1XHUwNDNEXHUwNDQyOic7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuIGAke3JvbGV9OmA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzNVx1MDQ1MS5cclxuXHQgKiBAcGFyYW0ge0NoYXRIaXN0b3J5SXRlbVtdfSBuZXdIaXN0b3J5IC0gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyB1cGRhdGVIaXN0b3J5KG5ld0hpc3Rvcnk6IENoYXRIaXN0b3J5SXRlbVtdKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLmNoYXRIaXN0b3J5ID0gbmV3SGlzdG9yeTtcclxuXHRcdGF3YWl0IHRoaXMucmVuZGVySGlzdG9yeSgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlQXZhaWxhYmxlTW9kZWxzKG1vZGVsczogc3RyaW5nW10pOiB2b2lkIHtcclxuXHRcdHRoaXMucHJvcHMuYXZhaWxhYmxlTW9kZWxzID0gbW9kZWxzO1xyXG5cdFx0dGhpcy51cGRhdGVNb2RlbERyb3Bkb3duKCk7XHJcblx0fVxyXG5cclxuXHRkZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmRlc3Ryb3koKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFN5c3RlbSBJbml0aWFsaXphdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIGluaXRpYWxpemVSZWZlcmVuY2VTeXN0ZW0oKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucHJvcHMucGx1Z2luKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignUGx1Z2luIFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0QgXHUwNDMyIENoYXRQYW5lbCwgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzAnKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlciA9IG5ldyBBdXRvY29tcGxldGVNYW5hZ2VyKHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHRcdHRoaXMudGVtcGxhdGVFbmdpbmUgPSBuZXcgVGVtcGxhdGVFbmdpbmUodGhpcy5wcm9wcy5wbHVnaW4pO1xyXG5cdFx0dGhpcy5jYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHRcdHRoaXMucmVmZXJlbmNlRXhwYW5kZXIgPSBuZXcgUmVmZXJlbmNlRXhwYW5kZXIodGhpcy5wcm9wcy5wbHVnaW4sIHRoaXMudGVtcGxhdGVFbmdpbmUpO1xyXG5cdH1cclxuXHJcblx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzNCBpbml0KCk6XHJcblx0aW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IGBcclxuXHRcdFx0PGRpdiBjbGFzcz1cImxsbS1hZ2VudC1jaGF0LXBhbmVsXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXQtaGlzdG9yeVwiIGlkPVwiY2hhdC1oaXN0b3J5XCI+PC9kaXY+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXQtaW5wdXQtY29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBcclxuXHRcdFx0XHRcdFx0XHRkYXRhLXRlc3RpZD1cImVkaXRvci1pbnB1dC1tYWluXCIgXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJtZXNzYWdlLWlucHV0LWVkaXRvclwiIFxyXG5cdFx0XHRcdFx0XHRcdHRhYmluZGV4PVwiMFwiXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS1wbGFjZWhvbGRlcj1cIlx1MDQxMlx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUsIEBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IsICNcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIsICRcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzlfXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0MzBcdTA0M0RcdTA0MzRcdTA0NDMgKC8pXCJcclxuXHRcdFx0XHRcdFx0PjwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXR0YWNoZWQtZmlsZXMtY29udGFpbmVyXCIgaWQ9XCJhdHRhY2hlZC1maWxlcy1jb250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjaGF0LWNvbnRyb2xzXCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb250cm9sLWJ1dHRvbnMtbGVmdFwiPlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RlbC1zZWxlY3QtY29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwibW9kZWwtc2VsZWN0LWJ1dHRvblwiIGlkPVwibW9kZWwtc2VsZWN0LWJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1vZGVsLW5hbWVcIiBpZD1cInNlbGVjdGVkLW1vZGVsLW5hbWVcIj4ke3RoaXMuc2VsZWN0ZWRNb2RlbH08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzdmcgY2xhc3M9XCJkcm9wZG93bi1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgZD1cIm0xOS41IDguMjUtNy41IDcuNS03LjUtNy41XCI+PC9wYXRoPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3N2Zz5cclxuXHRcdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGVsLWRyb3Bkb3duXCIgaWQ9XCJtb2RlbC1kcm9wZG93blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiY3VzdG9tLXByb21wdC1pbmRpY2F0b3JcIiBpZD1cImN1c3RvbS1wcm9tcHQtaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cInRvcFwiIGFyaWEtbGFiZWw9XCJcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHUyNjk5XHVGRTBGXHJcblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udHJvbC1idXR0b25zLXJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cInN0b3AtYnV0dG9uXCIgaWQ9XCJzdG9wLWJ1dHRvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RvcC1pY29uXCI+XHUyNUEwPC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCIgaWQ9XCJzZW5kLWJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdWJtaXQtdGV4dFwiPlx1MjNDRSBFbnRlcjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uc1wiIGlkPVwic3VnZ2VzdGlvbnNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0YDtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5tZXNzYWdlLWlucHV0LWVkaXRvcicpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0dGhpcy5zZW5kQnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI3NlbmQtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0XHR0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI3N1Z2dlc3Rpb25zJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblx0XHR0aGlzLm1vZGVsU2VsZWN0QnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI21vZGVsLXNlbGVjdC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRcdHRoaXMubW9kZWxEcm9wZG93biA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNtb2RlbC1kcm9wZG93bicpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3IgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY3VzdG9tLXByb21wdC1pbmRpY2F0b3InKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcblx0XHR0aGlzLnN0b3BCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc3RvcC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHJcblx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYXR0YWNoZWQtZmlsZXMtY29udGFpbmVyJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblxyXG5cdFx0dGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcblx0XHR0aGlzLnNldHVwUmVmZXJlbmNlU3lzdGVtKCk7XHJcblx0XHR0aGlzLnJlbmRlckhpc3RvcnkoKTtcclxuXHRcdHRoaXMudXBkYXRlTW9kZWxEcm9wZG93bigpO1xyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG5cdFx0dGhpcy51cGRhdGVDdXN0b21TeXN0ZW1Qcm9tcHRTdGF0dXModGhpcy5wcm9wcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFN5c3RlbSBTZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldHVwUmVmZXJlbmNlU3lzdGVtKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmF1dG9jb21wbGV0ZU1hbmFnZXIpIHJldHVybjtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHJcblx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSA9IG5ldyBSZWZlcmVuY2VBdXRvY29tcGxldGUodGhpcy5tZXNzYWdlSW5wdXQsIHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlcik7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHJcblx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5vbkl0ZW1TZWxlY3RlZCgoaXRlbTogQXV0b2NvbXBsZXRlSXRlbSwgbWF0Y2g6IFJlZmVyZW5jZU1hdGNoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVwbGFjZVJlZmVyZW5jZVdpdGhCb3gobWF0Y2gsIGl0ZW0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDM0IHNldHVwRXZlbnRMaXN0ZW5lcnMoKTpcclxuXHRzZXR1cEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVTZW5kV2l0aFJlZmVyZW5jZXMoKSk7XHJcblxyXG5cdFx0dGhpcy5tZXNzYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSAmJiB0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5oYW5kbGVLZXlkb3duKGUpKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xyXG5cdFx0XHRcdGlmICh0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZpcnN0U3VnZ2VzdGlvbiA9IHRoaXMuc3VnZ2VzdGlvbnNDb250YWluZXIucXVlcnlTZWxlY3RvcignLnN1Z2dlc3Rpb24taXRlbScpO1xyXG5cdFx0XHRcdFx0aWYgKGZpcnN0U3VnZ2VzdGlvbikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1lc3NhZ2VJbnB1dC50ZXh0Q29udGVudCA9IGZpcnN0U3VnZ2VzdGlvbi50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdFx0XHRcdFx0dGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcclxuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuaGFuZGxlU2VuZFdpdGhSZWZlcmVuY2VzKCk7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oYW5kbGVJbnB1dCgpO1xyXG5cdFx0XHR0aGlzLmhhbmRsZVJlZmVyZW5jZUlucHV0KCk7XHJcblx0XHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMubWVzc2FnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1vZGVsU2VsZWN0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy50b2dnbGVNb2RlbERyb3Bkb3duKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnN0b3BCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN0b3BHZW5lcmF0aW9uKCkpO1xyXG5cclxuXHRcdC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRpZiAoIXRoaXMubW9kZWxTZWxlY3RCdXR0b24uY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkgJiYgIXRoaXMubW9kZWxEcm9wZG93bi5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkge1xyXG5cdFx0XHRcdHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICghdGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkge1xyXG5cdFx0XHRcdHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFByb2Nlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIGhhbmRsZVJlZmVyZW5jZUlucHV0KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSB8fCB0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHRcdGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblx0XHRjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25JblRleHQoKTtcclxuXHJcblx0XHRpZiAoY3Vyc29yUG9zaXRpb24gPT09IC0xKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRleHQgPSB0aGlzLmdldFRleHRDb250ZW50KCk7XHJcblx0XHRjb25zdCBjdXJyZW50UmVmID0gUmVmZXJlbmNlUGFyc2VyLmdldEN1cnJlbnRSZWZlcmVuY2UodGV4dCwgY3Vyc29yUG9zaXRpb24pO1xyXG5cclxuXHRcdGlmIChjdXJyZW50UmVmKSB7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0NERcdTA0M0FcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcclxuXHRcdFx0Y29uc3QgY3Vyc29yUmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5zaG93QXV0b2NvbXBsZXRlKGN1cnJlbnRSZWYsIGN1cnNvclJlY3QpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5yZWZlcmVuY2VBdXRvY29tcGxldGUuaGlkZUF1dG9jb21wbGV0ZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlcGxhY2VSZWZlcmVuY2VXaXRoQm94KG1hdGNoOiBSZWZlcmVuY2VNYXRjaCwgaXRlbTogQXV0b2NvbXBsZXRlSXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5pc1Byb2Nlc3NpbmdSZWZlcmVuY2UgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZTogRmlsZVJlZmVyZW5jZSA9IHtcclxuXHRcdFx0dHlwZTogaXRlbS50eXBlLFxyXG5cdFx0XHRuYW1lOiBpdGVtLm5hbWUsXHJcblx0XHRcdHBhdGg6IGl0ZW0ucGF0aCxcclxuXHRcdFx0cGVybWFuZW50OiBtYXRjaC5wcmVmaXgubGVuZ3RoID09PSAyIC8vIEBAIFx1MDQzOFx1MDQzQlx1MDQzOCAjI1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHJcblx0XHRjb25zdCBib3ggPSBSZWZlcmVuY2VCb3guY3JlYXRlQm94KHJlZmVyZW5jZSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzOSBSYW5nZSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRCXHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblx0XHRpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG5cdFx0XHR0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0ZcdTA0MzBcdTA0MzdcdTA0M0VcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiwgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMCBtYXRjaC5zdGFydEluZGV4IFx1MDQzOCBtYXRjaC5lbmRJbmRleFxyXG5cdFx0Ly8gXHUwNDFEXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCLCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDM4XHUwNDNDIFx1MDQzOFx1MDQzRFx1MDQzNFx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQzMFx1MDQzQ1xyXG5cdFx0Y29uc3QgeyBzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBlbmROb2RlLCBlbmRPZmZzZXQgfSA9IHRoaXMuZmluZE5vZGVzQW5kT2Zmc2V0c0Zvck1hdGNoKG1hdGNoKTtcclxuXHJcblx0XHRpZiAoIXN0YXJ0Tm9kZSB8fCAhZW5kTm9kZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzgnLCBtYXRjaCk7XHJcblx0XHRcdHRoaXMuaXNQcm9jZXNzaW5nUmVmZXJlbmNlID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByZXBsYWNlbWVudFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuXHRcdHJlcGxhY2VtZW50UmFuZ2Uuc2V0U3RhcnQoc3RhcnROb2RlLCBzdGFydE9mZnNldCk7XHJcblx0XHRyZXBsYWNlbWVudFJhbmdlLnNldEVuZChlbmROb2RlLCBlbmRPZmZzZXQpO1xyXG5cclxuXHRcdHJlcGxhY2VtZW50UmFuZ2UuZGVsZXRlQ29udGVudHMoKTsgLy8gXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzhcclxuXHRcdHJlcGxhY2VtZW50UmFuZ2UuaW5zZXJ0Tm9kZShib3gpOyAvLyBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDMgXHUwNDMyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBXHJcblx0XHR0aGlzLmN1cnJlbnRSZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcclxuXHJcblx0XHR0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIFx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0IgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MCBcdTA0MzdcdTA0MzAgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFXHJcblx0XHR0aGlzLmluc2VydFNwYWNlQW5kU2V0Q3Vyc29yQWZ0ZXJFbGVtZW50KGJveCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MURcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCIFx1MDQzOCBcdTA0NDFcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBtYXRjaCBcdTA0MzIgY29udGVudGVkaXRhYmxlIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzNS5cclxuXHQgKiBAcGFyYW0gbWF0Y2ggLSBcdTA0M0VcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIgUmVmZXJlbmNlTWF0Y2guXHJcblx0ICogQHJldHVybnMgXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyIFx1MDQ0MSBzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBlbmROb2RlLCBlbmRPZmZzZXQuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kTm9kZXNBbmRPZmZzZXRzRm9yTWF0Y2gobWF0Y2g6IFJlZmVyZW5jZU1hdGNoKToge1xyXG5cdFx0c3RhcnROb2RlOiBOb2RlIHwgbnVsbDtcclxuXHRcdHN0YXJ0T2Zmc2V0OiBudW1iZXI7XHJcblx0XHRlbmROb2RlOiBOb2RlIHwgbnVsbDtcclxuXHRcdGVuZE9mZnNldDogbnVtYmVyO1xyXG5cdH0ge1xyXG5cdFx0bGV0IHN0YXJ0Tm9kZTogTm9kZSB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0T2Zmc2V0ID0gMDtcclxuXHRcdGxldCBlbmROb2RlOiBOb2RlIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kT2Zmc2V0ID0gMDtcclxuXHRcdGxldCBjdXJyZW50TGVuZ3RoID0gMDtcclxuXHJcblx0XHRjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMubWVzc2FnZUlucHV0LCBOb2RlRmlsdGVyLlNIT1dfQUxMKTsgLy8gU0hPV19BTEwsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDM4IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0QlxyXG5cdFx0bGV0IG5vZGU6IE5vZGUgfCBudWxsOyAvLyBcdTA0MjNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBub2RlIFx1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgbnVsbFxyXG5cclxuXHRcdHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSkge1xyXG5cdFx0XHRpZiAoIW5vZGUpIGJyZWFrOyAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNBXHUwNDQzIFx1MDQzRFx1MDQzMCBudWxsXHJcblxyXG5cdFx0XHRjb25zdCBub2RlVGV4dExlbmd0aCA9IHRoaXMuZ2V0Tm9kZUVxdWl2YWxlbnRMZW5ndGhGb3JSZWZlcmVuY2VQYXJzaW5nKG5vZGUpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzhcdTA0M0RcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0MzIgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzNVxyXG5cdFx0XHRpZiAoY3VycmVudExlbmd0aCA8PSBtYXRjaC5zdGFydEluZGV4ICYmIG1hdGNoLnN0YXJ0SW5kZXggPCBjdXJyZW50TGVuZ3RoICsgbm9kZVRleHRMZW5ndGgpIHtcclxuXHRcdFx0XHRzdGFydE5vZGUgPSBub2RlO1xyXG5cdFx0XHRcdHN0YXJ0T2Zmc2V0ID0gbWF0Y2guc3RhcnRJbmRleCAtIGN1cnJlbnRMZW5ndGg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDM3XHUwNDMwXHUwNDNBXHUwNDMwXHUwNDNEXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzAgXHUwNDMyIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzVcclxuXHRcdFx0aWYgKGN1cnJlbnRMZW5ndGggPD0gbWF0Y2guZW5kSW5kZXggJiYgbWF0Y2guZW5kSW5kZXggPD0gY3VycmVudExlbmd0aCArIG5vZGVUZXh0TGVuZ3RoKSB7XHJcblx0XHRcdFx0ZW5kTm9kZSA9IG5vZGU7XHJcblx0XHRcdFx0ZW5kT2Zmc2V0ID0gbWF0Y2guZW5kSW5kZXggLSBjdXJyZW50TGVuZ3RoO1xyXG5cdFx0XHRcdGJyZWFrOyAvLyBcdTA0MURcdTA0MzBcdTA0NDhcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDMwLCBcdTA0MzJcdTA0NEJcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0NcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0VcdTA0NDVcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiwgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QywgZW5kTm9kZSBcdTA0MzVcdTA0NDlcdTA0MzUgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCxcclxuXHRcdFx0Ly8gXHUwNDNEXHUwNDNFIFx1MDQzQ1x1MDQ0QiBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ4XHUwNDNCXHUwNDM4IHN0YXJ0Tm9kZS5cclxuXHRcdFx0aWYgKHN0YXJ0Tm9kZSAmJiAhZW5kTm9kZSAmJiBtYXRjaC5lbmRJbmRleCA8PSBjdXJyZW50TGVuZ3RoICsgbm9kZVRleHRMZW5ndGgpIHtcclxuXHRcdFx0XHQvLyBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDQxXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM5LCBcdTA0M0FcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzAgZW5kTWF0Y2guZW5kSW5kZXggXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM1IFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFxyXG5cdFx0XHRcdGVuZE5vZGUgPSBub2RlO1xyXG5cdFx0XHRcdGVuZE9mZnNldCA9IG1hdGNoLmVuZEluZGV4IC0gY3VycmVudExlbmd0aDtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3VycmVudExlbmd0aCArPSBub2RlVGV4dExlbmd0aDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggZW5kTm9kZSBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNELCBcdTA0MzJcdTA0M0VcdTA0MzdcdTA0M0NcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0UsIG1hdGNoLmVuZEluZGV4IFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0RcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2IGlucHV0RWxlbWVudFxyXG5cdFx0aWYgKCFlbmROb2RlICYmIHN0YXJ0Tm9kZSAmJiBjdXJyZW50TGVuZ3RoIDw9IG1hdGNoLmVuZEluZGV4KSB7XHJcblx0XHRcdGlmICh0aGlzLm1lc3NhZ2VJbnB1dC5sYXN0Q2hpbGQpIHtcclxuXHRcdFx0XHRlbmROb2RlID0gdGhpcy5tZXNzYWdlSW5wdXQubGFzdENoaWxkO1xyXG5cdFx0XHRcdGVuZE9mZnNldCA9IHRoaXMubWVzc2FnZUlucHV0Lmxhc3RDaGlsZC50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7IC8vIFx1MDQxOFx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDYgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHsgc3RhcnROb2RlLCBzdGFydE9mZnNldCwgZW5kTm9kZSwgZW5kT2Zmc2V0IH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NEJcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDREXHUwNDNBXHUwNDMyXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQ0M1x1MDQ0RSBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0NDMgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDZcdTA0MzVcdTA0M0JcdTA0MzVcdTA0MzkgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuXHQgKiBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRVx1MDQ0MiBnZXROb2RlRXF1aXZhbGVudExlbmd0aCwgXHUwNDQyXHUwNDMwXHUwNDNBIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NEMgcmVmZXJlbmNlLWJveCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSxcclxuXHQgKiBcdTA0MzAgXHUwNDNEXHUwNDM1IDAsIFx1MDQ0Mlx1MDQzMFx1MDQzQSBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDNDXHUwNDRCIFx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0MzRcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIG1hdGNoLlxyXG5cdCAqIEBwYXJhbSBub2RlIC0gXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIERPTS5cclxuXHQgKiBAcmV0dXJucyBcdTA0NERcdTA0M0FcdTA0MzJcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQzOFx1MDQzRFx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXROb2RlRXF1aXZhbGVudExlbmd0aEZvclJlZmVyZW5jZVBhcnNpbmcobm9kZTogTm9kZSk6IG51bWJlciB7XHJcblx0XHRpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuXHRcdFx0cmV0dXJuIG5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG5cdFx0fSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWZlcmVuY2UtYm94JykpIHtcclxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlID0gUmVmZXJlbmNlQm94LmV4dHJhY3RSZWZlcmVuY2Uobm9kZSBhcyBIVE1MRWxlbWVudCk7XHJcblx0XHRcdGlmIChyZWZlcmVuY2UpIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDREXHUwNDQyXHUwNDNFIHJlZmVyZW5jZS1ib3gsIFx1MDQzNVx1MDQzM1x1MDQzRSBcIlx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0MzBcIiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M0VcdTA0MzRcdTA0M0RcdTA0MzBcdTA0NEYgQC9AQCNuYW1lXHJcblx0XHRcdFx0cmV0dXJuIChyZWZlcmVuY2UucGVybWFuZW50ID8gMiA6IDEpICsgcmVmZXJlbmNlLm5hbWUubGVuZ3RoO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gMDsgLy8gXHUwNDE0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDM1IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDRGXHUwNDRFXHUwNDQyIFx1MDQzRFx1MDQzMCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NDNcdTA0NEUgXHUwNDM0XHUwNDNCXHUwNDM4XHUwNDNEXHUwNDQzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NERcdTA0NDJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwLlxyXG5cdCAqIEBwYXJhbSBlbGVtZW50IC0gSFRNTCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIsIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0IgXHUwNDM4IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpbnNlcnRTcGFjZUFuZFNldEN1cnNvckFmdGVyRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cdFx0aWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcblx0XHRjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcblx0XHRyYW5nZS5zZXRTdGFydEFmdGVyKGVsZW1lbnQpO1xyXG5cdFx0cmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIFx1MDQyMVx1MDQ0NVx1MDQzQlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0ZcdTA0MzBcdTA0MzdcdTA0M0VcdTA0M0QgXHUwNDM0XHUwNDNFIFx1MDQzRVx1MDQzNFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcclxuXHJcblx0XHQvLyBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDRCXHUwNDMyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlxyXG5cdFx0Y29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTAwQTAnKTtcclxuXHRcdHJhbmdlLmluc2VydE5vZGUoc3BhY2VOb2RlKTtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwXHJcblx0XHRyYW5nZS5zZXRTdGFydEFmdGVyKHNwYWNlTm9kZSk7XHJcblx0XHRyYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcblx0XHRzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcblx0XHRzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNVxyXG5cdCAqIChcdTA0NDJcdTA0MzVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0NEMgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIGZpbmROb2Rlc0FuZE9mZnNldHNGb3JNYXRjaCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDM1XHUwNDM1IFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzQ1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RilcclxuXHQgKi9cclxuXHRwcml2YXRlIGdldEN1cnNvclBvc2l0aW9uSW5UZXh0KCk6IG51bWJlciB7XHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblx0XHRpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIC0xO1xyXG5cclxuXHRcdGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzVcdTA0M0MgXCJcdTA0MzBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzlcIiBcdTA0MzhcdTA0M0RcdTA0MzRcdTA0MzVcdTA0M0FcdTA0NDEgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgYG1lc3NhZ2VJbnB1dGBcclxuXHRcdC8vIFx1MDQ0MSBcdTA0NDNcdTA0NDdcdTA0MzVcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFLCBcdTA0NDdcdTA0NDJcdTA0M0UgcmVmZXJlbmNlLWJveCdcdTA0NEIgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDRCIFx1MDQzOFx1MDQ0NSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDNCXHUwNDNFXHUwNDMzXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzMiBnZXRUZXh0Q29udGVudCgpXHJcblx0XHRsZXQgY3VycmVudFRleHRPZmZzZXQgPSAwO1xyXG5cdFx0Y29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLm1lc3NhZ2VJbnB1dCwgTm9kZUZpbHRlci5TSE9XX0FMTCk7XHJcblx0XHRsZXQgbm9kZTtcclxuXHJcblx0XHR3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkpIHtcclxuXHRcdFx0aWYgKG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lcikge1xyXG5cdFx0XHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG5cdFx0XHRcdFx0Y3VycmVudFRleHRPZmZzZXQgKz0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAobm9kZSA9PT0gdGhpcy5tZXNzYWdlSW5wdXQpIHtcclxuXHRcdFx0XHRcdC8vIENcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzksIFx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDMyIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzRFx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzUsIFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzUuXHJcblx0XHRcdFx0XHQvLyBcdTA0MUNcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDLCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzUuXHJcblx0XHRcdFx0XHQvLyBcdTA0MURcdTA0MzBcdTA0M0MgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QywgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0UgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLlxyXG5cdFx0XHRcdFx0bGV0IG5vZGVCZWZvcmVDdXJzb3JFbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5lbmRPZmZzZXQ7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZE5vZGUgPSB0aGlzLm1lc3NhZ2VJbnB1dC5jaGlsZE5vZGVzW2ldO1xyXG5cdFx0XHRcdFx0XHRjdXJyZW50VGV4dE9mZnNldCArPSB0aGlzLmdldE5vZGVFcXVpdmFsZW50TGVuZ3RoRm9yUmVmZXJlbmNlUGFyc2luZyhjaGlsZE5vZGUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggZW5kQ29udGFpbmVyIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzRVx1MDQzOSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgKFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgPGJyPiksXHJcblx0XHRcdFx0XHQvLyBcdTA0NDJcdTA0M0UgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0UgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDFDXHUwNDRCIFx1MDQzRFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0M0RcdTA0NEIgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0NDMsIFx1MDQzRFx1MDQzRSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0M0RcdTA0NEIgXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDLCBcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzRSBcdTA0MzRcdTA0M0UgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzQyBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzUgYHJhbmdlLmVuZE9mZnNldGAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIDAsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzRFx1MDQzOFx1MDQzQy5cclxuXHRcdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMCwgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRlx1MDQzRS1cdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDQxXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNSBgY29udGVudGVkaXRhYmxlYCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzN1x1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzQ1x1MDQ0QiBcdTA0M0JcdTA0MzhcdTA0MzFcdTA0M0UgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzUsXHJcblx0XHRcdFx0XHQvLyBcdTA0M0JcdTA0MzhcdTA0MzFcdTA0M0UgYGVuZENvbnRhaW5lcmAgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQ0MFx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzQywgXHUwNDMwIGBlbmRPZmZzZXRgIC0gXHUwNDM4XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDNBXHUwNDQxXHUwNDNFXHUwNDNDIFx1MDQzNFx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzRFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXHJcblx0XHRcdFx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgYHJlZmVyZW5jZS1ib3hgIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0MzVcdTA0M0QgKFx1MDQ0Mi5cdTA0M0EuIFx1MDQzRVx1MDQzRCBgPHNwYW4gY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj5gKS5cclxuXHRcdFx0XHRcdC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0NDUgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNFXHUwNDMyLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzOCBcdTA0M0RcdTA0MzhcdTA0NDUsIGByYW5nZS5lbmRPZmZzZXRgIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGN1cnJlbnRUZXh0T2Zmc2V0ICs9IHRoaXMuZ2V0Tm9kZUVxdWl2YWxlbnRMZW5ndGhGb3JSZWZlcmVuY2VQYXJzaW5nKG5vZGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1cnJlbnRUZXh0T2Zmc2V0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgaW5wdXQgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwIChcdTA0MzFcdTA0MzVcdTA0MzcgSFRNTCksXHJcblx0ICogXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDRGIHJlZmVyZW5jZS1ib3ggXHUwNDM4XHUwNDQ1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRUZXh0Q29udGVudCgpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cdFx0Y29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLm1lc3NhZ2VJbnB1dCwgTm9kZUZpbHRlci5TSE9XX0FMTCk7IC8vIFNIT1dfQUxMIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDMwXHJcblx0XHRsZXQgbm9kZTtcclxuXHJcblx0XHR3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkpIHtcclxuXHRcdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IG5vZGUudGV4dENvbnRlbnQgfHwgJyc7XHJcblx0XHRcdH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygncmVmZXJlbmNlLWJveCcpKSB7XHJcblx0XHRcdFx0Y29uc3QgcmVmZXJlbmNlID0gUmVmZXJlbmNlQm94LmV4dHJhY3RSZWZlcmVuY2Uobm9kZSBhcyBIVE1MRWxlbWVudCk7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJlZml4ID0gcmVmZXJlbmNlLnBlcm1hbmVudCA/IChyZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnID8gJ0BAJyA6ICcjIycpIDogcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJyA/ICdAJyA6ICcjJztcclxuXHRcdFx0XHRcdHJlc3VsdCArPSBwcmVmaXggKyByZWZlcmVuY2UubmFtZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuXHRcdFx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDQ1IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzMiwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM1IFx1MDQzQ1x1MDQzRVx1MDQzM1x1MDQ0M1x1MDQ0MiBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMyIGNvbnRlbnRlZGl0YWJsZSAoXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCA8YnI+KSxcclxuXHRcdFx0XHQvLyBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRDLCBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDM4XHUwNDQ1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQ0Mlx1MDQ0QyBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzQy5cclxuXHRcdFx0XHQvLyBcdTA0MTIgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQ0MVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0RFx1MDQ0Mlx1MDQzRSA8YnI+LCBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzMCBcXG4uXHJcblx0XHRcdFx0Ly8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Mlx1MDQ0QiwgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQywgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxLlxyXG5cdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggaW5wdXRFbGVtZW50IFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDRCLCBcdTA0M0VcdTA0M0RcdTA0MzggXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NENcdTA0NEUgZ2V0VGV4dENvbnRlbnQsXHJcblx0XHRcdFx0Ly8gXHUwNDNGXHUwNDNFXHUwNDREXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDQzIHdhbGtlci5uZXh0Tm9kZSgpIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDUgXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDLlxyXG5cdFx0XHRcdC8vIFx1MDQxMlx1MDQzRVx1MDQzN1x1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzRFx1MDQzRSwgXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDM1XHUwNDM1IFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzQywgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0MzZcdTA0MzhcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0NcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDM1LlxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzRVx1MDQzMiBcdTA0M0RcdTA0MzAgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZXh0cmFjdFRleHRXaXRoUmVmZXJlbmNlcygpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5mcm9tKHRoaXMubWVzc2FnZUlucHV0LmNoaWxkTm9kZXMpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGNoaWxkTm9kZXMpIHtcclxuXHRcdFx0aWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuXHRcdFx0XHRyZXN1bHQgKz0gY2hpbGROb2RlLnRleHRDb250ZW50O1xyXG5cdFx0XHR9IGVsc2UgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuXHRcdFx0XHRjb25zdCBlbGVtZW50ID0gY2hpbGROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuXHRcdFx0XHRpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3JlZmVyZW5jZS1ib3gnKSkge1xyXG5cdFx0XHRcdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggLSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDMwIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDNcclxuXHRcdFx0XHRcdGNvbnN0IHJlZmVyZW5jZSA9IFJlZmVyZW5jZUJveC5leHRyYWN0UmVmZXJlbmNlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0aWYgKHJlZmVyZW5jZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmVmaXggPSByZWZlcmVuY2UucGVybWFuZW50XHJcblx0XHRcdFx0XHRcdFx0PyByZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICdAQCdcclxuXHRcdFx0XHRcdFx0XHRcdDogJyMjJ1xyXG5cdFx0XHRcdFx0XHRcdDogcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJ1xyXG5cdFx0XHRcdFx0XHRcdD8gJ0AnXHJcblx0XHRcdFx0XHRcdFx0OiAnIyc7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBgJHtwcmVmaXh9JHtyZWZlcmVuY2UubmFtZX1gO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0NEJcdTA0NDdcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIC0gXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzVcclxuXHRcdFx0XHRcdHJlc3VsdCArPSBlbGVtZW50LnRleHRDb250ZW50O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDEgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU2VuZFdpdGhSZWZlcmVuY2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgcmF3VGV4dCA9IHRoaXMuZXh0cmFjdFRleHRXaXRoUmVmZXJlbmNlcygpO1xyXG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJhd1RleHQudHJpbSgpO1xyXG5cclxuXHRcdGlmICghbWVzc2FnZSAmJiB0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcblx0XHRpZiAoIXRoaXMucmVmZXJlbmNlRXhwYW5kZXIpIHtcclxuXHRcdFx0dGhpcy5oYW5kbGVTZW5kKCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxOFx1MDQzN1x1MDQzMlx1MDQzQlx1MDQzNVx1MDQzQVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM4XHUwNDM3IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0MTggXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQ0NVxyXG5cdFx0XHRjb25zdCB7IG9yaWdpbmFsVGV4dCwgYXR0YWNobWVudHMgfSA9IGF3YWl0IHRoaXMucmVmZXJlbmNlRXhwYW5kZXIuZXh0cmFjdEF0dGFjaG1lbnRzKHJhd1RleHQsIHRoaXMuY3VycmVudFJlZmVyZW5jZXMpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzhcdTA0MzcgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzUgKFx1MDQzOFx1MDQzNyBhdHRhY2hlZC1maWxlcy1jb250YWluZXIpXHJcblx0XHRcdGNvbnN0IGFsbEF0dGFjaG1lbnRzID0gWy4uLmF0dGFjaG1lbnRzLCAuLi50aGlzLmN1cnJlbnRBdHRhY2htZW50c107XHJcblxyXG5cdFx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRpZiAodGhpcy5wcm9wcy5vblNlbmRNZXNzYWdlKSB7XHJcblx0XHRcdFx0dGhpcy5wcm9wcy5vblNlbmRNZXNzYWdlKG9yaWdpbmFsVGV4dCB8fCAnJywgdGhpcy5zZWxlY3RlZE1vZGVsLCBhbGxBdHRhY2htZW50cyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY2xlYXJJbnB1dCgpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBOicsIGVycm9yKTtcclxuXHRcdFx0aWYgKHRoaXMucHJvcHMub25TZW5kTWVzc2FnZSkge1xyXG5cdFx0XHRcdHRoaXMucHJvcHMub25TZW5kTWVzc2FnZShyYXdUZXh0LCB0aGlzLnNlbGVjdGVkTW9kZWwsIHRoaXMuY3VycmVudEF0dGFjaG1lbnRzKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmNsZWFySW5wdXQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDMwIFx1MDQzOCBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2xlYXJJbnB1dCgpOiB2b2lkIHtcclxuXHRcdHRoaXMubWVzc2FnZUlucHV0LmlubmVySFRNTCA9ICcnO1xyXG5cdFx0dGhpcy5jdXJyZW50UmVmZXJlbmNlcyA9IFtdO1xyXG5cdFx0dGhpcy5jdXJyZW50QXR0YWNobWVudHMgPSBbXTtcclxuXHRcdHRoaXMucmVuZGVyQXR0YWNoZWRGaWxlcygpO1xyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG5cdFx0dGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcclxuXHRcdGlmICh0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSkge1xyXG5cdFx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDM0IGhhbmRsZVNlbmQoKSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4OlxyXG5cdGhhbmRsZVNlbmQoKTogdm9pZCB7XHJcblx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlSW5wdXQudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJztcclxuXHRcdGlmIChtZXNzYWdlICYmIHRoaXMucHJvcHMub25TZW5kTWVzc2FnZSkge1xyXG5cdFx0XHR0aGlzLnByb3BzLm9uU2VuZE1lc3NhZ2UobWVzc2FnZSwgdGhpcy5zZWxlY3RlZE1vZGVsLCB0aGlzLmN1cnJlbnRBdHRhY2htZW50cyk7XHJcblx0XHRcdHRoaXMuY2xlYXJJbnB1dCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzhcdTA0M0RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDM0IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQzQyBcdTA0NDEgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0MzdcdTA0MzBcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NEYuXHJcblx0ICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50IC0gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiwgXHUwNDNBIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQzOFx1MDQzRFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzMi5cclxuXHQgKiBAcGFyYW0gbWVzc2FnZUNvbnRlbnQgLSBcdTA0MjFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqIEBwYXJhbSBub2RlSWQgLSBJRCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAsIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEUsIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqIEBwYXJhbSBncmFwaElkIC0gSUQgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLCBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDM0XHUwNDNCXHUwNDM1XHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjcmVhdGVNZXNzYWdlVG9vbHNldChtZXNzYWdlRWxlbWVudDogSFRNTEVsZW1lbnQsIG1lc3NhZ2VDb250ZW50OiBzdHJpbmcsIG5vZGVJZDogc3RyaW5nLCBncmFwaElkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHRvb2xzZXRXcmFwcGVyID0gbWVzc2FnZUVsZW1lbnQuY3JlYXRlRGl2KHtcclxuXHRcdFx0Y2xzOiAnei0wIGZsZXggbWluLWgtWzQ2cHhdIGp1c3RpZnktc3RhcnQnXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHRvb2xzZXRDb250YWluZXIgPSB0b29sc2V0V3JhcHBlci5jcmVhdGVEaXYoe1xyXG5cdFx0XHRjbHM6ICd0b3VjaDotbWUtMiB0b3VjaDotbXMtMy41IC1tcy0yLjUgLW1lLTEgZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC15LTQgcC0xIHNlbGVjdC1ub25lIHRvdWNoOnctW2NhbGMoMTAwJSstLXNwYWNpbmcoMy41KSldIC1tdC0xIHctW2NhbGMoMTAwJSstLXNwYWNpbmcoMi41KSldIGR1cmF0aW9uLVsxLjVzXSBmb2N1cy13aXRoaW46dHJhbnNpdGlvbi1ub25lIGhvdmVyOnRyYW5zaXRpb24tbm9uZSBwb2ludGVyLWV2ZW50cy1ub25lIFttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0b19yaWdodCxibGFja18zMyUsdHJhbnNwYXJlbnRfNjYlKV0gW21hc2stc2l6ZTozMDAlXzEwMCVdIFttYXNrLXBvc2l0aW9uOjEwMCVfMCVdIG1vdGlvbi1zYWZlOnRyYW5zaXRpb24tW21hc2stcG9zaXRpb25dIGdyb3VwLWhvdmVyL3R1cm4tbWVzc2FnZXM6cG9pbnRlci1ldmVudHMtYXV0byBncm91cC1ob3Zlci90dXJuLW1lc3NhZ2VzOlttYXNrLXBvc2l0aW9uOjBfMF0gZ3JvdXAtZm9jdXMtd2l0aGluL3R1cm4tbWVzc2FnZXM6cG9pbnRlci1ldmVudHMtYXV0byBncm91cC1mb2N1cy13aXRoaW4vdHVybi1tZXNzYWdlczpbbWFzay1wb3NpdGlvbjowXzBdIGhhcy1kYXRhLVtzdGF0ZT1vcGVuXTpwb2ludGVyLWV2ZW50cy1hdXRvIGhhcy1kYXRhLVtzdGF0ZT1vcGVuXTpbbWFzay1wb3NpdGlvbjowXzBdJ1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDXCJcclxuXHRcdGNvbnN0IGNvcHlCdXR0b24gPSB0b29sc2V0Q29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcblx0XHRcdGNsczogJ3RleHQtdG9rZW4tdGV4dC1zZWNvbmRhcnkgaG92ZXI6YmctdG9rZW4tYmctc2Vjb25kYXJ5IHJvdW5kZWQtbGcnLFxyXG5cdFx0XHRhdHRyOiB7XHJcblx0XHRcdFx0J2FyaWEtbGFiZWwnOiAnXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDJyxcclxuXHRcdFx0XHQnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJyxcclxuXHRcdFx0XHQnZGF0YS10ZXN0aWQnOiAnY29weS10dXJuLWFjdGlvbi1idXR0b24nLFxyXG5cdFx0XHRcdCdkYXRhLXN0YXRlJzogJ2Nsb3NlZCdcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRjb25zdCBjb3B5SWNvbkNvbnRhaW5lciA9IGNvcHlCdXR0b24uY3JlYXRlU3Bhbih7IGNsczogJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRvdWNoOnctMTAgaC04IHctOCcgfSk7XHJcblx0XHRzZXRJY29uKGNvcHlJY29uQ29udGFpbmVyLCAnY29weScpOyAvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RSBzZXRJY29uXHJcblx0XHRjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmNvcHlNZXNzYWdlQ29udGVudChtZXNzYWdlQ29udGVudClcclxuXHRcdFx0XHQudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTIgXHUwNDQxXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0FcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MyBcdTA0M0RcdTA0MzAgXHUwNDMzXHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDQzXHJcblx0XHRcdFx0XHRzZXRJY29uKGNvcHlJY29uQ29udGFpbmVyLCAnY2hlY2snKTtcclxuXHRcdFx0XHRcdC8vIFx1MDQxMlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzhcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNyAxIFx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQ0M1xyXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHNldEljb24oY29weUljb25Db250YWluZXIsICdjb3B5Jyk7XHJcblx0XHRcdFx0XHR9LCAxMDAwKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU6JywgZXJyKTtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNS4nLCAzMDAwKTsgLy8gXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIE5vdGljZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDXCJcclxuXHRcdGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJywgLy8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0MzBcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUnLFxyXG5cdFx0XHRcdCdkYXRhLXRlc3RpZCc6ICdkZWxldGUtdHVybi1hY3Rpb24tYnV0dG9uJyxcclxuXHRcdFx0XHQnZGF0YS1zdGF0ZSc6ICdjbG9zZWQnXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0Y29uc3QgZGVsZXRlSWNvbkNvbnRhaW5lciA9IGRlbGV0ZUJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24oZGVsZXRlSWNvbkNvbnRhaW5lciwgJ3RyYXNoLTInKTsgLy8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzN1x1MDQzOFx1MDQzRFx1MDQ0QlxyXG5cdFx0ZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBjb25maXJtZWQgPSBhd2FpdCBEaWFsb2cuY29uZmlybShcclxuXHRcdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5hcHAsXHJcblx0XHRcdFx0J1x1MDQxMlx1MDQ0QiBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NEIsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU/IFx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzNS4nXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChjb25maXJtZWQpIHtcclxuXHRcdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdkZWxldGUtbm9kZScsIHsgZ3JhcGhJZCwgbm9kZUlkIH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MUFcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzAgXCJcdTA0MjBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NENcIlxyXG5cdFx0Y29uc3QgcmVnZW5lcmF0ZUJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJyxcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQyMFx1MDQzNVx1MDQzM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUnLFxyXG5cdFx0XHRcdCdkYXRhLXRlc3RpZCc6ICdyZWdlbmVyYXRlLXR1cm4tYWN0aW9uLWJ1dHRvbicsXHJcblx0XHRcdFx0J2RhdGEtc3RhdGUnOiAnY2xvc2VkJ1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHJlZ2VuZXJhdGVJY29uQ29udGFpbmVyID0gcmVnZW5lcmF0ZUJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24ocmVnZW5lcmF0ZUljb25Db250YWluZXIsICdyZWZyZXNoLWN3Jyk7XHJcblx0XHRyZWdlbmVyYXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0XHRcdHRoaXMucHJvcHMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3JlZ2VuZXJhdGUtbWVzc2FnZScsIHsgZ3JhcGhJZCwgbm9kZUlkLCBtb2RlbDogdGhpcy5zZWxlY3RlZE1vZGVsIH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDFEXHUwNDMwXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiXHJcblx0XHRjb25zdCBzY3JvbGxUb1RvcEJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJyxcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0M0EgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDQzIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RicsXHJcblx0XHRcdFx0J2RhdGEtdGVzdGlkJzogJ3Njcm9sbC10by1tZXNzYWdlLXRvcC1idXR0b24nLFxyXG5cdFx0XHRcdCdkYXRhLXN0YXRlJzogJ2Nsb3NlZCdcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRjb25zdCBzY3JvbGxUb1RvcEljb25Db250YWluZXIgPSBzY3JvbGxUb1RvcEJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24oc2Nyb2xsVG9Ub3BJY29uQ29udGFpbmVyLCAnYXJyb3ctdXAnKTsgLy8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcclxuXHRcdHNjcm9sbFRvVG9wQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDBcdTA0NDNcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MCAodmlldy1jb250ZW50KSBcdTA0M0EgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDQzIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHRcdFx0Y29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnLnZpZXctY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0XHRpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0c2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IG1lc3NhZ2VFbGVtZW50Lm9mZnNldFRvcDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGhhbmRsZVN0b3BHZW5lcmF0aW9uKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCkge1xyXG5cdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdG9wLXN0cmVhbS1yZXF1ZXN0Jywge1xyXG5cdFx0XHRcdG5vZGVJZDogdGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlU3RvcEJ1dHRvblZpc2liaWxpdHkoaXNTdHJlYW1pbmc6IGJvb2xlYW4sIG5vZGVJZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkID0gbm9kZUlkO1xyXG5cclxuXHRcdGlmIChpc1N0cmVhbWluZyAmJiBub2RlSWQpIHtcclxuXHRcdFx0dGhpcy5zdG9wQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWZsZXgnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zdG9wQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNvcHlNZXNzYWdlQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50KTtcclxuXHR9XHJcblxyXG5cdHVwZGF0ZUN1c3RvbVN5c3RlbVByb21wdFN0YXR1cyhjdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmN1c3RvbVByb21wdEluZGljYXRvcikge1xyXG5cdFx0XHRpZiAoY3VzdG9tU3lzdGVtUHJvbXB0KSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtZmxleCc7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc2V0QXR0cmlidXRlKFxyXG5cdFx0XHRcdFx0J2FyaWEtbGFiZWwnLFxyXG5cdFx0XHRcdFx0YFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MjogJHtjdXN0b21TeXN0ZW1Qcm9tcHR9YFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0XHR0aGlzLmN1c3RvbVByb21wdEluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlsZSBBdHRhY2htZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQVx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEJcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbmRlckF0dGFjaGVkRmlsZXMoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jdXJyZW50QXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMuYXR0YWNoZWRGaWxlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHRcdHRoaXMuYXR0YWNoZWRGaWxlc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuXHJcblx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5jdXJyZW50QXR0YWNobWVudHMpIHtcclxuXHRcdFx0Y29uc3QgYm94ID0gdGhpcy5jcmVhdGVSZW1vdmFibGVBdHRhY2htZW50Qm94KGF0dGFjaG1lbnQpO1xyXG5cdFx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDEgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjcmVhdGVSZW1vdmFibGVBdHRhY2htZW50Qm94KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGJveC5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1ib3ggcmVtb3ZhYmxlJztcclxuXHJcblx0XHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0aWNvbi5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1pY29uJztcclxuXHRcdGljb24udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0NFJztcclxuXHJcblx0XHRjb25zdCBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0bmFtZS5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1uYW1lJztcclxuXHRcdG5hbWUudGV4dENvbnRlbnQgPSBhdHRhY2htZW50Lm5hbWU7XHJcblxyXG5cdFx0Y29uc3QgcmVtb3ZlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRyZW1vdmVCdG4uY2xhc3NOYW1lID0gJ2F0dGFjaG1lbnQtcmVtb3ZlJztcclxuXHRcdHJlbW92ZUJ0bi5pbm5lckhUTUwgPSAnXHUwMEQ3JztcclxuXHRcdHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNScpO1xyXG5cdFx0cmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlbW92ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRib3guYXBwZW5kQ2hpbGQoaWNvbik7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQobmFtZSk7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQocmVtb3ZlQnRuKTtcclxuXHJcblx0XHRyZXR1cm4gYm94O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzNVx1MDQzNSBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbW92ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnQpO1xyXG5cdFx0aWYgKGluZGV4ID4gLTEpIHtcclxuXHRcdFx0dGhpcy5jdXJyZW50QXR0YWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJBdHRhY2hlZEZpbGVzKCk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsICJjb25zdCBQQUNLRVRfVFlQRVMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvLyBubyBNYXAgPSBubyBwb2x5ZmlsbFxuUEFDS0VUX1RZUEVTW1wib3BlblwiXSA9IFwiMFwiO1xuUEFDS0VUX1RZUEVTW1wiY2xvc2VcIl0gPSBcIjFcIjtcblBBQ0tFVF9UWVBFU1tcInBpbmdcIl0gPSBcIjJcIjtcblBBQ0tFVF9UWVBFU1tcInBvbmdcIl0gPSBcIjNcIjtcblBBQ0tFVF9UWVBFU1tcIm1lc3NhZ2VcIl0gPSBcIjRcIjtcblBBQ0tFVF9UWVBFU1tcInVwZ3JhZGVcIl0gPSBcIjVcIjtcblBBQ0tFVF9UWVBFU1tcIm5vb3BcIl0gPSBcIjZcIjtcbmNvbnN0IFBBQ0tFVF9UWVBFU19SRVZFUlNFID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbk9iamVjdC5rZXlzKFBBQ0tFVF9UWVBFUykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgUEFDS0VUX1RZUEVTX1JFVkVSU0VbUEFDS0VUX1RZUEVTW2tleV1dID0ga2V5O1xufSk7XG5jb25zdCBFUlJPUl9QQUNLRVQgPSB7IHR5cGU6IFwiZXJyb3JcIiwgZGF0YTogXCJwYXJzZXIgZXJyb3JcIiB9O1xuZXhwb3J0IHsgUEFDS0VUX1RZUEVTLCBQQUNLRVRfVFlQRVNfUkVWRVJTRSwgRVJST1JfUEFDS0VUIH07XG4iLCAiaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuY29uc3Qgd2l0aE5hdGl2ZUJsb2IgPSB0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIjtcbi8vIEFycmF5QnVmZmVyLmlzVmlldyBtZXRob2QgaXMgbm90IGRlZmluZWQgaW4gSUUxMFxuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iaiAmJiBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuY29uc3QgZW5jb2RlUGFja2V0ID0gKHsgdHlwZSwgZGF0YSB9LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUJsb2IgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlQmxvYkFzQmFzZTY0KGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiZcbiAgICAgICAgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcoZGF0YSkpKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChuZXcgQmxvYihbZGF0YV0pLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxhaW4gc3RyaW5nXG4gICAgcmV0dXJuIGNhbGxiYWNrKFBBQ0tFVF9UWVBFU1t0eXBlXSArIChkYXRhIHx8IFwiXCIpKTtcbn07XG5jb25zdCBlbmNvZGVCbG9iQXNCYXNlNjQgPSAoZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZpbGVSZWFkZXIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtcbiAgICAgICAgY2FsbGJhY2soXCJiXCIgKyAoY29udGVudCB8fCBcIlwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xufTtcbmZ1bmN0aW9uIHRvQXJyYXkoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgIH1cbn1cbmxldCBURVhUX0VOQ09ERVI7XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQgfTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9iYXNlNjQtYXJyYXlidWZmZXJcbmNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gKGJhc2U2NCkgPT4ge1xuICAgIGxldCBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NSwgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsIGVuY29kZWQxLCBlbmNvZGVkMiwgZW5jb2RlZDMsIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCksIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlidWZmZXI7XG59O1xuIiwgImltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgUEFDS0VUX1RZUEVTX1JFVkVSU0UsIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSBcIi4vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanNcIjtcbmNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuZXhwb3J0IGNvbnN0IGRlY29kZVBhY2tldCA9IChlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGVkUGFja2V0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIGRhdGE6IG1hcEJpbmFyeShlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGVuY29kZWRQYWNrZXQuY2hhckF0KDApO1xuICAgIGlmICh0eXBlID09PSBcImJcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBkZWNvZGVCYXNlNjRQYWNrZXQoZW5jb2RlZFBhY2tldC5zdWJzdHJpbmcoMSksIGJpbmFyeVR5cGUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYWNrZXRUeXBlID0gUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV07XG4gICAgaWYgKCFwYWNrZXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBFUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgICAgIGRhdGE6IGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgIH07XG59O1xuY29uc3QgZGVjb2RlQmFzZTY0UGFja2V0ID0gKGRhdGEsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsICJpbXBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBhY2tldFRvQmluYXJ5IH0gZnJvbSBcIi4vZW5jb2RlUGFja2V0LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiLi9kZWNvZGVQYWNrZXQuanNcIjtcbmltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgfSBmcm9tIFwiLi9jb21tb25zLmpzXCI7XG5jb25zdCBTRVBBUkFUT1IgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMwKTsgLy8gc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlbGltaXRlciNBU0NJSV9kZWxpbWl0ZWRfdGV4dFxuY29uc3QgZW5jb2RlUGF5bG9hZCA9IChwYWNrZXRzLCBjYWxsYmFjaykgPT4ge1xuICAgIC8vIHNvbWUgcGFja2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGFycmF5IHdoaWxlIGVuY29kaW5nLCBzbyB0aGUgaW5pdGlhbCBsZW5ndGggbXVzdCBiZSBzYXZlZFxuICAgIGNvbnN0IGxlbmd0aCA9IHBhY2tldHMubGVuZ3RoO1xuICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBwYWNrZXRzLmZvckVhY2goKHBhY2tldCwgaSkgPT4ge1xuICAgICAgICAvLyBmb3JjZSBiYXNlNjQgZW5jb2RpbmcgZm9yIGJpbmFyeSBwYWNrZXRzXG4gICAgICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IGRlY29kZVBheWxvYWQgPSAoZW5jb2RlZFBheWxvYWQsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IGVuY29kZWRQYXlsb2FkLnNwbGl0KFNFUEFSQVRPUik7XG4gICAgY29uc3QgcGFja2V0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFBhY2tldCA9IGRlY29kZVBhY2tldChlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgIHRyYW5zZm9ybShwYWNrZXQsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGVuY29kZVBhY2tldFRvQmluYXJ5KHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxubGV0IFRFWFRfREVDT0RFUjtcbmZ1bmN0aW9uIHRvdGFsTGVuZ3RoKGNodW5rcykge1xuICAgIHJldHVybiBjaHVua3MucmVkdWNlKChhY2MsIGNodW5rKSA9PiBhY2MgKyBjaHVuay5sZW5ndGgsIDApO1xufVxuZnVuY3Rpb24gY29uY2F0Q2h1bmtzKGNodW5rcywgc2l6ZSkge1xuICAgIGlmIChjaHVua3NbMF0ubGVuZ3RoID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBjaHVua3Muc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IGNodW5rc1swXVtqKytdO1xuICAgICAgICBpZiAoaiA9PT0gY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2h1bmtzLmxlbmd0aCAmJiBqIDwgY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF0uc2xpY2Uoaik7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAwIC8qIFN0YXRlLlJFQURfSEVBREVSICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gY29uY2F0Q2h1bmtzKGNodW5rcywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5ID0gKGhlYWRlclswXSAmIDB4ODApID09PSAweDgwO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IGhlYWRlclswXSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDIpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG5ldyBEYXRhVmlldyhoZWFkZXJBcnJheS5idWZmZXIsIGhlYWRlckFycmF5LmJ5dGVPZmZzZXQsIGhlYWRlckFycmF5Lmxlbmd0aCkuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogU3RhdGUuUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gMiAvKiBTdGF0ZS5SRUFEX0VYVEVOREVEX0xFTkdUSF82NCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckFycmF5ID0gY29uY2F0Q2h1bmtzKGNodW5rcywgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdmlldy5nZXRVaW50MzIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuID4gTWF0aC5wb3coMiwgNTMgLSAzMikgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdCBpcyAyXjUzIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG4gKiBNYXRoLnBvdygyLCAzMikgKyB2aWV3LmdldFVpbnQzMig0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb25jYXRDaHVua3MoY2h1bmtzLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShkZWNvZGVQYWNrZXQoaXNCaW5hcnkgPyBkYXRhIDogVEVYVF9ERUNPREVSLmRlY29kZShkYXRhKSwgYmluYXJ5VHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMCB8fCBleHBlY3RlZExlbmd0aCA+IG1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDQ7XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBheWxvYWQsIGRlY29kZVBhY2tldCwgZGVjb2RlUGF5bG9hZCwgfTtcbiIsICIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gKCgpID0+IHtcbiAgICBjb25zdCBpc1Byb21pc2VBdmFpbGFibGUgPSB0eXBlb2YgUHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBQcm9taXNlLnJlc29sdmUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpZiAoaXNQcm9taXNlQXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiAoY2IpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChjYiwgc2V0VGltZW91dEZuKSA9PiBzZXRUaW1lb3V0Rm4oY2IsIDApO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsVGhpc1NoaW0gPSAoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvb2tpZUphcigpIHsgfVxuIiwgImltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKG9iaiwgLi4uYXR0cikge1xuICAgIHJldHVybiBhdHRyLnJlZHVjZSgoYWNjLCBrKSA9PiB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIGFjY1trXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbi8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgdGltZW91dCBmdW5jdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aGVuIG92ZXJyaWRkZW5cbmNvbnN0IE5BVElWRV9TRVRfVElNRU9VVCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dDtcbmNvbnN0IE5BVElWRV9DTEVBUl9USU1FT1VUID0gZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFRpbWVyRnVuY3Rpb25zKG9iaiwgb3B0cykge1xuICAgIGlmIChvcHRzLnVzZU5hdGl2ZVRpbWVycykge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gTkFUSVZFX1NFVF9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IE5BVElWRV9DTEVBUl9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxufVxuLy8gYmFzZTY0IGVuY29kZWQgYnVmZmVycyBhcmUgYWJvdXQgMzMlIGJpZ2dlciAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0KVxuY29uc3QgQkFTRTY0X09WRVJIRUFEID0gMS4zMztcbi8vIHdlIGNvdWxkIGFsc28gaGF2ZSB1c2VkIGBuZXcgQmxvYihbb2JqXSkuc2l6ZWAsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgaW4gSUU5XG5leHBvcnQgZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgoc3RyKSB7XG4gICAgbGV0IGMgPSAwLCBsZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGg7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSA4LWNoYXJhY3RlcnMgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICAgIHJldHVybiAoRGF0ZS5ub3coKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpICtcbiAgICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDUpKTtcbn1cbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9xdWVyeXN0cmluZ1xuLyoqXG4gKiBDb21waWxlcyBhIHF1ZXJ5c3RyaW5nXG4gKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShvYmopIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcmJztcbiAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoaSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuLyoqXG4gKiBQYXJzZXMgYSBzaW1wbGUgcXVlcnlzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbiIsICJpbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBpbnN0YWxsVGltZXJGdW5jdGlvbnMgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tIFwiLi9jb250cmliL3BhcnNlcXMuanNcIjtcbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGRlc2NyaXB0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gXCJUcmFuc3BvcnRFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSB0aGUgZXJyb3IgY29udGV4dFxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH0gZm9yIGNoYWluaW5nXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBuZXcgVHJhbnNwb3J0RXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5kb09wZW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5pbmdcIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBtdWx0aXBsZSBwYWNrZXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0c1xuICAgICAqL1xuICAgIHNlbmQocGFja2V0cykge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy53cml0ZShwYWNrZXRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZSB0cmFuc3BvcnQgd2FzIHNpbGVudGx5IGNsb3NlZCBpbiB0aGUgYmVmb3JldW5sb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBvcGVuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcIm9wZW5cIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBkZWNvZGVQYWNrZXQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSk7XG4gICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggYSBkZWNvZGVkIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvblBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwicGFja2V0XCIsIHBhY2tldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uQ2xvc2UoZGV0YWlscykge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCBkZXRhaWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB0cmFuc3BvcnQsIGluIG9yZGVyIG5vdCB0byBsb3NlIHBhY2tldHMgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25QYXVzZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHsgfVxuICAgIGNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIChzY2hlbWEgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSgpICtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQoKSArXG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aCArXG4gICAgICAgICAgICB0aGlzLl9xdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgICBfaG9zdG5hbWUoKSB7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5vcHRzLmhvc3RuYW1lO1xuICAgICAgICByZXR1cm4gaG9zdG5hbWUuaW5kZXhPZihcIjpcIikgPT09IC0xID8gaG9zdG5hbWUgOiBcIltcIiArIGhvc3RuYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIF9wb3J0KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnQgJiZcbiAgICAgICAgICAgICgodGhpcy5vcHRzLnNlY3VyZSAmJiBOdW1iZXIodGhpcy5vcHRzLnBvcnQgIT09IDQ0MykpIHx8XG4gICAgICAgICAgICAgICAgKCF0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCkgIT09IDgwKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjpcIiArIHRoaXMub3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXJ5KHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRRdWVyeSA9IGVuY29kZShxdWVyeSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkUXVlcnkubGVuZ3RoID8gXCI/XCIgKyBlbmNvZGVkUXVlcnkgOiBcIlwiO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGF5bG9hZCwgZGVjb2RlUGF5bG9hZCB9IGZyb20gXCJlbmdpbmUuaW8tcGFyc2VyXCI7XG5leHBvcnQgY2xhc3MgUG9sbGluZyBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5fcG9sbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgcG9sbGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUGF1c2UgLSBjYWxsYmFjayB1cG9uIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgYW5kIHRyYW5zcG9ydCBpcyBwYXVzZWRcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzaW5nXCI7XG4gICAgICAgIGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzZWRcIjtcbiAgICAgICAgICAgIG9uUGF1c2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3BvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9sbGluZykge1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoXCJkcmFpblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHBvbGxpbmcgY3ljbGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wb2xsKCkge1xuICAgICAgICB0aGlzLl9wb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb1BvbGwoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgZGVjb2RlUGF5bG9hZChkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbENvbXBsZXRlXCIpO1xuICAgICAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUoW3sgdHlwZTogXCJjbG9zZVwiIH1dKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIHRoaXMub25jZShcIm9wZW5cIiwgY2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHMgLSBkYXRhIHBhY2tldHNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGVuY29kZVBheWxvYWQocGFja2V0cywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkcmFpblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHVyaSBmb3IgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXJpKCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdHMuc2VjdXJlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gY2FjaGUgYnVzdGluZyBpcyBmb3JjZWRcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgIXF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgcXVlcnkuYjY0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcmkoc2NoZW1hLCBxdWVyeSk7XG4gICAgfVxufVxuIiwgIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvbmVudC9oYXMtY29yc1xubGV0IHZhbHVlID0gZmFsc2U7XG50cnkge1xuICAgIHZhbHVlID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbn1cbmNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gICAgLy8gd2hlbiB0cnlpbmcgdG8gY3JlYXRlXG59XG5leHBvcnQgY29uc3QgaGFzQ09SUyA9IHZhbHVlO1xuIiwgImltcG9ydCB7IFBvbGxpbmcgfSBmcm9tIFwiLi9wb2xsaW5nLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgcGljayB9IGZyb20gXCIuLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBnbG9iYWxUaGlzU2hpbSBhcyBnbG9iYWxUaGlzIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgaGFzQ09SUyB9IGZyb20gXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCI7XG5mdW5jdGlvbiBlbXB0eSgpIHsgfVxuZXhwb3J0IGNsYXNzIEJhc2VYSFIgZXh0ZW5kcyBQb2xsaW5nIHtcbiAgICAvKipcbiAgICAgKiBYSFIgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQHBhY2thZ2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NTTCA9IFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICAgICAgbGV0IHBvcnQgPSBsb2NhdGlvbi5wb3J0O1xuICAgICAgICAgICAgLy8gc29tZSB1c2VyIGFnZW50cyBoYXZlIGVtcHR5IGBsb2NhdGlvbi5wb3J0YFxuICAgICAgICAgICAgaWYgKCFwb3J0KSB7XG4gICAgICAgICAgICAgICAgcG9ydCA9IGlzU1NMID8gXCI0NDNcIiA6IFwiODBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMueGQgPVxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSAhPT0gbG9jYXRpb24uaG9zdG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHBvcnQgIT09IG9wdHMucG9ydDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZVJlcXVlc3QsIHVyaSwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0O1xuICAgICAgICBpbnN0YWxsVGltZXJGdW5jdGlvbnModGhpcywgb3B0cyk7XG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLl9tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQgIT09IG9wdHMuZGF0YSA/IG9wdHMuZGF0YSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NyZWF0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvcHRzID0gcGljayh0aGlzLl9vcHRzLCBcImFnZW50XCIsIFwicGZ4XCIsIFwia2V5XCIsIFwicGFzc3BocmFzZVwiLCBcImNlcnRcIiwgXCJjYVwiLCBcImNpcGhlcnNcIiwgXCJyZWplY3RVbmF1dGhvcml6ZWRcIiwgXCJhdXRvVW5yZWZcIik7XG4gICAgICAgIG9wdHMueGRvbWFpbiA9ICEhdGhpcy5fb3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMuX3hociA9IHRoaXMuY3JlYXRlUmVxdWVzdChvcHRzKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLl9tZXRob2QsIHRoaXMuX3VyaSwgdHJ1ZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgJiYgeGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdHMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaSwgdGhpcy5fb3B0cy5leHRyYUhlYWRlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgaWYgKFwiUE9TVFwiID09PSB0aGlzLl9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMuX29wdHMuY29va2llSmFyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkQ29va2llcyh4aHIpO1xuICAgICAgICAgICAgLy8gaWU2IGNoZWNrXG4gICAgICAgICAgICBpZiAoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHIpIHtcbiAgICAgICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy5fb3B0cy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLl9vcHRzLmNvb2tpZUphcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcnNlQ29va2llcyhcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJzZXQtY29va2llXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBgZXJyb3JgIGV2ZW50IGhhbmRsZXIgdGhhdCdzIHVzZXItc2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGluIHRoZSBzYW1lIHRpY2sgYW5kIGdldHMgY2F1Z2h0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlb2YgeGhyLnN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHhoci5zdGF0dXMgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHhoci5zZW5kKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkVycm9yKGVycikge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVyciwgdGhpcy5feGhyKTtcbiAgICAgICAgdGhpcy5fY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYW51cChmcm9tRXJyb3IpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB0aGlzLl94aHIgfHwgbnVsbCA9PT0gdGhpcy5feGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICAgICAgICBpZiAoZnJvbUVycm9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBsb2FkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25Mb2FkKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5feGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxufVxuUmVxdWVzdC5yZXF1ZXN0c0NvdW50ID0gMDtcblJlcXVlc3QucmVxdWVzdHMgPSB7fTtcbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIGF0dGFjaEV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhdHRhY2hFdmVudChcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uRXZlbnQgPSBcIm9ucGFnZWhpZGVcIiBpbiBnbG9iYWxUaGlzID8gXCJwYWdlaGlkZVwiIDogXCJ1bmxvYWRcIjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0ZXJtaW5hdGlvbkV2ZW50LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5sb2FkSGFuZGxlcigpIHtcbiAgICBmb3IgKGxldCBpIGluIFJlcXVlc3QucmVxdWVzdHMpIHtcbiAgICAgICAgaWYgKFJlcXVlc3QucmVxdWVzdHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIFJlcXVlc3QucmVxdWVzdHNbaV0uYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ld1JlcXVlc3Qoe1xuICAgICAgICB4ZG9tYWluOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4geGhyICYmIHhoci5yZXNwb25zZVR5cGUgIT09IG51bGw7XG59KSgpO1xuLyoqXG4gKiBIVFRQIGxvbmctcG9sbGluZyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4gYFhNTEh0dHBSZXF1ZXN0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXJcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgWEhSIGV4dGVuZHMgQmFzZVhIUiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgY29uc3QgZm9yY2VCYXNlNjQgPSBvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBoYXNYSFIyICYmICFmb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgcmVxdWVzdChvcHRzID0ge30pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRzLCB7IHhkOiB0aGlzLnhkIH0sIHRoaXMub3B0cyk7XG4gICAgICAgIHJldHVybiBuZXcgUmVxdWVzdChuZXdSZXF1ZXN0LCB0aGlzLnVyaSgpLCBvcHRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXdSZXF1ZXN0KG9wdHMpIHtcbiAgICBjb25zdCB4ZG9tYWluID0gb3B0cy54ZG9tYWluO1xuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICAgIHRyeSB7XG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgKCF4ZG9tYWluIHx8IGhhc0NPUlMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHsgfVxuICAgIGlmICgheGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBwaWNrLCByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGFja2V0IH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMsIG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuLy8gZGV0ZWN0IFJlYWN0TmF0aXZlIGVudmlyb25tZW50XG5jb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG5hdmlnYXRvci5wcm9kdWN0LnRvTG93ZXJDYXNlKCkgPT09IFwicmVhY3RuYXRpdmVcIjtcbmV4cG9ydCBjbGFzcyBCYXNlV1MgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJzb2NrZXRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICBjb25zdCB1cmkgPSB0aGlzLnVyaSgpO1xuICAgICAgICBjb25zdCBwcm90b2NvbHMgPSB0aGlzLm9wdHMucHJvdG9jb2xzO1xuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgb25seSBzdXBwb3J0cyB0aGUgJ2hlYWRlcnMnIG9wdGlvbiwgYW5kIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIGFueXRoaW5nIGVsc2UgaXMgcGFzc2VkXG4gICAgICAgIGNvbnN0IG9wdHMgPSBpc1JlYWN0TmF0aXZlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHBpY2sodGhpcy5vcHRzLCBcImFnZW50XCIsIFwicGVyTWVzc2FnZURlZmxhdGVcIiwgXCJwZnhcIiwgXCJrZXlcIiwgXCJwYXNzcGhyYXNlXCIsIFwiY2VydFwiLCBcImNhXCIsIFwiY2lwaGVyc1wiLCBcInJlamVjdFVuYXV0aG9yaXplZFwiLCBcImxvY2FsQWRkcmVzc1wiLCBcInByb3RvY29sVmVyc2lvblwiLCBcIm9yaWdpblwiLCBcIm1heFBheWxvYWRcIiwgXCJmYW1pbHlcIiwgXCJjaGVja1NlcnZlcklkZW50aXR5XCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgb3B0cy5oZWFkZXJzID0gdGhpcy5vcHRzLmV4dHJhSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53cyA9IHRoaXMuY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3MuYmluYXJ5VHlwZSA9IHRoaXMuc29ja2V0LmJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMud3MuX3NvY2tldC51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk9wZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHRoaXMub25DbG9zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IGNsb3NlRXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChldikgPT4gdGhpcy5vbkRhdGEoZXYuZGF0YSk7XG4gICAgICAgIHRoaXMud3Mub25lcnJvciA9IChlKSA9PiB0aGlzLm9uRXJyb3IoXCJ3ZWJzb2NrZXQgZXJyb3JcIiwgZSk7XG4gICAgfVxuICAgIHdyaXRlKHBhY2tldHMpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBlbmNvZGVQYWNrZXQgZWZmaWNpZW50IGFzIGl0IHVzZXMgV1MgZnJhbWluZ1xuICAgICAgICAvLyBubyBuZWVkIGZvciBlbmNvZGVQYXlsb2FkXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBlbmNvZGVQYWNrZXQocGFja2V0LCB0aGlzLnN1cHBvcnRzQmluYXJ5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShwYWNrZXQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9DbG9zZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLndzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoKSA9PiB7IH07XG4gICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcIndzc1wiIDogXCJ3c1wiO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgICAgIC8vIGFwcGVuZCB0aW1lc3RhbXAgdG8gVVJJXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21tdW5pY2F0ZSBiaW5hcnkgc3VwcG9ydCBjYXBhYmlsaXRpZXNcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG59XG5jb25zdCBXZWJTb2NrZXRDdG9yID0gZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfHwgZ2xvYmFsVGhpcy5Nb3pXZWJTb2NrZXQ7XG4vKipcbiAqIFdlYlNvY2tldCB0cmFuc3BvcnQgYmFzZWQgb24gdGhlIGJ1aWx0LWluIGBXZWJTb2NrZXRgIG9iamVjdC5cbiAqXG4gKiBVc2FnZTogYnJvd3NlciwgTm9kZS5qcyAoc2luY2UgdjIxKSwgRGVubywgQnVuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vbWRuLWFwaV93ZWJzb2NrZXRcbiAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9nbG9iYWxzLmh0bWwjd2Vic29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBXUyBleHRlbmRzIEJhc2VXUyB7XG4gICAgY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiAhaXNSZWFjdE5hdGl2ZVxuICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICA/IG5ldyBXZWJTb2NrZXRDdG9yKHVyaSwgcHJvdG9jb2xzKVxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldEN0b3IodXJpKVxuICAgICAgICAgICAgOiBuZXcgV2ViU29ja2V0Q3Rvcih1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgfVxuICAgIGRvV3JpdGUoX3BhY2tldCwgZGF0YSkge1xuICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gXCIuLi90cmFuc3BvcnQuanNcIjtcbmltcG9ydCB7IG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSwgY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSwgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuLyoqXG4gKiBXZWJUcmFuc3BvcnQgdHJhbnNwb3J0IGJhc2VkIG9uIHRoZSBidWlsdC1pbiBgV2ViVHJhbnNwb3J0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXIsIE5vZGUuanMgKHdpdGggdGhlIGBAZmFpbHMtY29tcG9uZW50cy93ZWJ0cmFuc3BvcnRgIHBhY2thZ2UpXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViVHJhbnNwb3J0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vd2VidHJhbnNwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBXVCBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnRyYW5zcG9ydFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViVHJhbnNwb3J0KHRoaXMuY3JlYXRlVXJpKFwiaHR0cHNcIiksIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW3RoaXMubmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LmNsb3NlZFxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKFwid2VidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBub3RlOiB3ZSBjb3VsZCBoYXZlIHVzZWQgYXN5bmMvYXdhaXQsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgc29tZSBhZGRpdGlvbmFsIHBvbHlmaWxsc1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuY3JlYXRlQmlkaXJlY3Rpb25hbFN0cmVhbSgpLnRoZW4oKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZXJTdHJlYW0gPSBjcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0ucmVhZGFibGUucGlwZVRocm91Z2goZGVjb2RlclN0cmVhbSkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlclN0cmVhbSA9IGNyZWF0ZVBhY2tldEVuY29kZXJTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICBlbmNvZGVyU3RyZWFtLnJlYWRhYmxlLnBpcGVUbyhzdHJlYW0ud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlciA9IGVuY29kZXJTdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB0aGlzLm9uT3BlbigpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLl93cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuX3RyYW5zcG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFhIUiB9IGZyb20gXCIuL3BvbGxpbmcteGhyLm5vZGUuanNcIjtcbmltcG9ydCB7IFdTIH0gZnJvbSBcIi4vd2Vic29ja2V0Lm5vZGUuanNcIjtcbmltcG9ydCB7IFdUIH0gZnJvbSBcIi4vd2VidHJhbnNwb3J0LmpzXCI7XG5leHBvcnQgY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgICB3ZWJzb2NrZXQ6IFdTLFxuICAgIHdlYnRyYW5zcG9ydDogV1QsXG4gICAgcG9sbGluZzogWEhSLFxufTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9wYXJzZXVyaVxuLyoqXG4gKiBQYXJzZXMgYSBVUklcbiAqXG4gKiBOb3RlOiB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCB0aGUgYnVpbHQtaW4gVVJMIG9iamVjdCwgYnV0IGl0IGlzbid0IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLlxuICpcbiAqIFNlZTpcbiAqIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTFxuICogLSBodHRwczovL2Nhbml1c2UuY29tL3VybFxuICogLSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKlxuICogSGlzdG9yeSBvZiB0aGUgcGFyc2UoKSBtZXRob2Q6XG4gKiAtIGZpcnN0IGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL3NvY2tldC5pby1jbGllbnQvY29tbWl0LzRlZTFkNWQ5NGIzOTA2YTljMDUyYjQ1OWYxYTgxOGIxNWYzOGY5MWNcbiAqIC0gZXhwb3J0IGludG8gaXRzIG93biBtb2R1bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9lbmdpbmUuaW8tY2xpZW50L2NvbW1pdC9kZTJjNTYxZTQ1NjRlZmViNzhmMWJkYjFiYTM5ZWY4MWIyODIyY2IzXG4gKiAtIHJlaW1wb3J0OiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGYzMjI3N2MzZjZkNjIyZWVjNWVkMDlmNDkzY2FlM2YzMzkxZDI0MlxuICpcbiAqIEBhdXRob3IgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+IChNSVQgbGljZW5zZSlcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5jb25zdCByZSA9IC9eKD86KD8hW146QFxcLz8jXSs6W146QFxcL10qQCkoaHR0cHxodHRwc3x3c3x3c3MpOlxcL1xcLyk/KCg/OigoW146QFxcLz8jXSopKD86OihbXjpAXFwvPyNdKikpPyk/QCk/KCg/OlthLWYwLTldezAsNH06KXsyLDd9W2EtZjAtOV17MCw0fXxbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuY29uc3QgcGFydHMgPSBbXG4gICAgJ3NvdXJjZScsICdwcm90b2NvbCcsICdhdXRob3JpdHknLCAndXNlckluZm8nLCAndXNlcicsICdwYXNzd29yZCcsICdob3N0JywgJ3BvcnQnLCAncmVsYXRpdmUnLCAncGF0aCcsICdkaXJlY3RvcnknLCAnZmlsZScsICdxdWVyeScsICdhbmNob3InXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gODAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsICJpbXBvcnQgeyB0cmFuc3BvcnRzIGFzIERFRkFVTFRfVFJBTlNQT1JUUyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgYnl0ZUxlbmd0aCB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9jb250cmliL3BhcnNldXJpLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IHByb3RvY29sIH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUNvb2tpZUphciwgZGVmYXVsdEJpbmFyeVR5cGUsIG5leHRUaWNrLCB9IGZyb20gXCIuL2dsb2JhbHMubm9kZS5qc1wiO1xuY29uc3Qgd2l0aEV2ZW50TGlzdGVuZXJzID0gdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBPRkZMSU5FX0VWRU5UX0xJU1RFTkVSUyA9IFtdO1xuaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgIC8vIHdpdGhpbiBhIFNlcnZpY2VXb3JrZXIsIGFueSBldmVudCBoYW5kbGVyIGZvciB0aGUgJ29mZmxpbmUnIGV2ZW50IG11c3QgYmUgYWRkZWQgb24gdGhlIGluaXRpYWwgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAvLyBzY3JpcHQsIHNvIHdlIGNyZWF0ZSBvbmUgc2luZ2xlIGV2ZW50IGxpc3RlbmVyIGhlcmUgd2hpY2ggd2lsbCBmb3J3YXJkIHRoZSBldmVudCB0byB0aGUgc29ja2V0IGluc3RhbmNlc1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsICgpID0+IHtcbiAgICAgICAgT0ZGTElORV9FVkVOVF9MSVNURU5FUlMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgIH0sIGZhbHNlKTtcbn1cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIFdlYlNvY2tldC1saWtlIGludGVyZmFjZSB0byBjb25uZWN0IHRvIGFuIEVuZ2luZS5JTyBzZXJ2ZXIuIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWRcbiAqIHdpdGggb25lIG9mIHRoZSBhdmFpbGFibGUgbG93LWxldmVsIHRyYW5zcG9ydHMsIGxpa2UgSFRUUCBsb25nLXBvbGxpbmcsIFdlYlNvY2tldCBvciBXZWJUcmFuc3BvcnQuXG4gKlxuICogVGhpcyBjbGFzcyBjb21lcyB3aXRob3V0IHVwZ3JhZGUgbWVjaGFuaXNtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwga2VlcCB0aGUgZmlyc3QgbG93LWxldmVsIHRyYW5zcG9ydCB0aGF0XG4gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogSW4gb3JkZXIgdG8gYWxsb3cgdHJlZS1zaGFraW5nLCB0aGVyZSBhcmUgbm8gdHJhbnNwb3J0cyBpbmNsdWRlZCwgdGhhdCdzIHdoeSB0aGUgYHRyYW5zcG9ydHNgIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldFdpdGhvdXRVcGdyYWRlLCBXZWJTb2NrZXQgfSBmcm9tIFwiZW5naW5lLmlvLWNsaWVudFwiO1xuICpcbiAqIGNvbnN0IHNvY2tldCA9IG5ldyBTb2NrZXRXaXRob3V0VXBncmFkZSh7XG4gKiAgIHRyYW5zcG9ydHM6IFtXZWJTb2NrZXRdXG4gKiB9KTtcbiAqXG4gKiBzb2NrZXQub24oXCJvcGVuXCIsICgpID0+IHtcbiAqICAgc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAqIH0pO1xuICpcbiAqIEBzZWUgU29ja2V0V2l0aFVwZ3JhZGVcbiAqIEBzZWUgU29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRXaXRob3V0VXBncmFkZSBleHRlbmRzIEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIFNvY2tldCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIC0gdXJpIG9yIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5iaW5hcnlUeXBlID0gZGVmYXVsdEJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fcHJldkJ1ZmZlckxlbiA9IDA7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IC0xO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLl9tYXhQYXlsb2FkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIHtAbGluayBfcGluZ1RpbWVvdXRUaW1lcn0gb2JqZWN0IGlzIHRyYWNrZWQsIGluIGNhc2UgdGhlIHRpbWVyIGlzIHRocm90dGxlZCBhbmQgdGhlXG4gICAgICAgICAqIGNhbGxiYWNrIGlzIG5vdCBmaXJlZCBvbiB0aW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIGV4YW1wbGUgd2hlbiBhIGxhcHRvcCBpcyBzdXNwZW5kZWQgb3Igd2hlbiBhIHBob25lIGlzIGxvY2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVyaSA9IHBhcnNlKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2VkVXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJpLnByb3RvY29sID09PSBcImh0dHBzXCIgfHwgcGFyc2VkVXJpLnByb3RvY29sID09PSBcIndzc1wiO1xuICAgICAgICAgICAgb3B0cy5wb3J0ID0gcGFyc2VkVXJpLnBvcnQ7XG4gICAgICAgICAgICBpZiAocGFyc2VkVXJpLnF1ZXJ5KVxuICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBwYXJzZWRVcmkucXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5ob3N0KSB7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2Uob3B0cy5ob3N0KS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zZWN1cmUgPVxuICAgICAgICAgICAgbnVsbCAhPSBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgID8gb3B0cy5zZWN1cmVcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcImh0dHBzOlwiID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgICAgaWYgKG9wdHMuaG9zdG5hbWUgJiYgIW9wdHMucG9ydCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQgbWFudWFsbHksIHVzZSB0aGUgcHJvdG9jb2wgZGVmYXVsdFxuICAgICAgICAgICAgb3B0cy5wb3J0ID0gdGhpcy5zZWN1cmUgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPVxuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhdGlvbi5ob3N0bmFtZSA6IFwibG9jYWxob3N0XCIpO1xuICAgICAgICB0aGlzLnBvcnQgPVxuICAgICAgICAgICAgb3B0cy5wb3J0IHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24ucG9ydFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VjdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiNDQzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCI4MFwiKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRzID0gW107XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydHNCeU5hbWUgPSB7fTtcbiAgICAgICAgb3B0cy50cmFuc3BvcnRzLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydE5hbWUgPSB0LnByb3RvdHlwZS5uYW1lO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnB1c2godHJhbnNwb3J0TmFtZSk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRzQnlOYW1lW3RyYW5zcG9ydE5hbWVdID0gdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgcGF0aDogXCIvZW5naW5lLmlvXCIsXG4gICAgICAgICAgICBhZ2VudDogZmFsc2UsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcFBhcmFtOiBcInRcIixcbiAgICAgICAgICAgIHJlbWVtYmVyVXBncmFkZTogZmFsc2UsXG4gICAgICAgICAgICBhZGRUcmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhbnNwb3J0T3B0aW9uczoge30sXG4gICAgICAgICAgICBjbG9zZU9uQmVmb3JldW5sb2FkOiBmYWxzZSxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgICAgIHRoaXMub3B0cy5wYXRoID1cbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoLnJlcGxhY2UoL1xcLyQvLCBcIlwiKSArXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0cy5hZGRUcmFpbGluZ1NsYXNoID8gXCIvXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMucXVlcnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSA9IGRlY29kZSh0aGlzLm9wdHMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRoRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPbkJlZm9yZXVubG9hZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIFwiYmVmb3JldW5sb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBidXQgbm90IENocm9tZS4gVGhpcyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZXMgZXZlcnkgYnJvd3NlciBiZWhhdmVzIHRoZSBzYW1lIChubyBcImRpc2Nvbm5lY3RcIiBldmVudCBhdCB0aGUgU29ja2V0LklPIGxldmVsIHdoZW4gdGhlIHBhZ2UgaXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZWQvcmVsb2FkZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSBjbG9zZSB0aGUgdHJhbnNwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJuZXR3b3JrIGNvbm5lY3Rpb24gbG9zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnB1c2godGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29raWVKYXIgPSBjcmVhdGVDb29raWVKYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IHByb3RvY29sO1xuICAgICAgICAvLyB0cmFuc3BvcnQgbmFtZVxuICAgICAgICBxdWVyeS50cmFuc3BvcnQgPSBuYW1lO1xuICAgICAgICAvLyBzZXNzaW9uIGlkIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmVcbiAgICAgICAgaWYgKHRoaXMuaWQpXG4gICAgICAgICAgICBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHNvY2tldDogdGhpcyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgICAgICAgc2VjdXJlOiB0aGlzLnNlY3VyZSxcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgICAgfSwgdGhpcy5vcHRzLnRyYW5zcG9ydE9wdGlvbnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuX3RyYW5zcG9ydHNCeU5hbWVbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnROYW1lID0gdGhpcy5vcHRzLnJlbWVtYmVyVXBncmFkZSAmJlxuICAgICAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuaW5kZXhPZihcIndlYnNvY2tldFwiKSAhPT0gLTFcbiAgICAgICAgICAgID8gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zcG9ydHNbMF07XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlbmluZ1wiO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh0cmFuc3BvcnROYW1lKTtcbiAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCB0cmFuc3BvcnQuIERpc2FibGVzIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldFRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0IGxpc3RlbmVyc1xuICAgICAgICB0cmFuc3BvcnRcbiAgICAgICAgICAgIC5vbihcImRyYWluXCIsIHRoaXMuX29uRHJhaW4uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5vbihcInBhY2tldFwiLCB0aGlzLl9vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiY2xvc2VcIiwgKHJlYXNvbikgPT4gdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCByZWFzb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID1cbiAgICAgICAgICAgIFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkhhbmRzaGFrZShKU09OLnBhcnNlKHBhY2tldC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRQYWNrZXQoXCJwb25nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFwic2VydmVyIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gcGFja2V0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkYXRhXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJtZXNzYWdlXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IGRhdGEucGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX21heFBheWxvYWQgPSBkYXRhLm1heFBheWxvYWQ7XG4gICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIC8vIEluIGNhc2Ugb3BlbiBoYW5kbGVyIGNsb3NlcyBzb2NrZXRcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Jlc2V0UGluZ1RpbWVvdXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGhpcy5fcGluZ1RpbWVvdXRUaW1lcik7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5fcGluZ0ludGVydmFsICsgdGhpcy5fcGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IERhdGUubm93KCkgKyBkZWxheTtcbiAgICAgICAgdGhpcy5fcGluZ1RpbWVvdXRUaW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EcmFpbigpIHtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCwgdGhpcy5fcHJldkJ1ZmZlckxlbik7XG4gICAgICAgIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gICAgICAgIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gICAgICAgIHRoaXMuX3ByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5fZ2V0V3JpdGFibGVQYWNrZXRzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHBhY2tldHMpO1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxlbmd0aCBvZiB3cml0ZUJ1ZmZlclxuICAgICAgICAgICAgLy8gc3BsaWNlIHdyaXRlQnVmZmVyIGFuZCBjYWxsYmFja0J1ZmZlciBvbiBgZHJhaW5gXG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRXcml0YWJsZVBhY2tldHMoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZENoZWNrUGF5bG9hZFNpemUgPSB0aGlzLl9tYXhQYXlsb2FkICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5uYW1lID09PSBcInBvbGxpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoIXNob3VsZENoZWNrUGF5bG9hZFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkU2l6ZSA9IDE7IC8vIGZpcnN0IHBhY2tldCB0eXBlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMud3JpdGVCdWZmZXJbaV0uZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBwYXlsb2FkU2l6ZSA+IHRoaXMuX21heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI7IC8vIHNlcGFyYXRvciArIHBhY2tldCB0eXBlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBoZWFydGJlYXQgdGltZXIgaGFzIGV4cGlyZWQgYnV0IHRoZSBzb2NrZXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RpZmllZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHByaXZhdGUgZm9yIG5vdyBiZWNhdXNlIGl0IGRvZXMgbm90IHJlYWxseSBmaXQgdGhlIFdlYlNvY2tldCBBUEksIGJ1dCBpZiB3ZSBwdXQgaXQgaW4gdGhlXG4gICAgICogYHdyaXRlKClgIG1ldGhvZCB0aGVuIHRoZSBtZXNzYWdlIHdvdWxkIG5vdCBiZSBidWZmZXJlZCBieSB0aGUgU29ja2V0LklPIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICAvKiBwcml2YXRlICovIF9oYXNQaW5nRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9waW5nVGltZW91dFRpbWUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IERhdGUubm93KCkgPiB0aGlzLl9waW5nVGltZW91dFRpbWU7XG4gICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nVGltZW91dFRpbWUgPSAwO1xuICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0V4cGlyZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybiB7U29ja2V0fSBmb3IgY2hhaW5pbmcuXG4gICAgICovXG4gICAgd3JpdGUobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS4gQWxpYXMgb2Yge0BsaW5rIFNvY2tldCN3cml0ZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGU6IHBhY2tldCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZFBhY2tldCh0eXBlLCBkYXRhLCBvcHRpb25zLCBmbikge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGF0YSkge1xuICAgICAgICAgICAgZm4gPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgZm4gPSBvcHRpb25zO1xuICAgICAgICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiY2xvc2luZ1wiID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgXCJjbG9zZWRcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29tcHJlc3MgPSBmYWxzZSAhPT0gb3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgY29uc3QgcGFja2V0ID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldENyZWF0ZVwiLCBwYWNrZXQpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtcbiAgICAgICAgaWYgKGZuKVxuICAgICAgICAgICAgdGhpcy5vbmNlKFwiZmx1c2hcIiwgZm4pO1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRXJyb3IoZXJyKSB7XG4gICAgICAgIFNvY2tldFdpdGhvdXRVcGdyYWRlLnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyeUFsbFRyYW5zcG9ydHMgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlbmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBjbG9zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGltZXJzXG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRoaXMuX3BpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iZWZvcmV1bmxvYWRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLmluZGV4T2YodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblNvY2tldFdpdGhvdXRVcGdyYWRlLnByb3RvY29sID0gcHJvdG9jb2w7XG4vKipcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBXZWJTb2NrZXQtbGlrZSBpbnRlcmZhY2UgdG8gY29ubmVjdCB0byBhbiBFbmdpbmUuSU8gc2VydmVyLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkXG4gKiB3aXRoIG9uZSBvZiB0aGUgYXZhaWxhYmxlIGxvdy1sZXZlbCB0cmFuc3BvcnRzLCBsaWtlIEhUVFAgbG9uZy1wb2xsaW5nLCBXZWJTb2NrZXQgb3IgV2ViVHJhbnNwb3J0LlxuICpcbiAqIFRoaXMgY2xhc3MgY29tZXMgd2l0aCBhbiB1cGdyYWRlIG1lY2hhbmlzbSwgd2hpY2ggbWVhbnMgdGhhdCBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIGZpcnN0XG4gKiBsb3ctbGV2ZWwgdHJhbnNwb3J0LCBpdCB3aWxsIHRyeSB0byB1cGdyYWRlIHRvIGEgYmV0dGVyIHRyYW5zcG9ydC5cbiAqXG4gKiBJbiBvcmRlciB0byBhbGxvdyB0cmVlLXNoYWtpbmcsIHRoZXJlIGFyZSBubyB0cmFuc3BvcnRzIGluY2x1ZGVkLCB0aGF0J3Mgd2h5IHRoZSBgdHJhbnNwb3J0c2Agb3B0aW9uIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgU29ja2V0V2l0aFVwZ3JhZGUsIFdlYlNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldFdpdGhVcGdyYWRlKHtcbiAqICAgdHJhbnNwb3J0czogW1dlYlNvY2tldF1cbiAqIH0pO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFdpdGhVcGdyYWRlIGV4dGVuZHMgU29ja2V0V2l0aG91dFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl91cGdyYWRlcyA9IFtdO1xuICAgIH1cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLm9wdHMudXBncmFkZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl91cGdyYWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2JlKHRoaXMuX3VwZ3JhZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9iZXMgYSB0cmFuc3BvcnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIHRyYW5zcG9ydCBuYW1lXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcHJvYmUobmFtZSkge1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9uVHJhbnNwb3J0T3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkaW5nXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBTb2NrZXRXaXRob3V0VXBncmFkZS5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWJzb2NrZXRcIiA9PT0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJ1cGdyYWRlXCIgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVFcnJvclwiLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIG9uVHJhbnNwb3J0Q2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwidHJhbnNwb3J0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHdoaWxlIHdlJ3JlIHByb2JpbmdcbiAgICAgICAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICAgICAgICAgIG9uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9udXBncmFkZSh0bykge1xuICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAmJiB0by5uYW1lICE9PSB0cmFuc3BvcnQubmFtZSkge1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMuX3VwZ3JhZGVzLmluZGV4T2YoXCJ3ZWJ0cmFuc3BvcnRcIikgIT09IC0xICYmXG4gICAgICAgICAgICBuYW1lICE9PSBcIndlYnRyYW5zcG9ydFwiKSB7XG4gICAgICAgICAgICAvLyBmYXZvciBXZWJUcmFuc3BvcnRcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fdXBncmFkZXMgPSB0aGlzLl9maWx0ZXJVcGdyYWRlcyhkYXRhLnVwZ3JhZGVzKTtcbiAgICAgICAgc3VwZXIub25IYW5kc2hha2UoZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maWx0ZXJVcGdyYWRlcyh1cGdyYWRlcykge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVwZ3JhZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBncmFkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh+dGhpcy50cmFuc3BvcnRzLmluZGV4T2YodXBncmFkZXNbaV0pKVxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkVXBncmFkZXM7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgV2ViU29ja2V0LWxpa2UgaW50ZXJmYWNlIHRvIGNvbm5lY3QgdG8gYW4gRW5naW5lLklPIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZFxuICogd2l0aCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBsb3ctbGV2ZWwgdHJhbnNwb3J0cywgbGlrZSBIVFRQIGxvbmctcG9sbGluZywgV2ViU29ja2V0IG9yIFdlYlRyYW5zcG9ydC5cbiAqXG4gKiBUaGlzIGNsYXNzIGNvbWVzIHdpdGggYW4gdXBncmFkZSBtZWNoYW5pc20sIHdoaWNoIG1lYW5zIHRoYXQgb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBmaXJzdFxuICogbG93LWxldmVsIHRyYW5zcG9ydCwgaXQgd2lsbCB0cnkgdG8gdXBncmFkZSB0byBhIGJldHRlciB0cmFuc3BvcnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldCgpO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRXaXRoVXBncmFkZVxuICovXG5leHBvcnQgY2xhc3MgU29ja2V0IGV4dGVuZHMgU29ja2V0V2l0aFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0eXBlb2YgdXJpID09PSBcIm9iamVjdFwiID8gdXJpIDogb3B0cztcbiAgICAgICAgaWYgKCFvLnRyYW5zcG9ydHMgfHxcbiAgICAgICAgICAgIChvLnRyYW5zcG9ydHMgJiYgdHlwZW9mIG8udHJhbnNwb3J0c1swXSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgIG8udHJhbnNwb3J0cyA9IChvLnRyYW5zcG9ydHMgfHwgW1wicG9sbGluZ1wiLCBcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSlcbiAgICAgICAgICAgICAgICAubWFwKCh0cmFuc3BvcnROYW1lKSA9PiBERUZBVUxUX1RSQU5TUE9SVFNbdHJhbnNwb3J0TmFtZV0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gISF0KTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmksIG8pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbmV4cG9ydCB7IFNvY2tldCB9O1xuZXhwb3J0IHsgU29ja2V0V2l0aG91dFVwZ3JhZGUsIFNvY2tldFdpdGhVcGdyYWRlLCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuZXhwb3J0IGNvbnN0IHByb3RvY29sID0gU29ja2V0LnByb3RvY29sO1xuZXhwb3J0IHsgVHJhbnNwb3J0LCBUcmFuc3BvcnRFcnJvciB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuZXhwb3J0IHsgdHJhbnNwb3J0cyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmV4cG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCB7IHBhcnNlIH0gZnJvbSBcIi4vY29udHJpYi9wYXJzZXVyaS5qc1wiO1xuZXhwb3J0IHsgbmV4dFRpY2sgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCB7IEZldGNoIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLWZldGNoLmpzXCI7XG5leHBvcnQgeyBYSFIgYXMgTm9kZVhIUiB9IGZyb20gXCIuL3RyYW5zcG9ydHMvcG9sbGluZy14aHIubm9kZS5qc1wiO1xuZXhwb3J0IHsgWEhSIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qc1wiO1xuZXhwb3J0IHsgV1MgYXMgTm9kZVdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0Lm5vZGUuanNcIjtcbmV4cG9ydCB7IFdTIGFzIFdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LmpzXCI7XG5leHBvcnQgeyBXVCBhcyBXZWJUcmFuc3BvcnQgfSBmcm9tIFwiLi90cmFuc3BvcnRzL3dlYnRyYW5zcG9ydC5qc1wiO1xuIiwgImltcG9ydCB7IHBhcnNlIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbi8qKlxuICogVVJMIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gdXJsXG4gKiBAcGFyYW0gcGF0aCAtIHRoZSByZXF1ZXN0IHBhdGggb2YgdGhlIGNvbm5lY3Rpb25cbiAqIEBwYXJhbSBsb2MgLSBBbiBvYmplY3QgbWVhbnQgdG8gbWltaWMgd2luZG93LmxvY2F0aW9uLlxuICogICAgICAgIERlZmF1bHRzIHRvIHdpbmRvdy5sb2NhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybCh1cmksIHBhdGggPSBcIlwiLCBsb2MpIHtcbiAgICBsZXQgb2JqID0gdXJpO1xuICAgIC8vIGRlZmF1bHQgdG8gd2luZG93LmxvY2F0aW9uXG4gICAgbG9jID0gbG9jIHx8ICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiYgbG9jYXRpb24pO1xuICAgIGlmIChudWxsID09IHVyaSlcbiAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgbG9jLmhvc3Q7XG4gICAgLy8gcmVsYXRpdmUgcGF0aCBzdXBwb3J0XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBpZiAoXCIvXCIgPT09IHVyaS5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MuaG9zdCArIHVyaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIS9eKGh0dHBzP3x3c3M/KTpcXC9cXC8vLnRlc3QodXJpKSkge1xuICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2MpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBcImh0dHBzOi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFyc2VcbiAgICAgICAgb2JqID0gcGFyc2UodXJpKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gICAgaWYgKCFvYmoucG9ydCkge1xuICAgICAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9eKGh0dHB8d3MpcyQvLnRlc3Qob2JqLnByb3RvY29sKSkge1xuICAgICAgICAgICAgb2JqLnBvcnQgPSBcIjQ0M1wiO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9iai5wYXRoID0gb2JqLnBhdGggfHwgXCIvXCI7XG4gICAgY29uc3QgaXB2NiA9IG9iai5ob3N0LmluZGV4T2YoXCI6XCIpICE9PSAtMTtcbiAgICBjb25zdCBob3N0ID0gaXB2NiA/IFwiW1wiICsgb2JqLmhvc3QgKyBcIl1cIiA6IG9iai5ob3N0O1xuICAgIC8vIGRlZmluZSB1bmlxdWUgaWRcbiAgICBvYmouaWQgPSBvYmoucHJvdG9jb2wgKyBcIjovL1wiICsgaG9zdCArIFwiOlwiICsgb2JqLnBvcnQgKyBwYXRoO1xuICAgIC8vIGRlZmluZSBocmVmXG4gICAgb2JqLmhyZWYgPVxuICAgICAgICBvYmoucHJvdG9jb2wgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICBob3N0ICtcbiAgICAgICAgICAgIChsb2MgJiYgbG9jLnBvcnQgPT09IG9iai5wb3J0ID8gXCJcIiA6IFwiOlwiICsgb2JqLnBvcnQpO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCAiaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBkZWNvbnN0cnVjdFBhY2tldCwgcmVjb25zdHJ1Y3RQYWNrZXQgfSBmcm9tIFwiLi9iaW5hcnkuanNcIjtcbmltcG9ydCB7IGlzQmluYXJ5LCBoYXNCaW5hcnkgfSBmcm9tIFwiLi9pcy1iaW5hcnkuanNcIjtcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDU7XG5leHBvcnQgdmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlIHx8IChQYWNrZXRUeXBlID0ge30pKTtcbi8qKlxuICogQSBzb2NrZXQuaW8gRW5jb2RlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRW5jb2RlciB7XG4gICAgLyoqXG4gICAgICogRW5jb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVwbGFjZXIgLSBjdXN0b20gcmVwbGFjZXIgdG8gcGFzcyBkb3duIHRvIEpTT04ucGFyc2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXBsYWNlcikge1xuICAgICAgICB0aGlzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBhIHBhY2tldCBhcyBhIHNpbmdsZSBzdHJpbmcgaWYgbm9uLWJpbmFyeSwgb3IgYXMgYVxuICAgICAqIGJ1ZmZlciBzZXF1ZW5jZSwgZGVwZW5kaW5nIG9uIHBhY2tldCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHBhY2tldCBvYmplY3RcbiAgICAgKi9cbiAgICBlbmNvZGUob2JqKSB7XG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5FVkVOVCB8fCBvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5BQ0spIHtcbiAgICAgICAgICAgIGlmIChoYXNCaW5hcnkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gZGVjb25zdHJ1Y3RQYWNrZXQob2JqKTtcbiAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuZW5jb2RlQXNTdHJpbmcoZGVjb25zdHJ1Y3Rpb24ucGFja2V0KTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7XG4gICAgICAgIGJ1ZmZlcnMudW5zaGlmdChwYWNrKTsgLy8gYWRkIHBhY2tldCBpbmZvIHRvIGJlZ2lubmluZyBvZiBkYXRhIGxpc3RcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7IC8vIHdyaXRlIGFsbCB0aGUgYnVmZmVyc1xuICAgIH1cbn1cbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29kZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWNvZGVyIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXZpdmVyIC0gY3VzdG9tIHJldml2ZXIgdG8gcGFzcyBkb3duIHRvIEpTT04uc3RyaW5naWZ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmV2aXZlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgcGFja2V0IHN0cmluZyBpbnRvIHBhY2tldCBKU09OLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9iaiAtIGVuY29kZWQgcGFja2V0XG4gICAgICovXG4gICAgYWRkKG9iaikge1xuICAgICAgICBsZXQgcGFja2V0O1xuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdvdCBwbGFpbnRleHQgZGF0YSB3aGVuIHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5kZWNvZGVTdHJpbmcob2JqKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQmluYXJ5RXZlbnQgPSBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQ7XG4gICAgICAgICAgICBpZiAoaXNCaW5hcnlFdmVudCB8fCBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfQUNLKSB7XG4gICAgICAgICAgICAgICAgcGFja2V0LnR5cGUgPSBpc0JpbmFyeUV2ZW50ID8gUGFja2V0VHlwZS5FVkVOVCA6IFBhY2tldFR5cGUuQUNLO1xuICAgICAgICAgICAgICAgIC8vIGJpbmFyeSBwYWNrZXQncyBqc29uXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbmV3IEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KTtcbiAgICAgICAgICAgICAgICAvLyBubyBhdHRhY2htZW50cywgbGFiZWxlZCBiaW5hcnkgYnV0IG5vIGJpbmFyeSBkYXRhIHRvIGZvbGxvd1xuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuYXR0YWNobWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vbi1iaW5hcnkgZnVsbCBwYWNrZXRcbiAgICAgICAgICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJkZWNvZGVkXCIsIHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgdHJ5UGFyc2Uoc3RyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIsIHRoaXMucmV2aXZlcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaXNQYXlsb2FkVmFsaWQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc09iamVjdChwYXlsb2FkKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgfHwgaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcGF5bG9hZFswXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0VWRU5UUy5pbmRleE9mKHBheWxvYWRbMF0pID09PSAtMSkpKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5BQ0s6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0FDSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWFsbG9jYXRlcyBhIHBhcnNlcidzIHJlc291cmNlc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIG1hbmFnZXIgb2YgYSBiaW5hcnkgZXZlbnQncyAnYnVmZmVyIHNlcXVlbmNlJy4gU2hvdWxkXG4gKiBiZSBjb25zdHJ1Y3RlZCB3aGVuZXZlciBhIHBhY2tldCBvZiB0eXBlIEJJTkFSWV9FVkVOVCBpc1xuICogZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCaW5hcnlSZWNvbnN0cnVjdG9yfSBpbml0aWFsaXplZCByZWNvbnN0cnVjdG9yXG4gKi9cbmNsYXNzIEJpbmFyeVJlY29uc3RydWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhY2tldCkge1xuICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gcGFja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBjb25uZWN0aW9uXG4gICAgICogYWZ0ZXIgYSBCSU5BUllfRVZFTlQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheUJ1ZmZlcn0gYmluRGF0YSAtIHRoZSByYXcgYmluYXJ5IGRhdGEgcmVjZWl2ZWRcbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgT2JqZWN0fSByZXR1cm5zIG51bGwgaWYgbW9yZSBiaW5hcnkgZGF0YSBpcyBleHBlY3RlZCBvclxuICAgICAqICAgYSByZWNvbnN0cnVjdGVkIHBhY2tldCBvYmplY3QgaWYgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHRha2VCaW5hcnlEYXRhKGJpbkRhdGEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goYmluRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09PSB0aGlzLnJlY29uUGFjay5hdHRhY2htZW50cykge1xuICAgICAgICAgICAgLy8gZG9uZSB3aXRoIGJ1ZmZlciBsaXN0XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSByZWNvbnN0cnVjdFBhY2tldCh0aGlzLnJlY29uUGFjaywgdGhpcy5idWZmZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgfVxufVxuIiwgImNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCB3aXRoTmF0aXZlQmxvYiA9IHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlRmlsZSA9IHR5cGVvZiBGaWxlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChGaWxlKSA9PT0gXCJbb2JqZWN0IEZpbGVDb25zdHJ1Y3Rvcl1cIik7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYSBCdWZmZXIsIGFuIEFycmF5QnVmZmVyLCBhIEJsb2Igb3IgYSBGaWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShvYmopIHtcbiAgICByZXR1cm4gKCh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiYgKG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhvYmopKSkgfHxcbiAgICAgICAgKHdpdGhOYXRpdmVCbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IGlzQmluYXJ5IH0gZnJvbSBcIi4vaXMtYmluYXJ5LmpzXCI7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29uc3RydWN0UGFja2V0KHBhY2tldCkge1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICBjb25zdCBwYWNrZXREYXRhID0gcGFja2V0LmRhdGE7XG4gICAgY29uc3QgcGFjayA9IHBhY2tldDtcbiAgICBwYWNrLmRhdGEgPSBfZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0RGF0YSwgYnVmZmVycyk7XG4gICAgcGFjay5hdHRhY2htZW50cyA9IGJ1ZmZlcnMubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmluYXJ5ICdhdHRhY2htZW50cydcbiAgICByZXR1cm4geyBwYWNrZXQ6IHBhY2ssIGJ1ZmZlcnM6IGJ1ZmZlcnMgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvbnN0cnVjdFBhY2tldChkYXRhLCBidWZmZXJzKSB7XG4gICAgaWYgKCFkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICBpZiAoaXNCaW5hcnkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB7IF9wbGFjZWhvbGRlcjogdHJ1ZSwgbnVtOiBidWZmZXJzLmxlbmd0aCB9O1xuICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdEYXRhW2ldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFbaV0sIGJ1ZmZlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0sIGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogUmVjb25zdHJ1Y3RzIGEgYmluYXJ5IHBhY2tldCBmcm9tIGl0cyBwbGFjZWhvbGRlciBwYWNrZXQgYW5kIGJ1ZmZlcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gZXZlbnQgcGFja2V0IHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBidWZmZXJzIC0gYmluYXJ5IGJ1ZmZlcnMgdG8gcHV0IGluIHBsYWNlaG9sZGVyIHBvc2l0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSByZWNvbnN0cnVjdGVkIHBhY2tldFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG9uKG9iaiwgZXYsIGZuKSB7XG4gICAgb2JqLm9uKGV2LCBmbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YkRlc3Ryb3koKSB7XG4gICAgICAgIG9iai5vZmYoZXYsIGZuKTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tIFwic29ja2V0LmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgb24gfSBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHsgRW1pdHRlciwgfSBmcm9tIFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiO1xuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbywgbnNwLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc3RhdGUgd2FzIHJlY292ZXJlZCBhZnRlciBhIHRlbXBvcmFyeSBkaXNjb25uZWN0aW9uLiBJbiB0aGF0IGNhc2UsIGFueSBtaXNzZWQgcGFja2V0cyB3aWxsXG4gICAgICAgICAqIGJlIHRyYW5zbWl0dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHJlY2VpdmVkIGJlZm9yZSB0aGUgQ09OTkVDVCBwYWNrZXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHRoYXQgd2lsbCBiZSBzZW50IG9uY2UgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHF1ZXVlIG9mIHBhY2tldHMgdG8gYmUgc2VudCB3aXRoIHJldHJ5IGluIGNhc2Ugb2YgZmFpbHVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogUGFja2V0cyBhcmUgc2VudCBvbmUgYnkgb25lLCBlYWNoIHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LCBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhlIGRlbGl2ZXJ5IG9yZGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2VxdWVuY2UgdG8gZ2VuZXJhdGUgdGhlIElEIG9mIHRoZSB7QGxpbmsgUXVldWVkUGFja2V0fS5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlU2VxID0gMDtcbiAgICAgICAgdGhpcy5pZHMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAgY29udGFpbmluZyBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgd2l0aEVycm9yYCBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGhhbmRsZXJzIHRoYXQgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50OlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGBzb2NrZXQuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYCB3aXRoIGBhY2tUaW1lb3V0YCBvcHRpb25cbiAgICAgICAgICogLSBgc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYFxuICAgICAgICAgKiAtIGBjb25zdCB2YWx1ZSA9IGF3YWl0IHNvY2tldC5lbWl0V2l0aEFjayhcInRlc3RcIilgXG4gICAgICAgICAqXG4gICAgICAgICAqIEZyb20gdGhvc2UgdGhhdCBkb24ndDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsICh2YWx1ZSkgPT4geyAuLi4gfSk7YFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3Igd2hlbjpcbiAgICAgICAgICpcbiAgICAgICAgICogLSB0aGUgdGltZW91dCBpcyByZWFjaGVkXG4gICAgICAgICAqIC0gdGhlIHNvY2tldCBnZXRzIGRpc2Nvbm5lY3RlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIHNpbXBseSBkaXNjYXJkZWQgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZVxuICAgICAgICAgKiBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY2tzID0ge307XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5pbyA9IGlvO1xuICAgICAgICB0aGlzLm5zcCA9IG5zcDtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hdXRoKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSBvcHRzLmF1dGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMpO1xuICAgICAgICBpZiAodGhpcy5pby5fYXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmRpc2Nvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyB0cnVlXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZ2V0IGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIG9wZW4sIGNsb3NlIGFuZCBwYWNrZXQgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YkV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VicylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaW8gPSB0aGlzLmlvO1xuICAgICAgICB0aGlzLnN1YnMgPSBbXG4gICAgICAgICAgICBvbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb24oaW8sIFwicGFja2V0XCIsIHRoaXMub25wYWNrZXQuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmIChSRVNFUlZFRF9FVkVOVFMuaGFzT3duUHJvcGVydHkoZXYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGV2LnRvU3RyaW5nKCkgKyAnXCIgaXMgYSByZXNlcnZlZCBldmVudCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy51bnNoaWZ0KGV2KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdHMucmV0cmllcyAmJiAhdGhpcy5mbGFncy5mcm9tUXVldWUgJiYgIXRoaXMuZmxhZ3Mudm9sYXRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUXVldWUoYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IChfYiA9IChfYSA9IHRoaXMuaW8uZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iud3JpdGFibGU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQgJiYgISgoX2MgPSB0aGlzLmlvLmVuZ2luZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLl9oYXNQaW5nRXhwaXJlZCgpKTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgIWlzVHJhbnNwb3J0V3JpdGFibGU7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMucGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlZ2lzdGVyQWNrQ2FsbGJhY2soaWQsIGFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAoX2EgPSB0aGlzLmZsYWdzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuX29wdHMuYWNrVGltZW91dDtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY2tzW2lkXSA9IGFjaztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5pby5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWNrc1tpZF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRCdWZmZXJbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGFjaykge1xuICAgICAgICAgICAgICAgICAgICBhY2sobnVsbCwgLi4ucmVzcG9uc2VBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrZXQucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFja2V0KTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlLCBhbmQgd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBAcGFyYW0gZm9yY2UgLSB3aGV0aGVyIHRvIHJlc2VuZCBhIHBhY2tldCB0aGF0IGhhcyBub3QgYmVlbiBhY2tub3dsZWRnZWQgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9kcmFpblF1ZXVlKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9xdWV1ZVswXTtcbiAgICAgICAgaWYgKHBhY2tldC5wZW5kaW5nICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhY2tldC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnRyeUNvdW50Kys7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBwYWNrZXQuZmxhZ3M7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBwYWNrZXQuYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcGFja2V0KHBhY2tldCkge1xuICAgICAgICBwYWNrZXQubnNwID0gdGhpcy5uc3A7XG4gICAgICAgIHRoaXMuaW8uX3BhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYG9wZW5gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdXRoID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hdXRoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb25uZWN0UGFja2V0KHRoaXMuYXV0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBDT05ORUNUIHBhY2tldCB0byBpbml0aWF0ZSB0aGUgU29ja2V0LklPIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3NlbmRDb25uZWN0UGFja2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5wYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkaXNjb25uZWN0XCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLl9jbGVhckFja3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbVxuICAgICAqIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckFja3MoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYWNrcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQnVmZmVyZWQgPSB0aGlzLnNlbmRCdWZmZXIuc29tZSgocGFja2V0KSA9PiBTdHJpbmcocGFja2V0LmlkKSA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFpc0J1ZmZlcmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90ZTogaGFuZGxlcnMgdGhhdCBkbyBub3QgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50IGFyZSBpZ25vcmVkIGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBhY2sgPSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChhY2sud2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjay5jYWxsKHRoaXMsIG5ldyBFcnJvcihcInNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIHNvY2tldCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbnBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2FtZU5hbWVzcGFjZSA9IHBhY2tldC5uc3AgPT09IHRoaXMubnNwO1xuICAgICAgICBpZiAoIXNhbWVOYW1lc3BhY2UpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiBwYWNrZXQuZGF0YS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNvbm5lY3QocGFja2V0LmRhdGEuc2lkLCBwYWNrZXQuZGF0YS5waWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0X2Vycm9yXCIsIG5ldyBFcnJvcihcIkl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIHJlYWNoIGEgU29ja2V0LklPIHNlcnZlciBpbiB2Mi54IHdpdGggYSB2My54IGNsaWVudCwgYnV0IHRoZXkgYXJlIG5vdCBjb21wYXRpYmxlIChtb3JlIGluZm9ybWF0aW9uIGhlcmU6IGh0dHBzOi8vc29ja2V0LmlvL2RvY3MvdjMvbWlncmF0aW5nLWZyb20tMi14LXRvLTMtMC8pXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMub25ldmVudChwYWNrZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkFDSzpcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHRoaXMub25kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocGFja2V0LmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGVyci5kYXRhID0gcGFja2V0LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZXZlbnQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKE9iamVjdC5mcmVlemUoYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRFdmVudChhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlMaXN0ZW5lcnMgJiYgdGhpcy5fYW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIGlmICh0aGlzLl9waWQgJiYgYXJncy5sZW5ndGggJiYgdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdE9mZnNldCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhbiBhY2sgY2FsbGJhY2sgdG8gZW1pdCB3aXRoIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhY2soaWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBzZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3VibGUgY2FsbGJhY2tzXG4gICAgICAgICAgICBpZiAoc2VudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkFDSyxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBhY2tub3dsZWRnZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmFjayhwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGlmICh0eXBlb2YgYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUUgYWNrIGlzIGluY29ycmVjdGx5IGluZmVycmVkIGFzICduZXZlcidcbiAgICAgICAgaWYgKGFjay53aXRoRXJyb3IpIHtcbiAgICAgICAgICAgIHBhY2tldC5kYXRhLnVuc2hpZnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2suYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jb25uZWN0KGlkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IHBpZCAmJiB0aGlzLl9waWQgPT09IHBpZDtcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkOyAvLyBkZWZpbmVkIG9ubHkgaWYgY29ubmVjdGlvbiBzdGF0ZSByZWNvdmVyeSBpcyBlbmFibGVkXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0QnVmZmVyZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLl9kcmFpblF1ZXVlKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGJ1ZmZlcmVkIGV2ZW50cyAocmVjZWl2ZWQgYW5kIGVtaXR0ZWQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbWl0QnVmZmVyZWQoKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5mb3JFYWNoKChhcmdzKSA9PiB0aGlzLmVtaXRFdmVudChhcmdzKSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgocGFja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBkaXNjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZm9yY2VkIGNsaWVudC9zZXJ2ZXIgc2lkZSBkaXNjb25uZWN0aW9ucyxcbiAgICAgKiB0aGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBtYW5hZ2VyIHN0b3BzIHRyYWNraW5nIHVzIGFuZFxuICAgICAqIHRoYXQgcmVjb25uZWN0aW9ucyBkb24ndCBnZXQgdHJpZ2dlcmVkIGZvciB0aGlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzKSB7XG4gICAgICAgICAgICAvLyBjbGVhbiBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIHJlY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWJEZXN0cm95KSA9PiBzdWJEZXN0cm95KCkpO1xuICAgICAgICAgICAgdGhpcy5zdWJzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW9bXCJfZGVzdHJveVwiXSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldCBtYW51YWxseS4gSW4gdGhhdCBjYXNlLCB0aGUgc29ja2V0IHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBTb2NrZXQgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBNYW5hZ2VyfSwgdGhlIGxvdy1sZXZlbCBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gICAgICogICAvLyBjb25zb2xlLmxvZyhyZWFzb24pOyBwcmludHMgXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IFBhY2tldFR5cGUuRElTQ09OTkVDVCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAvLyBmaXJlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgZGlzY29ubmVjdCgpfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXByZXNzIGZsYWcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5jb21wcmVzcyhmYWxzZSkuZW1pdChcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXByZXNzIC0gaWYgYHRydWVgLCBjb21wcmVzc2VzIHRoZSBzZW5kaW5nIGRhdGFcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjb21wcmVzcyhjb21wcmVzcykge1xuICAgICAgICB0aGlzLmZsYWdzLmNvbXByZXNzID0gY29tcHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBldmVudCBtZXNzYWdlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoaXMgc29ja2V0IGlzIG5vdFxuICAgICAqIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC52b2xhdGlsZS5lbWl0KFwiaGVsbG9cIik7IC8vIHRoZSBzZXJ2ZXIgbWF5IG9yIG1heSBub3QgcmVjZWl2ZSBpdFxuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIGdldCB2b2xhdGlsZSgpIHtcbiAgICAgICAgdGhpcy5mbGFncy52b2xhdGlsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgICogZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgd2l0aG91dCBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyOlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudGltZW91dCg1MDAwKS5lbWl0KFwibXktZXZlbnRcIiwgKGVycikgPT4ge1xuICAgICAqICAgaWYgKGVycikge1xuICAgICAqICAgICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIHRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLmZsYWdzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQub25BbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvbkFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnByZXBlbmRBbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBwcmVwZW5kQW55KGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBnb3QgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBzb2NrZXQub25BbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnkoKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9mZkFueShsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueUxpc3RlbmVycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogTm90ZTogYWNrbm93bGVkZ2VtZW50cyBzZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIG5vdCBpbmNsdWRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBzZW50IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZyhjYXRjaEFsbExpc3RlbmVyKTtcbiAgICAgKlxuICAgICAqIC8vIG9yIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICogc29ja2V0Lm9mZkFueU91dGdvaW5nKCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gW2xpc3RlbmVyXSAtIHRoZSBjYXRjaC1hbGwgbGlzdGVuZXIgKG9wdGlvbmFsKVxuICAgICAqL1xuICAgIG9mZkFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIGxpc3RlbmluZyBmb3IgYW55IGV2ZW50IHRoYXQgaXMgc3BlY2lmaWVkLiBUaGlzIGFycmF5IGNhbiBiZSBtYW5pcHVsYXRlZCxcbiAgICAgKiBlLmcuIHRvIHJlbW92ZSBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuZXJzQW55T3V0Z29pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZ5IHRoZSBsaXN0ZW5lcnMgZm9yIGVhY2ggcGFja2V0IHNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyAmJiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCYWNrb2ZmKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXggfHwgMTAwMDA7XG4gICAgdGhpcy5mYWN0b3IgPSBvcHRzLmZhY3RvciB8fCAyO1xuICAgIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDA7XG59XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwgImltcG9ydCB7IFNvY2tldCBhcyBFbmdpbmUsIGluc3RhbGxUaW1lckZ1bmN0aW9ucywgbmV4dFRpY2ssIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuaW1wb3J0ICogYXMgcGFyc2VyIGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG5pbXBvcnQgeyBvbiB9IGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgeyBCYWNrb2ZmIH0gZnJvbSBcIi4vY29udHJpYi9iYWNrbzIuanNcIjtcbmltcG9ydCB7IEVtaXR0ZXIsIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmV4cG9ydCBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uc3BzID0ge307XG4gICAgICAgIHRoaXMuc3VicyA9IFtdO1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIG9wdHMucGF0aCA9IG9wdHMucGF0aCB8fCBcIi9zb2NrZXQuaW9cIjtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IEJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVjb25uZWN0aW9uQXR0ZW1wdHModikge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cyA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheSh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheTtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXkgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNaW4odik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByYW5kb21pemF0aW9uRmFjdG9yKHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I7XG4gICAgICAgIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3IgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRKaXR0ZXIodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheU1heCh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXlNYXggPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNYXgodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lb3V0KHYpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB2O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyeWluZyB0byByZWNvbm5lY3QgaWYgcmVjb25uZWN0aW9uIGlzIGVuYWJsZWQgYW5kIHdlIGhhdmUgbm90XG4gICAgICogc3RhcnRlZCByZWNvbm5lY3RpbmcgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG1heWJlUmVjb25uZWN0T25PcGVuKCkge1xuICAgICAgICAvLyBPbmx5IHRyeSB0byByZWNvbm5lY3QgaWYgaXQncyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjb25uZWN0aW5nXG4gICAgICAgIGlmICghdGhpcy5fcmVjb25uZWN0aW5nICYmXG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gJiZcbiAgICAgICAgICAgIHRoaXMuYmFja29mZi5hdHRlbXB0cyA9PT0gMCkge1xuICAgICAgICAgICAgLy8ga2VlcHMgcmVjb25uZWN0aW9uIGZyb20gZmlyaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZWNvbm5lY3Rpb24gbG9vcFxuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBgc29ja2V0YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gb3B0aW9uYWwsIGNhbGxiYWNrXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG9wZW4oZm4pIHtcbiAgICAgICAgaWYgKH50aGlzLl9yZWFkeVN0YXRlLmluZGV4T2YoXCJvcGVuXCIpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSh0aGlzLnVyaSwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAvLyBlbWl0IGBvcGVuYFxuICAgICAgICBjb25zdCBvcGVuU3ViRGVzdHJveSA9IG9uKHNvY2tldCwgXCJvcGVuXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYub25vcGVuKCk7XG4gICAgICAgICAgICBmbiAmJiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgICBmbihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIG5vIGZuIHRvIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb25uZWN0T25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVtaXQgYGVycm9yYFxuICAgICAgICBjb25zdCBlcnJvclN1YiA9IG9uKHNvY2tldCwgXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgICAgICAgICAgIC8vIHNldCB0aW1lclxuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb3BlblN1YkRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKG5ldyBFcnJvcihcInRpbWVvdXRcIikpO1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1YnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnMucHVzaChvcGVuU3ViRGVzdHJveSk7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBvcGVuKClcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBjb25uZWN0KGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW4oZm4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICAvLyBjbGVhciBvbGQgc3Vic1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgLy8gbWFyayBhcyBvcGVuXG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJvcGVuXCIpO1xuICAgICAgICAvLyBhZGQgbmV3IHN1YnNcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbihzb2NrZXQsIFwiZGF0YVwiLCB0aGlzLm9uZGF0YS5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImVycm9yXCIsIHRoaXMub25lcnJvci5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb24odGhpcy5kZWNvZGVyLCBcImRlY29kZWRcIiwgdGhpcy5vbmRlY29kZWQuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHBpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucGluZygpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBkYXRhLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVyLmFkZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwicGFyc2UgZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gcGFyc2VyIGZ1bGx5IGRlY29kZXMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGVjb2RlZChwYWNrZXQpIHtcbiAgICAgICAgLy8gdGhlIG5leHRUaWNrIGNhbGwgcHJldmVudHMgYW4gZXhjZXB0aW9uIGluIGEgdXNlci1wcm92aWRlZCBldmVudCBsaXN0ZW5lciBmcm9tIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0aW9uIGR1ZSB0byBhIFwicGFyc2UgZXJyb3JcIlxuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgdGhlIGdpdmVuIGBuc3BgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ja2V0fVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzb2NrZXQobnNwLCBvcHRzKSB7XG4gICAgICAgIGxldCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQodGhpcywgbnNwLCBvcHRzKTtcbiAgICAgICAgICAgIHRoaXMubnNwc1tuc3BdID0gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2F1dG9Db25uZWN0ICYmICFzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICBzb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc29ja2V0IGNsb3NlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Rlc3Ryb3koc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IG5zcHMgPSBPYmplY3Qua2V5cyh0aGlzLm5zcHMpO1xuICAgICAgICBmb3IgKGNvbnN0IG5zcCBvZiBuc3BzKSB7XG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gdGhpcy5lbmNvZGVyLmVuY29kZShwYWNrZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmVuZ2luZS53cml0ZShlbmNvZGVkUGFja2V0c1tpXSwgcGFja2V0Lm9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIHRyYW5zcG9ydCBzdWJzY3JpcHRpb25zIGFuZCBwYWNrZXQgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZGVjb2Rlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nsb3NlKCkge1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW46XG4gICAgICpcbiAgICAgKiAtIHRoZSBsb3ctbGV2ZWwgZW5naW5lIGlzIGNsb3NlZFxuICAgICAqIC0gdGhlIHBhcnNlciBlbmNvdW50ZXJlZCBhIGJhZGx5IGZvcm1hdHRlZCBwYWNrZXRcbiAgICAgKiAtIGFsbCBzb2NrZXRzIGFyZSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jbG9zZShyZWFzb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIChfYSA9IHRoaXMuZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW9uICYmICF0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW5nIHx8IHRoaXMuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9mYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5iYWNrb2ZmLmR1cmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2F0dGVtcHRcIiwgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBmb3IgdGhlIGNhc2Ugc29ja2V0IGNsb3NlZCBpbiBhYm92ZSBldmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJyZWNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyB1cmwgfSBmcm9tIFwiLi91cmwuanNcIjtcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgaW8gPSBuZXcgTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIGNhY2hlW2lkXSA9IG5ldyBNYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaW8gPSBjYWNoZVtpZF07XG4gICAgfVxuICAgIGlmIChwYXJzZWQucXVlcnkgJiYgIW9wdHMucXVlcnkpIHtcbiAgICAgICAgb3B0cy5xdWVyeSA9IHBhcnNlZC5xdWVyeUtleTtcbiAgICB9XG4gICAgcmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCwgb3B0cyk7XG59XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXIsXG4gICAgU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBwcm90b2NvbCB9IGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMgZm9yIHN0YW5kYWxvbmUgYnVpbGQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBNYW5hZ2VyLCBTb2NrZXQsIGxvb2t1cCBhcyBpbywgbG9va3VwIGFzIGNvbm5lY3QsIGxvb2t1cCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgRmV0Y2gsIE5vZGVYSFIsIFhIUiwgTm9kZVdlYlNvY2tldCwgV2ViU29ja2V0LCBXZWJUcmFuc3BvcnQsIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbiIsICJpbXBvcnQgeyBpbywgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvLWNsaWVudCc7XHJcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSAnLi9FdmVudEJ1cyc7XHJcblxyXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0U2VydmljZSB7XHJcblx0cHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgZXZlbnRCdXM6IEV2ZW50QnVzO1xyXG5cdHByaXZhdGUgYXBpQmFzZVVybDogc3RyaW5nO1xyXG5cdC8vcHJpdmF0ZSByZWNlaXZlZEV2ZW50czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdC8vcHJpdmF0ZSByZWNvbm5lY3RBdHRlbXB0cyA9IDA7XHJcblx0cHJpdmF0ZSBtYXhSZWNvbm5lY3RBdHRlbXB0cyA9IDEwO1xyXG5cdHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihldmVudEJ1czogRXZlbnRCdXMsIGFwaUJhc2VVcmw6IHN0cmluZykge1xyXG5cdFx0dGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xyXG5cdFx0dGhpcy5hcGlCYXNlVXJsID0gYXBpQmFzZVVybDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0EgV2ViU29ja2V0IFx1MDQ0MVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0M1xyXG5cdCAqL1xyXG5cdGNvbm5lY3QoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCkge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnV2ViU29ja2V0IFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0QnKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQzN1x1MDQzMlx1MDQzQlx1MDQzNVx1MDQzQVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgVVJMIFx1MDQzMVx1MDQzNVx1MDQzNyAvYXBpXHJcblx0XHRjb25zdCB3c1VybCA9IHRoaXMuYXBpQmFzZVVybC5yZXBsYWNlKCcvYXBpJywgJycpO1xyXG5cdFx0Y29uc29sZS5sb2coJ1x1RDgzRFx1REQwQyBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNBIFdlYlNvY2tldDonLCB3c1VybCk7XHJcblxyXG5cdFx0dGhpcy5zb2NrZXQgPSBpbyh3c1VybCwge1xyXG5cdFx0XHR0cmFuc3BvcnRzOiBbJ3dlYnNvY2tldCcsICdwb2xsaW5nJ10sXHJcblx0XHRcdHJlY29ubmVjdGlvbjogdHJ1ZSxcclxuXHRcdFx0cmVjb25uZWN0aW9uRGVsYXk6IDEwMDAsXHJcblx0XHRcdHJlY29ubmVjdGlvbkRlbGF5TWF4OiA1MDAwLFxyXG5cdFx0XHRyZWNvbm5lY3Rpb25BdHRlbXB0czogdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyxcclxuXHRcdFx0dGltZW91dDogMjAwMDAsXHJcblx0XHRcdGZvcmNlTmV3OiBmYWxzZSxcclxuXHRcdFx0dXBncmFkZTogdHJ1ZSxcclxuXHRcdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzOFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzOFxyXG5cdFx0XHRhdXRvQ29ubmVjdDogdHJ1ZSxcclxuXHRcdFx0cmVtZW1iZXJVcGdyYWRlOiB0cnVlLFxyXG5cdFx0XHRyZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xyXG5cdFx0dGhpcy5zdGFydFByb2FjdGl2ZVBpbmcoKTsgLy8gXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0MzhcdTA0M0RcdTA0MzNcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0FcdTA0MzggV2ViU29ja2V0IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdjb25uZWN0JywgKCkgPT4ge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXHUyNzA1IFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0QnKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdkaXNjb25uZWN0JywgKHJlYXNvbikgPT4ge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXHUyNzRDIFdlYlNvY2tldCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0Q6JywgcmVhc29uKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdjb25uZWN0X2Vycm9yJywgKGVycm9yKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgV2ViU29ja2V0OicsIGVycm9yKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5vZGVzIFVwZGF0ZSBFdmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0dGhpcy5zb2NrZXQub24oXHJcblx0XHRcdCdub2RlX3R5cGVfY2hhbmdlZCcsXHJcblx0XHRcdChkYXRhOiB7IGdyYXBoX2lkOiBzdHJpbmc7IG5vZGVfaWQ6IHN0cmluZzsgbm9kZV90eXBlOiBzdHJpbmcgfSwgY2FsbGJhY2s/OiAocmVzcG9uc2U6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gdm9pZCkgPT4ge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdcdUQ4M0RcdURDRTEgV2ViU29ja2V0IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRTogbm9kZV90eXBlX2NoYW5nZWQnLCBkYXRhKTtcclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLW5vZGUtdHlwZS1jaGFuZ2VkJywge1xyXG5cdFx0XHRcdFx0Z3JhcGhJZDogZGF0YS5ncmFwaF9pZCxcclxuXHRcdFx0XHRcdG5vZGVJZDogZGF0YS5ub2RlX2lkLFxyXG5cdFx0XHRcdFx0bm9kZVR5cGU6IGRhdGEubm9kZV90eXBlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0XHRjYWxsYmFjayh7IHN0YXR1czogJ29rJyB9KTsgLy8gXHUwNDFFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnNvY2tldC5vbihcclxuXHRcdFx0J2dyYXBoX3RpdGxlX3VwZGF0ZWQnLFxyXG5cdFx0XHQoZGF0YTogeyBncmFwaF9pZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0sIGNhbGxiYWNrPzogKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHZvaWQpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnXHVEODNEXHVEQ0UxIFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0U6IGdyYXBoX3RpdGxlX3VwZGF0ZWQnLCBkYXRhKTtcclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLWdyYXBoLXRpdGxlLXVwZGF0ZWQnLCBkYXRhKTtcclxuXHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGNhbGxiYWNrKHsgc3RhdHVzOiAnb2snIH0pOyAvLyBcdTA0MUVcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKFxyXG5cdFx0XHQnbm9kZV90aXRsZV91cGRhdGVkJyxcclxuXHRcdFx0KGRhdGE6IHsgZ3JhcGhfaWQ6IHN0cmluZzsgbm9kZV9pZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0sIGNhbGxiYWNrPzogKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHZvaWQpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnXHVEODNEXHVEQ0UxIFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0U6IG5vZGVfdGl0bGVfdXBkYXRlZCcsIGRhdGEpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLW5vZGUtdGl0bGUtdXBkYXRlZCcsIGRhdGEpO1xyXG5cdFx0XHRcdGlmIChjYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2soeyBzdGF0dXM6ICdvaycgfSk7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNFXHUwNDQyIFdlYlNvY2tldCBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzBcclxuXHQgKi9cclxuXHRkaXNjb25uZWN0KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc29ja2V0KSB7XHJcblx0XHRcdHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0dGhpcy5zb2NrZXQgPSBudWxsO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnV2ViU29ja2V0IFx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRCcpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zdG9wUHJvYWN0aXZlUGluZygpOyAvLyBcdTA0MUVcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQzOFx1MDQzRFx1MDQzM1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0M1x1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHQgKi9cclxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkID8/IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0MzhcdTA0M0RcdTA0MzMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcbiAgICBwcml2YXRlIHN0YXJ0UHJvYWN0aXZlUGluZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3BQcm9hY3RpdmVQaW5nKCk7IC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Qlx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzBcdTA0M0IgXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHJcbiAgICAgICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LmNvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NsaWVudCBzZW5kaW5nIHByb2FjdGl2ZSBwaW5nLi4uJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2xpZW50OiBObyBwb25nIHJlc3BvbnNlIHJlY2VpdmVkIGZvciBwcm9hY3RpdmUgcGluZyB3aXRoaW4gdGltZW91dC4gRm9yY2luZyByZWNvbm5lY3QuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9LCAzMDAwKTsgLy8gXHUwNDIyXHUwNDMwXHUwNDM5XHUwNDNDXHUwNDMwXHUwNDQzXHUwNDQyIFx1MDQzRVx1MDQzNlx1MDQzOFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQzOFx1MDQzRFx1MDQzMyBcdTA0M0VcdTA0NDIgXHUwNDQxXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDMwICgzIFx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQ0QilcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgY2FsbGJhY2sgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQyIFx1MDQ0MVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzMFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnY2xpZW50X3Byb2FjdGl2ZV9waW5nJywgKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWNrVGltZW91dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gJ3BvbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgcmVjZWl2ZWQgcHJvYWN0aXZlIHBvbmcuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDbGllbnQ6IEludmFsaWQgcG9uZyByZXNwb25zZSBvciBubyByZXNwb25zZSBmb3IgcHJvYWN0aXZlIHBpbmcuIEZvcmNpbmcgcmVjb25uZWN0LicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb2NrZXQgJiYgIXRoaXMuc29ja2V0LmNvbm5lY3RlZCkgeyAvLyBcdTA0MTdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NEMgXHUwNDQzXHUwNDMxXHUwNDM4XHUwNDQwXHUwNDMwXHUwNDM1XHUwNDNDICcmJiAhdGhpcy5zb2NrZXQuY29ubmVjdGluZydcclxuICAgICAgICAgICAgICAgIC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0FcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRCwgU29ja2V0LklPIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0NDFcdTA0MzBcdTA0M0MgXHUwNDQzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQzQyxcclxuICAgICAgICAgICAgICAgIC8vIFx1MDQ0Mlx1MDQzMFx1MDQzQSBcdTA0M0FcdTA0MzBcdTA0M0EgcmVjb25uZWN0aW9uOiB0cnVlLiBcdTA0MjBcdTA0NDNcdTA0NDdcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDNFXHUwNDMyIGNvbm5lY3QoKSBcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQzN1x1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzQy5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgcHJvYWN0aXZlIHBpbmc6IFNvY2tldCBub3QgY29ubmVjdGVkLiBSZWx5aW5nIG9uIFNvY2tldC5JT1xcJ3MgYXV0by1yZWNvbm5lY3QgbG9naWMuJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDMyXHUwNDRCIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0MzZcdTA0MzUgXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMlx1MDQzRFx1MDQzRSBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgdGhpcy5jb25uZWN0KCkgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLFxyXG4gICAgICAgICAgICAgICAgLy8gXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDRDXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMDApOyAvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDRCXHUwNDM1IDUgXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDM4XHUwNDNEXHUwNDMzLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcFByb2FjdGl2ZVBpbmcoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG5cdFx0XHRjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG5cdFx0XHR0aGlzLnBpbmdJbnRlcnZhbElkID0gbnVsbDtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1Byb2FjdGl2ZSBwaW5nIHN0b3BwZWQuJyk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHlEQUFBQSxTQUFBO0FBQUE7QUFZQSxRQUFJLE1BQXVDO0FBQ3pDLE9BQUMsV0FBVztBQUVKO0FBR1YsWUFDRSxPQUFPLG1DQUFtQyxlQUMxQyxPQUFPLCtCQUErQixnQ0FDcEMsWUFDRjtBQUNBLHlDQUErQiw0QkFBNEIsSUFBSSxNQUFNLENBQUM7QUFBQSxRQUN4RTtBQUNVLFlBQUksZUFBZTtBQU03QixZQUFJLHFCQUFxQixPQUFPLElBQUksZUFBZTtBQUNuRCxZQUFJLG9CQUFvQixPQUFPLElBQUksY0FBYztBQUNqRCxZQUFJLHNCQUFzQixPQUFPLElBQUksZ0JBQWdCO0FBQ3JELFlBQUkseUJBQXlCLE9BQU8sSUFBSSxtQkFBbUI7QUFDM0QsWUFBSSxzQkFBc0IsT0FBTyxJQUFJLGdCQUFnQjtBQUNyRCxZQUFJLHNCQUFzQixPQUFPLElBQUksZ0JBQWdCO0FBQ3JELFlBQUkscUJBQXFCLE9BQU8sSUFBSSxlQUFlO0FBQ25ELFlBQUkseUJBQXlCLE9BQU8sSUFBSSxtQkFBbUI7QUFDM0QsWUFBSSxzQkFBc0IsT0FBTyxJQUFJLGdCQUFnQjtBQUNyRCxZQUFJLDJCQUEyQixPQUFPLElBQUkscUJBQXFCO0FB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QSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGlCQUFpQjtBQUFBLFVBQ2pCLGFBQWE7QUFBQSxVQUNiLFVBQVU7QUFBQSxVQUNWLGNBQWM7QUFBQSxVQUNkLFFBQVE7QUFBQSxVQUNSLGFBQWE7QUFBQSxVQUNiLHlCQUF5QjtBQUFBLFVBQ3pCLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLHlCQUF5QjtBQUFBLFVBQ3pCLHVCQUF1QjtBQUFBLFVBQ3ZCLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQTtBQUFBLFVBRU4sT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsY0FBYztBQUFBLFVBQ2QsWUFBWTtBQUFBLFVBQ1osV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2YsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1Asb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsMkJBQTJCO0FBQUEsVUFDM0IsK0JBQStCO0FBQUEsVUFDL0IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsVUFBVTtBQUFBLFVBQ1YsWUFBWTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsaUJBQWlCO0FBQUEsVUFDakIsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YsMkJBQTJCO0FBQUEsVUFDM0IsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsNEJBQTRCO0FBQUEsVUFDNUIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsOEJBQThCO0FBQUEsVUFDOUIsVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsZUFBZTtBQUFBLFVBQ2YsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsY0FBYztBQUFBLFVBQ2QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sa0JBQWtCO0FBQUEsVUFDbEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsVUFBVTtBQUFBLFVBQ1Ysa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1oscUJBQXFCO0FBQUEsVUFDckIsa0JBQWtCO0FBQUEsVUFDbEIsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YscUJBQXFCO0FBQUEsVUFDckIsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsR0FBRztBQUFBLFVBQ0gsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04saUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsVUFBVTtBQUFBLFVBQ1YsTUFBTTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIsa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsdUJBQXVCO0FBQUEsVUFDdkIsMEJBQTBCO0FBQUEsVUFDMUIsd0JBQXdCO0FBQUEsVUFDeEIsMkJBQTJCO0FBQUEsVUFDM0IsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFVBQ1IsaUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsY0FBYztBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsUUFBUTtBQUFBLFVBQ1IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFB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LEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUdMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUdMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUdMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFDSCxxQkFBTztBQUFBLFlBRVQsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBQ0wsS0FBSztBQUFBLFlBR0wsS0FB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YyxRQUFRLGNBQWM7QUFBQSxjQUVySSxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQ0gsdUJBQU8sZUFBZSxRQUFRLFNBQVMsTUFBTTtBQUFBLGNBRS9DLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFBQSxjQUNMLEtBQUs7QUFLSCx1QkFBTyxhQUFhO0FBQUEsWUFDeEI7QUFFQSxtQkFBTztBQUFBLFVBQ1Q7QUFNQSxjQUFJLDRCQUE0QixTQUFVLEtBQUssY0FBYztBQUMzRCxvQkFBUSxLQUFLO0FBQUEsY0FDWCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FDTCxLQUFLO0FBQUEsY0FD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QUFVO0FBQy9ELFVBQUksMEJBQVEsV0FBVyxFQUNyQixTQUFTLGdDQUFnQyxFQUN6QyxRQUFRLENBQUMsU0FBUztBQUNsQixhQUFLLGVBQWUsa0lBQXdDLEtBQUssRUFDL0QsU0FBUyxNQUFNLEVBQ2YsU0FBUyxPQUFPQSxXQUFVO0FBQzFCLGVBQUssT0FBTyxTQUFTLGdCQUFnQixLQUFLLElBQUlBO0FBQzlDLGdCQUFNLEtBQUssT0FBTyxhQUFhO0FBRS9CLGVBQUssT0FBTyxTQUFTLEtBQUssa0JBQWtCO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0gsQ0FBQyxFQUNBLGVBQWUsQ0FBQyxXQUFXO0FBQzNCLGVBQ0UsUUFBUSxHQUFHLEVBQ1gsV0FBVywyRUFBZSxFQUMxQixRQUFRLFlBQVk7QUFDcEIsZUFBSyxPQUFPLFNBQVMsZ0JBQWdCLE9BQU8sT0FBTyxDQUFDO0FBQ3BELGdCQUFNLEtBQUssT0FBTyxhQUFhO0FBQy9CLGVBQUssUUFBUTtBQUViLGVBQUssT0FBTyxTQUFTLEtBQUssa0JBQWtCO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFFBQUksMEJBQVEsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO0FBQzlDLGFBQ0UsY0FBYyxpRkFBZ0IsRUFDOUIsUUFBUSxNQUFNLEVBQ2QsUUFBUSxZQUFZO0FBQ3BCLGFBQUssT0FBTyxTQUFTLGdCQUFnQixLQUFLLEVBQUU7QUFDNUMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUMvQixhQUFLLFFBQVE7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNGO0FBQ0Q7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJSZWFjdERlYnVnQ3VycmVudEZyYW1lIiwgInZhbHVlIiwgImluaXQiLCAic2VsZiIsICJjcmVhdGVFbGVtZW50IiwgImNoaWxkcmVuIiwgIlNFUEFSQVRPUiIsICJhcnJheSIsICJ0b0FycmF5IiwgImNyZWF0ZUNvbnRleHQiLCAibW9kdWxlT2JqZWN0IiwgImVycm9yIiwgImZvcndhcmRSZWYiLCAibWVtbyIsICJ1c2VDb250ZXh0IiwgInVzZVN0YXRlIiwgImluaXRpYWxTdGF0ZSIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgImNyZWF0ZSIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZURlYnVnVmFsdWUiLCAiZnJhbWUiLCAiQ29tcG9uZW50IiwgImxvY2F0aW9uIiwgInJldHVyblZhbHVlIiwgIm1vZHVsZSIsICJ0aW1lciIsICJpbml0aWFsVGltZSIsICJzdGFydFRpbWUiLCAidGltZW91dCIsICJtb2R1bGUiLCAiUmVhY3QiLCAiUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSIsICJGcmFnbWVudCIsICJ2YWx1ZSIsICJwcmVmaXgiLCAic2FuaXRpemVVUkwiLCAidXJsIiwgImZyYW1lIiwgImluaXQiLCAid29ya0luUHJvZ3Jlc3MiLCAidG9TdHJpbmciLCAiZ2V0IiwgInNldCIsICJpc0h5ZHJhdGluZyIsICJvcHRpb25zIiwgImNoaWxkcmVuIiwgInN2Z05vZGUiLCAic3R5bGVWYWx1ZSIsICJzdHlsZSIsICJyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzIiwgInBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMiLCAiZXJyb3IiLCAiY2FsbENhbGxiYWNrIiwgImN1cnJlbnQiLCAibm93IiwgInJvb3QiLCAiaW5kZXgiLCAicmVuZGVyTGFuZXMiLCAicXVldWVkRXZlbnQiLCAiZGlzcGF0Y2hFdmVudCIsICJzdGFydCIsICJjaGFycyIsICJzZWxlY3Rpb24iLCAicHJlZml4ZXMiLCAibm9vcCIsICJjcmVhdGVFbGVtZW50IiwgImxvY2F0aW9uIiwgImhhcyIsICJpZCIsICJhcnJheSIsICJ1cGRhdGVGcmFnbWVudCIsICJjaGlsZCIsICJyZWNvbmNpbGVDaGlsZEZpYmVycyIsICJpbml0aWFsU3RhdGUiLCAiZGlzcGF0Y2giLCAiY3JlYXRlIiwgImVycm9yJDEiLCAicmVuZGVyIiwgInN1YnRyZWVSZW5kZXJMYW5lcyIsICJoYXNDb250ZXh0Q2hhbmdlZCIsICJjb21taXRUaW1lIiwgInRyYW5zaXRpb24iLCAic2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyIiwgImh5ZHJhdGUiLCAiY3JlYXRlUG9ydGFsIiwgImN1cnJlbnRIb29rIiwgIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiLCAiY3JlYXRlUm9vdCIsICJwcm90b2NvbCIsICJtb2R1bGUiLCAiUmVhY3QiLCAidmFsdWUiLCAidXNlU3RhdGUiLCAidXNlRWZmZWN0IiwgInVzZURlYnVnVmFsdWUiLCAibW9kdWxlIiwgIlJlYWN0IiwgInVzZVJlZiIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VEZWJ1Z1ZhbHVlIiwgInNlbGVjdG9yIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJvb3QiLCAibW9kdWxlIiwgInJvb3QiLCAiU3ltYm9sIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgInZhbHVlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAicm9vdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJyb290IiwgIk1hcCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIk1hcCIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIk1hcCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJCdWZmZXIiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidHJhbnNmb3JtIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyb290IiwgIkJ1ZmZlciIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgImFycmF5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJhcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJEYXRhVmlldyIsICJtb2R1bGUiLCAicm9vdCIsICJQcm9taXNlIiwgIm1vZHVsZSIsICJyb290IiwgIlNldCIsICJtb2R1bGUiLCAicm9vdCIsICJXZWFrTWFwIiwgIm1vZHVsZSIsICJEYXRhVmlldyIsICJNYXAiLCAiUHJvbWlzZSIsICJTZXQiLCAiV2Vha01hcCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgInJvb3QiLCAiVWludDhBcnJheSIsICJtb2R1bGUiLCAiVWludDhBcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAia2V5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAidmFsdWUiLCAibW9kdWxlIiwgImlkZW50aXR5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgImNvbGxlY3Rpb24iLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJjYWNoZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAib3RoVmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJzZXQiLCAidmFsdWUiLCAibW9kdWxlIiwgIlN5bWJvbCIsICJVaW50OEFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiY2FjaGUiLCAibW9kdWxlIiwgImNhY2hlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgIlN5bWJvbCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidG9TdHJpbmciLCAidmFsdWUiLCAibW9kdWxlIiwgInRvU3RyaW5nIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdldCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2V0IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpZGVudGl0eSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiZmlsdGVyIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAiY29sbGVjdGlvbiIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJjb2xsZWN0aW9uIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidHJhbnNmb3JtIiwgInZhbHVlIiwgIm9iamVjdCIsICJtb2R1bGUiLCAiU3ltYm9sIiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInN0YXJ0IiwgInRyYW5zZm9ybSIsICJhcnJheSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAic3RhcnQiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgImFycmF5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgIm5vb3AiLCAibW9kdWxlIiwgIlNldCIsICJub29wIiwgIm1vZHVsZSIsICJhcnJheSIsICJzZXQiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic2VsZiIsICJ2YWx1ZSIsICJjaGlsZHJlbiIsICJmaWx0ZXIiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZGlzdGFuY2UiLCAidiIsICJtb2R1bGUiLCAibW9kdWxlIiwgInciLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2IiwgImluaXQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX2dyYXBobGliIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAiaXNCaW5hcnkiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgImZpbmQiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgInZhbHVlIiwgIm9iamVjdCIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJpZGVudGl0eSIsICJhcnJheSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAiYXJyYXkiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJyb290IiwgIm5vdyIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBpY2siLCAibW9kdWxlIiwgInN0YXJ0IiwgIm1vZHVsZSIsICJzdGFydCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImlkZW50aXR5IiwgInZhbHVlIiwgImNvbGxlY3Rpb24iLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ0b1N0cmluZyIsICJpZCIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInJlcXVpcmVfbG9kYXNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJzdGFydCIsICJtb2R1bGUiLCAicmVxdWlyZV91dGlsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic3RhcnQiLCAibW9kdWxlIiwgInJvb3QiLCAiZWRnZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFzY2VuZGluZyIsICJtb2R1bGUiLCAicm9vdCIsICJjaGlsZHJlbiIsICJkZnMiLCAibW9kdWxlIiwgImNoaWxkcmVuIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImNjIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZW50cnkiLCAibW9kdWxlIiwgInBhcnRzIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImNjIiwgInJvb3QiLCAibW9kdWxlIiwgInJvb3QiLCAidyIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX3ZlcnNpb24iLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbml0aWFsU3RhdGUiLCAiUmVhY3RFeHBvcnRzIiwgInVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cyIsICJzZWxlY3RvciIsICJ2YWx1ZSIsICJkb2N1bWVudCIsICJzZWxlY3RvciIsICJzZWxlY3RvciIsICJzZWxlY3RvciIsICJkYXR1bSIsICJzZWxlY3RvciIsICJ2YWx1ZSIsICJzZWxlY3Rpb24iLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAiY3JlYXRlIiwgImNyZWF0ZSIsICJ2YWx1ZSIsICJwYXJzZVR5cGVuYW1lcyIsICJvbiIsICJ2YWx1ZSIsICJ3aW5kb3ciLCAiZGlzcGF0Y2hfZGVmYXVsdCIsICJkaXNwYXRjaF9kZWZhdWx0IiwgInNlbGVjdF9kZWZhdWx0IiwgInNlbGVjdG9yIiwgInJvb3QiLCAic2VsZWN0aW9uIiwgInNlbGVjdF9kZWZhdWx0IiwgImNvbnN0YW50X2RlZmF1bHQiLCAiZGlzcGF0Y2giLCAidmFsdWUiLCAiZmlsdGVyIiwgInNlbGVjdGlvbiIsICJzZWxlY3RfZGVmYXVsdCIsICJjb250YWluZXIiLCAiZGlzcGF0Y2giLCAiZXZlbnQiLCAidG91Y2giLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ2YWx1ZSIsICJ2YWx1ZSIsICJjb25zdGFudF9kZWZhdWx0IiwgImNvbnN0YW50X2RlZmF1bHQiLCAiY29sb3IiLCAicmdiIiwgInN0YXJ0IiwgImkiLCAiaWRlbnRpdHkiLCAidmFsdWUiLCAiaWRlbnRpdHkiLCAicGFyc2UiLCAibm93IiwgImlkIiwgImdldCIsICJzZXQiLCAic2VsZiIsICJzdGFydCIsICJlbXB0eSIsICJpbnRlcnJ1cHRfZGVmYXVsdCIsICJpZCIsICJzZXQiLCAidmFsdWUiLCAiZ2V0IiwgInRyYW5zaXRpb24iLCAiYXR0clJlbW92ZSIsICJhdHRyUmVtb3ZlTlMiLCAiYXR0ckNvbnN0YW50IiwgImF0dHJDb25zdGFudE5TIiwgImF0dHJGdW5jdGlvbiIsICJ2YWx1ZSIsICJhdHRyRnVuY3Rpb25OUyIsICJhdHRyX2RlZmF1bHQiLCAidmFsdWUiLCAiaWQiLCAidmFsdWUiLCAiZ2V0IiwgImlkIiwgInZhbHVlIiwgInNldCIsICJnZXQiLCAiaWQiLCAidmFsdWUiLCAic2V0IiwgImdldCIsICJpZCIsICJ2YWx1ZSIsICJzZXQiLCAiZmlsdGVyX2RlZmF1bHQiLCAibWVyZ2VfZGVmYXVsdCIsICJ0cmFuc2l0aW9uIiwgImlkIiwgInNldCIsICJvbiIsICJvbl9kZWZhdWx0IiwgImdldCIsICJpZCIsICJyZW1vdmVfZGVmYXVsdCIsICJzZWxlY3RfZGVmYXVsdCIsICJpZCIsICJnZXQiLCAic2VsZWN0QWxsX2RlZmF1bHQiLCAiaWQiLCAiY2hpbGRyZW4iLCAiaW5oZXJpdCIsICJnZXQiLCAiU2VsZWN0aW9uIiwgInNlbGVjdGlvbl9kZWZhdWx0IiwgInN0eWxlUmVtb3ZlIiwgInN0eWxlQ29uc3RhbnQiLCAic3R5bGVGdW5jdGlvbiIsICJ2YWx1ZSIsICJpZCIsICJyZW1vdmUiLCAic2V0IiwgIm9uIiwgInN0eWxlX2RlZmF1bHQiLCAidmFsdWUiLCAidGV4dENvbnN0YW50IiwgInZhbHVlIiwgInRleHRGdW5jdGlvbiIsICJ0ZXh0X2RlZmF1bHQiLCAidmFsdWUiLCAiaW5oZXJpdCIsICJnZXQiLCAiaWQiLCAic2V0IiwgIm9uIiwgImlkIiwgInNlbGVjdF9kZWZhdWx0IiwgInNlbGVjdEFsbF9kZWZhdWx0IiwgImZpbHRlcl9kZWZhdWx0IiwgIm1lcmdlX2RlZmF1bHQiLCAic2VsZWN0aW9uX2RlZmF1bHQiLCAib25fZGVmYXVsdCIsICJhdHRyX2RlZmF1bHQiLCAic3R5bGVfZGVmYXVsdCIsICJ0ZXh0X2RlZmF1bHQiLCAicmVtb3ZlX2RlZmF1bHQiLCAiaWQiLCAidHJhbnNpdGlvbl9kZWZhdWx0IiwgImludGVycnVwdF9kZWZhdWx0IiwgInRyYW5zaXRpb25fZGVmYXVsdCIsICJjb25zdGFudF9kZWZhdWx0IiwgInRyYW5zZm9ybSIsICJkaXNwYXRjaCIsICJsb2NhdGlvbiIsICJpZGVudGl0eSIsICJub3Byb3BhZ2F0aW9uIiwgIm5vZXZlbnRfZGVmYXVsdCIsICJkZWZhdWx0RmlsdGVyIiwgImlkZW50aXR5IiwgImRlZmF1bHRUb3VjaGFibGUiLCAidHJhbnNmb3JtIiwgInpvb21fZGVmYXVsdCIsICJmaWx0ZXIiLCAid2hlZWxEZWx0YSIsICJzZWxlY3Rpb24iLCAiZXh0ZW50IiwgInRyYW5zaXRpb24iLCAic2VsZWN0X2RlZmF1bHQiLCAibm9ldmVudF9kZWZhdWx0IiwgIm5vcHJvcGFnYXRpb24iLCAiZXZlbnQiLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ2YWx1ZSIsICJpZCIsICJzZWxlY3RvciIsICJjaGlsZHJlbiIsICJzdHlsZSIsICJSZWFjdCIsICJ2YWx1ZSIsICJpZCIsICJzdHlsZSIsICJSZWFjdCIsICJpZCIsICJDb25uZWN0aW9uTW9kZSIsICJQYW5PblNjcm9sbE1vZGUiLCAiU2VsZWN0aW9uTW9kZSIsICJDb25uZWN0aW9uTGluZVR5cGUiLCAiTWFya2VyVHlwZSIsICJQb3NpdGlvbiIsICJzdHlsZSIsICJSZWFjdCIsICJ4RGlyIiwgInlEaXIiLCAiX2EiLCAiZGlzdGFuY2UiLCAic2VsZWN0aW9uIiwgImRpc3RhbmNlIiwgImV2ZW50IiwgInRyYW5zZm9ybSIsICJoYW5kbGUiLCAiaWQiLCAiY2hpbGRyZW4iLCAiUmVhY3QiLCAidmFsdWUiLCAiZml0VmlldyIsICJnZXQiLCAiX2EiLCAiaWRlbnRpdHkiLCAiY2hhbmdlIiwgInNldCIsICJub29wIiwgImdldE5vZGVzIiwgInNldE5vZGVzIiwgInNldEVkZ2VzIiwgInpvb21fZGVmYXVsdCIsICJzZWxlY3RfZGVmYXVsdCIsICJzZWxlY3RvciIsICJzdHlsZSIsICJub2RlVHlwZXMiLCAiZWRnZXMiLCAiY29sb3IiLCAiU3ltYm9sIiwgImRlZmF1bHRDb2xvciIsICJjb250YWluZXJTdHlsZSIsICJhcHBseUNoYW5nZXMiLCAiaXRlbXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImNoaWxkcmVuIiwgInN0eWxlIiwgImZpdFZpZXciLCAiaW1wb3J0X3JlYWN0IiwgIkJhY2tncm91bmRWYXJpYW50IiwgImNvbG9yIiwgIlJlYWN0IiwgInNlbGVjdG9yIiwgImlkIiwgInN0eWxlIiwgInRyYW5zZm9ybSIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0X2RvbSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiY2hpbGRyZW4iLCAiZGFncmUiLCAiZGFncmUiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIkdyYXBoVmlldyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIm5vdyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAidmFsdWUiLCAic2VsZWN0aW9uIiwgInVybCIsICJ2YWx1ZSIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAiaXNCaW5hcnkiLCAib24iLCAiZGVjb2RlIiwgImVtcHR5IiwgIl9hIiwgInZhbHVlIiwgImRlY29kZSIsICJwcm90b2NvbCIsICJwcm90b2NvbCIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAiaXNWaWV3IiwgIndpdGhOYXRpdmVCbG9iIiwgInByb3RvY29sIiwgIlBhY2tldFR5cGUiLCAidmFsdWUiLCAic3RhcnQiLCAiUkVTRVJWRURfRVZFTlRTIiwgIlNvY2tldCIsICJpZCIsICJ0aW1lb3V0IiwgInRpbWVyIiwgInNlbGYiLCAic2VsZiIsICJ0aW1lb3V0IiwgInRpbWVyIiwgIlNvY2tldCIsICJzb2NrZXQiLCAibG9va3VwIiwgImlkIiwgIlNvY2tldCIsICJsb29rdXAiLCAiR3JhcGhWaWV3IiwgInZhbHVlIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9jbGllbnQuanMiLCAibm9kZV9tb2R1bGVzL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS9zaGltL3dpdGgtc2VsZWN0b3IuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlQ2xlYXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hc3NvY0luZGV4T2YuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVIYXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX0xpc3RDYWNoZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0NsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzRnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29yZUpzRGF0YS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc01hc2tlZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL190b1NvdXJjZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0TmF0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVDcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaENsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hEZWxldGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hTZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fSGFzaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0YWNrU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N0YWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5RWFjaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlQXNzaWduVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXNzaWduVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29weU9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5TGlrZUtleXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNQcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5c0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VLZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9rZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUFzc2lnbkluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lQnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRTeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UHVzaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9sc0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcHlTeW1ib2xzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldEFsbEtleXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRBbGxLZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUFycmF5QnVmZmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nsb25lRGF0YVZpZXcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVSZWdFeHAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVTeW1ib2wuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVUeXBlZEFycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2luaXRDbG9uZUJ5VGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1NldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDbG9uZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvY29uc3RhbnQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUZvci5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGb3JPd24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlQmFzZUVhY2guanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUVhY2guanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jYXN0RnVuY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9mb3JFYWNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZWFjaC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmlsdGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBUb0FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fZXF1YWxCeVRhZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc0VxdWFsLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc01hdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXRjaERhdGEuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1hdGNoZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N5bWJvbC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc0tleS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL21lbW9pemUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbWVtb2l6ZUNhcHBlZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdUb1BhdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlNYXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRvU3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9TdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY2FzdFBhdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9LZXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUdldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSGFzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzUGF0aC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2hhc0luLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVByb3BlcnR5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQcm9wZXJ0eURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9wcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXRlcmF0ZWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maWx0ZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2hhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzRW1wdHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1VuZGVmaW5lZC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlTWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWFwLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5UmVkdWNlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VSZWR1Y2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9yZWR1Y2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hc2NpaVNpemUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzVW5pY29kZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL191bmljb2RlU2l6ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpbmdTaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc2l6ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3RyYW5zZm9ybS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc0ZsYXR0ZW5hYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGbGF0dGVuLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FwcGx5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX292ZXJSZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VTZXRUb1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRmluZEluZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc05hTi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19zdHJpY3RJbmRleE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJbmRleE9mLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5SW5jbHVkZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZVNldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5pcS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3ZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2xvZGFzaC5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2dyYXBoLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvanNvbi5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9jb21wb25lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvZGF0YS9wcmlvcml0eS1xdWV1ZS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kaWprc3RyYS1hbGwuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvdGFyamFuLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2ZpbmQtY3ljbGVzLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL2Zsb3lkLXdhcnNoYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3RvcHNvcnQuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaXMtYWN5Y2xpYy5qcyIsICJub2RlX21vZHVsZXMvZ3JhcGhsaWIvbGliL2FsZy9kZnMuanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvcG9zdG9yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByZW9yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFwaGxpYi9saWIvYWxnL3ByaW0uanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2xpYi9hbGcvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dyYXBobGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvZ3JhcGhsaWIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9jbG9uZURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVGaW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3RyaW1tZWRFbmRJbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVHJpbS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdG9GaW5pdGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC90b0ludGVnZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kSW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9maW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZmxhdHRlbi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2ZvckluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbGFzdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL21hcFZhbHVlcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRXh0cmVtdW0uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUd0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWF4LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NhZmVHZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC90b1BsYWluT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZURlZXAuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUFzc2lnbmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUx0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWluLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvbWluQnkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9ub3cuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVNldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUGlja0J5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VQaWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZsYXRSZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvcGljay5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmFuZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlUmFuZ2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9yYW5nZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU29ydEJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvbXBhcmVBc2NlbmRpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY29tcGFyZU11bHRpcGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VPcmRlckJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc29ydEJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pcXVlSWQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVppcE9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL3ppcE9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2xvZGFzaC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2RhdGEvbGlzdC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2dyZWVkeS1mYXMuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9hY3ljbGljLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL25vcm1hbGl6ZS5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvZmVhc2libGUtdHJlZS5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3JhbmsvbmV0d29yay1zaW1wbGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvcmFuay9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL3BhcmVudC1kdW1teS1jaGFpbnMuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9uZXN0aW5nLWdyYXBoLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvYWRkLWJvcmRlci1zZWdtZW50cy5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2Nvb3JkaW5hdGUtc3lzdGVtLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvaW5pdC1vcmRlci5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2Nyb3NzLWNvdW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvYmFyeWNlbnRlci5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3Jlc29sdmUtY29uZmxpY3RzLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvb3JkZXIvc29ydC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL3NvcnQtc3ViZ3JhcGguanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9vcmRlci9idWlsZC1sYXllci1ncmFwaC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cy5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL29yZGVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvcG9zaXRpb24vYmsuanMiLCAibm9kZV9tb2R1bGVzL2RhZ3JlL2xpYi9wb3NpdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2xheW91dC5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvbGliL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9kYWdyZS9saWIvdmVyc2lvbi5qcyIsICJub2RlX21vZHVsZXMvZGFncmUvaW5kZXguanMiLCAibWFpbi50cyIsICJzcmMvdXRpbHMvRXZlbnRCdXMudHMiLCAic3JjL3ZpZXdzL0dyYXBoVmlldy50cyIsICJzcmMvdXRpbHMvRGlhbG9nLnRzIiwgInNyYy9jb21wb25lbnRzL0hpc3RvcnlQYW5lbC50cyIsICJzcmMvY29tcG9uZW50cy9HcmFwaFBhbmVsLnRzIiwgIm5vZGVfbW9kdWxlcy9AcmVhY3RmbG93L2NvcmUvZGlzdC9lc20vaW5kZXgubWpzIiwgIm5vZGVfbW9kdWxlcy9jbGFzc2NhdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvenVzdGFuZC9lc20vdHJhZGl0aW9uYWwubWpzIiwgIm5vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS92YW5pbGxhLm1qcyIsICJub2RlX21vZHVsZXMvenVzdGFuZC9lc20vc2hhbGxvdy5tanMiLCAibm9kZV9tb2R1bGVzL2QzLWRpc3BhdGNoL3NyYy9kaXNwYXRjaC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9uYW1lc3BhY2VzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jcmVhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvYXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0b3JBbGwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9tYXRjaGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3RDaGlsZC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGF0YS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vam9pbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbWVyZ2UuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zb3J0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vbm9kZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2l6ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2VhY2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2F0dHIuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zdHlsZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcHJvcGVydHkuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3RleHQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2h0bWwuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9sb3dlci5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vYXBwZW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2xvbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZGlzcGF0Y2guanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3QuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc291cmNlRXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvcG9pbnRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvbm9kcmFnLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1kcmFnL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtZHJhZy9zcmMvZXZlbnQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWRyYWcvc3JjL2RyYWcuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9jb2xvci5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2Jhc2lzLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvYmFzaXNDbG9zZWQuanMiLCAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL2NvbG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvcmdiLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvc3RyaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2RlY29tcG9zZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3pvb20uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsICJub2RlX21vZHVsZXMvZDMtdGltZXIvc3JjL3RpbWVvdXQuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2NoZWR1bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2ludGVycnVwdC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90d2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHJUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kdXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9lYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2ZpbHRlci5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9tZXJnZS5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9yZW1vdmUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc2VsZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9zZWxlY3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGUuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHRUd2Vlbi5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2VuZC5qcyIsICJub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCAibm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3NlbGVjdGlvbi90cmFuc2l0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL2NvbnN0YW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ldmVudC5qcyIsICJub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy9ub2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kMy16b29tL3NyYy96b29tLmpzIiwgIm5vZGVfbW9kdWxlcy9AcmVhY3RmbG93L2NvbnRyb2xzL2Rpc3QvZXNtL2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvQHJlYWN0Zmxvdy9iYWNrZ3JvdW5kL2Rpc3QvZXNtL2luZGV4Lm1qcyIsICJub2RlX21vZHVsZXMvQHJlYWN0Zmxvdy9ub2RlLXRvb2xiYXIvZGlzdC9lc20vaW5kZXgubWpzIiwgInNyYy9tb2RhbHMvR3JhcGhTZXR0aW5nc01vZGFsLnRzIiwgInNyYy92aWV3cy9DaGF0Vmlldy50cyIsICJzcmMvcmVmZXJlbmNlcy9BdXRvY29tcGxldGVNYW5hZ2VyLnRzIiwgInNyYy9yZWZlcmVuY2VzL1JlZmVyZW5jZUF1dG9jb21wbGV0ZS50cyIsICJzcmMvcmVmZXJlbmNlcy9SZWZlcmVuY2VFeHBhbmRlci50cyIsICJzcmMvcmVmZXJlbmNlcy9SZWZlcmVuY2VQYXJzZXIudHMiLCAic3JjL3JlZmVyZW5jZXMvQ2FjaGVNYW5hZ2VyLnRzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3Qvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3Qvcm5nLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvbmF0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvdjQuanMiLCAic3JjL3V0aWxzL2ZpbGVVdGlscy50cyIsICJzcmMvcmVmZXJlbmNlcy9UZW1wbGF0ZUVuZ2luZS50cyIsICJzcmMvcmVmZXJlbmNlcy9SZWZlcmVuY2VCb3gudHMiLCAic3JjL2NvbXBvbmVudHMvQ2hhdFBhbmVsLnRzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9jb21tb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9lbmNvZGVQYWNrZXQuYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLXBhcnNlci9idWlsZC9lc20vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1wYXJzZXIvYnVpbGQvZXNtL2RlY29kZVBhY2tldC5icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tcGFyc2VyL2J1aWxkL2VzbS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlci9saWIvZXNtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9nbG9iYWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL3BhcnNlcXMuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydC5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy9wb2xsaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2hhcy1jb3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3BvbGxpbmcteGhyLmpzIiwgIm5vZGVfbW9kdWxlcy9lbmdpbmUuaW8tY2xpZW50L2J1aWxkL2VzbS90cmFuc3BvcnRzL3dlYnNvY2tldC5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vdHJhbnNwb3J0cy93ZWJ0cmFuc3BvcnQuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3RyYW5zcG9ydHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL2NvbnRyaWIvcGFyc2V1cmkuanMiLCAibm9kZV9tb2R1bGVzL2VuZ2luZS5pby1jbGllbnQvYnVpbGQvZXNtL3NvY2tldC5qcyIsICJub2RlX21vZHVsZXMvZW5naW5lLmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1jbGllbnQvYnVpbGQvZXNtL3VybC5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NvY2tldC5pby1wYXJzZXIvYnVpbGQvZXNtL2lzLWJpbmFyeS5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLXBhcnNlci9idWlsZC9lc20vYmluYXJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9vbi5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vc29ja2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9zb2NrZXQuaW8tY2xpZW50L2J1aWxkL2VzbS9jb250cmliL2JhY2tvMi5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vbWFuYWdlci5qcyIsICJub2RlX21vZHVsZXMvc29ja2V0LmlvLWNsaWVudC9idWlsZC9lc20vaW5kZXguanMiLCAic3JjL3V0aWxzL1dlYlNvY2tldFNlcnZpY2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4zLjEnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcigncmVhY3QubWVtbycpO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogbnVsbFxufTtcblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0ge1xuICBjdXJyZW50OiBudWxsLFxuICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLlxuICBpc0JhdGNoaW5nTGVnYWN5OiBmYWxzZSxcbiAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6IGZhbHNlXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG52YXIgZW5hYmxlQ2FjaGVFbGVtZW50ID0gZmFsc2U7XG52YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmdcblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcbi8vIHN0dWZmLiBJbnRlbmRlZCB0byBlbmFibGUgUmVhY3QgY29yZSBtZW1iZXJzIHRvIG1vcmUgZWFzaWx5IGRlYnVnIHNjaGVkdWxpbmdcbi8vIGlzc3VlcyBpbiBERVYgYnVpbGRzLlxuXG52YXIgZW5hYmxlRGVidWdUcmFjaW5nID0gZmFsc2U7IC8vIFRyYWNrIHdoaWNoIEZpYmVyKHMpIHNjaGVkdWxlIHJlbmRlciB3b3JrLlxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuYWN0ID0gYWN0O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnN0YXJ0VHJhbnNpdGlvbiA9IHN0YXJ0VHJhbnNpdGlvbjtcbmV4cG9ydHMudW5zdGFibGVfYWN0ID0gYWN0O1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUlkID0gdXNlSWQ7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3QgPSB1c2VJbnNlcnRpb25FZmZlY3Q7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gdXNlU3luY0V4dGVybmFsU3RvcmU7XG5leHBvcnRzLnVzZVRyYW5zaXRpb24gPSB1c2VUcmFuc2l0aW9uO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyA9IGZhbHNlO1xudmFyIGVuYWJsZVByb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZyYW1lWWllbGRNcyA9IDU7XG5cbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gIHJldHVybiBoZWFwLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBoZWFwWzBdO1xufVxuZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgaWYgKGhlYXAubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7XG5cbiAgaWYgKGxhc3QgIT09IGZpcnN0KSB7XG4gICAgaGVhcFswXSA9IGxhc3Q7XG4gICAgc2lmdERvd24oaGVhcCwgbGFzdCwgMCk7XG4gIH1cblxuICByZXR1cm4gZmlyc3Q7XG59XG5cbmZ1bmN0aW9uIHNpZnRVcChoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG5cbiAgd2hpbGUgKGluZGV4ID4gMCkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTtcbiAgICB2YXIgcGFyZW50ID0gaGVhcFtwYXJlbnRJbmRleF07XG5cbiAgICBpZiAoY29tcGFyZShwYXJlbnQsIG5vZGUpID4gMCkge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBsYXJnZXIuIFN3YXAgcG9zaXRpb25zLlxuICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlO1xuICAgICAgaGVhcFtpbmRleF0gPSBwYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnREb3duKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcbiAgdmFyIGxlbmd0aCA9IGhlYXAubGVuZ3RoO1xuICB2YXIgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcblxuICB3aGlsZSAoaW5kZXggPCBoYWxmTGVuZ3RoKSB7XG4gICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7XG4gICAgdmFyIGxlZnQgPSBoZWFwW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxO1xuICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLlxuXG4gICAgaWYgKGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7XG4gICAgICBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBsZWZ0KSA8IDApIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDtcbiAgICAgICAgaGVhcFtsZWZ0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSBsZWZ0SW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIGNvbXBhcmUocmlnaHQsIG5vZGUpIDwgMCkge1xuICAgICAgaGVhcFtpbmRleF0gPSByaWdodDtcbiAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAvLyBDb21wYXJlIHNvcnQgaW5kZXggZmlyc3QsIHRoZW4gdGFzayBpZC5cbiAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICByZXR1cm4gZGlmZiAhPT0gMCA/IGRpZmYgOiBhLmlkIC0gYi5pZDtcbn1cblxuLy8gVE9ETzogVXNlIHN5bWJvbHM/XG52YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxO1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gMjtcbnZhciBOb3JtYWxQcmlvcml0eSA9IDM7XG52YXIgTG93UHJpb3JpdHkgPSA0O1xudmFyIElkbGVQcmlvcml0eSA9IDU7XG5cbmZ1bmN0aW9uIG1hcmtUYXNrRXJyb3JlZCh0YXNrLCBtcykge1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIGhhc1BlcmZvcm1hbmNlTm93ID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoaGFzUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICB2YXIgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICB9O1xufSAvLyBNYXggMzEgYml0IGludGVnZXIuIFRoZSBtYXggaW50ZWdlciBzaXplIGluIFY4IGZvciAzMi1iaXQgc3lzdGVtcy5cbi8vIE1hdGgucG93KDIsIDMwKSAtIDFcbi8vIDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXG5cblxudmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5XG5cbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dFxuXG52YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwOyAvLyBOZXZlciB0aW1lcyBvdXRcblxudmFyIElETEVfUFJJT1JJVFlfVElNRU9VVCA9IG1heFNpZ25lZDMxQml0SW50OyAvLyBUYXNrcyBhcmUgc3RvcmVkIG9uIGEgbWluIGhlYXBcblxudmFyIHRhc2tRdWV1ZSA9IFtdO1xudmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLlxuXG52YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBjdXJyZW50VGFzayA9IG51bGw7XG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsgLy8gVGhpcyBpcyBzZXQgd2hpbGUgcGVyZm9ybWluZyB3b3JrLCB0byBwcmV2ZW50IHJlLWVudHJhbmNlLlxuXG52YXIgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlOyAvLyBDYXB0dXJlIGxvY2FsIHJlZmVyZW5jZXMgdG8gbmF0aXZlIEFQSXMsIGluIGNhc2UgYSBwb2x5ZmlsbCBvdmVycmlkZXMgdGhlbS5cblxudmFyIGxvY2FsU2V0VGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxDbGVhclRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogbnVsbDtcbnZhciBsb2NhbFNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnID8gc2V0SW1tZWRpYXRlIDogbnVsbDsgLy8gSUUgYW5kIE5vZGUuanMgKyBqc2RvbVxuXG52YXIgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZyAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nICE9PSB1bmRlZmluZWQgPyBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKSA6IG51bGw7XG5cbmZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgLy8gQ2hlY2sgZm9yIHRhc2tzIHRoYXQgYXJlIG5vIGxvbmdlciBkZWxheWVkIGFuZCBhZGQgdGhlbSB0byB0aGUgcXVldWUuXG4gIHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgd2hpbGUgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICAvLyBUaW1lciB3YXMgY2FuY2VsbGVkLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaW1lciBmaXJlZC4gVHJhbnNmZXIgdG8gdGhlIHRhc2sgcXVldWUuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTtcbiAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSAhPT0gbnVsbCkge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hXb3JrKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG5cblxuICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgLy8gV2Ugc2NoZWR1bGVkIGEgdGltZW91dCBidXQgaXQncyBubyBsb25nZXIgbmVlZGVkLiBDYW5jZWwgaXQuXG4gICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gIH1cblxuICBpc1BlcmZvcm1pbmdXb3JrID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVByb2ZpbGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgY3VycmVudFRhc2suaXNRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjYXRjaCBpbiBwcm9kIGNvZGUgcGF0aC5cbiAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRUYXNrID0gbnVsbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gaW5pdGlhbFRpbWU7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcblxuICB3aGlsZSAoY3VycmVudFRhc2sgIT09IG51bGwgJiYgIShlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgKSkge1xuICAgIGlmIChjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmICghaGFzVGltZVJlbWFpbmluZyB8fCBzaG91bGRZaWVsZFRvSG9zdCgpKSkge1xuICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICB2YXIgZGlkVXNlckNhbGxiYWNrVGltZW91dCA9IGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lO1xuXG4gICAgICB2YXIgY29udGludWF0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjayhkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0KTtcbiAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IGNvbnRpbnVhdGlvbkNhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSkge1xuICAgICAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29ya1xuXG5cbiAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWw7XG5cbiAgc3dpdGNoIChjdXJyZW50UHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgLy8gU2hpZnQgZG93biB0byBub3JtYWwgcHJpb3JpdHlcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gIHZhciBzdGFydFRpbWU7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5kZWxheTtcblxuICAgIGlmICh0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICYmIGRlbGF5ID4gMCkge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBkZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElETEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGltZW91dCA9IE5PUk1BTF9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0O1xuICB2YXIgbmV3VGFzayA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG5cbiAgaWYgKHN0YXJ0VGltZSA+IGN1cnJlbnRUaW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay5cbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IHN0YXJ0VGltZTtcbiAgICBwdXNoKHRpbWVyUXVldWUsIG5ld1Rhc2spO1xuXG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSA9PT0gbnVsbCAmJiBuZXdUYXNrID09PSBwZWVrKHRpbWVyUXVldWUpKSB7XG4gICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LlxuICAgICAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHRpbWVvdXQuXG4gICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBzdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gZXhwaXJhdGlvblRpbWU7XG4gICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spO1xuICAgIC8vIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cblxuXG4gICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdUYXNrO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbigpIHtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUoKSB7XG4gIHJldHVybiBwZWVrKHRhc2tRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHtcbiAgLy8gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgeW91IGNhbid0IHJlbW92ZSBhcmJpdHJhcnkgbm9kZXMgZnJvbSBhblxuICAvLyBhcnJheSBiYXNlZCBoZWFwLCBvbmx5IHRoZSBmaXJzdCBvbmUuKVxuXG5cbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkge1xuICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG59XG5cbnZhciBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xudmFyIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG52YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW5cbi8vIHRocmVhZCwgbGlrZSB1c2VyIGV2ZW50cy4gQnkgZGVmYXVsdCwgaXQgeWllbGRzIG11bHRpcGxlIHRpbWVzIHBlciBmcmFtZS5cbi8vIEl0IGRvZXMgbm90IGF0dGVtcHQgdG8gYWxpZ24gd2l0aCBmcmFtZSBib3VuZGFyaWVzLCBzaW5jZSBtb3N0IHRhc2tzIGRvbid0XG4vLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuXG52YXIgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbnZhciBzdGFydFRpbWUgPSAtMTtcblxuZnVuY3Rpb24gc2hvdWxkWWllbGRUb0hvc3QoKSB7XG4gIHZhciB0aW1lRWxhcHNlZCA9IGV4cG9ydHMudW5zdGFibGVfbm93KCkgLSBzdGFydFRpbWU7XG5cbiAgaWYgKHRpbWVFbGFwc2VkIDwgZnJhbWVJbnRlcnZhbCkge1xuICAgIC8vIFRoZSBtYWluIHRocmVhZCBoYXMgb25seSBiZWVuIGJsb2NrZWQgZm9yIGEgcmVhbGx5IHNob3J0IGFtb3VudCBvZiB0aW1lO1xuICAgIC8vIHNtYWxsZXIgdGhhbiBhIHNpbmdsZSBmcmFtZS4gRG9uJ3QgeWllbGQgeWV0LlxuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGJlZW4gYmxvY2tlZCBmb3IgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gV2VcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UGFpbnQoKSB7XG5cbn1cblxuZnVuY3Rpb24gZm9yY2VGcmFtZVJhdGUoZnBzKSB7XG4gIGlmIChmcHMgPCAwIHx8IGZwcyA+IDEyNSkge1xuICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZwcyA+IDApIHtcbiAgICBmcmFtZUludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNldCB0aGUgZnJhbWVyYXRlXG4gICAgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNcztcbiAgfVxufVxuXG52YXIgcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgdGltZSBzbyB3ZSBjYW4gbWVhc3VyZSBob3cgbG9uZyB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyBoYXMgYmVlbiBibG9ja2VkLlxuXG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlOyAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlXG4gICAgLy8gZXJyb3IgY2FuIGJlIG9ic2VydmVkLlxuICAgIC8vXG4gICAgLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYSB0cnktY2F0Y2gsIHNpbmNlIHRoYXQgbWFrZXMgc29tZSBkZWJ1Z2dpbmdcbiAgICAvLyB0ZWNobmlxdWVzIGhhcmRlci4gSW5zdGVhZCwgaWYgYHNjaGVkdWxlZEhvc3RDYWxsYmFja2AgZXJyb3JzLCB0aGVuXG4gICAgLy8gYGhhc01vcmVXb3JrYCB3aWxsIHJlbWFpbiB0cnVlLCBhbmQgd2UnbGwgY29udGludWUgdGhlIHdvcmsgbG9vcC5cblxuICAgIHZhciBoYXNNb3JlV29yayA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoaGFzTW9yZVdvcmspIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZFxuICAgICAgICAvLyBvZiB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gIH0gLy8gWWllbGRpbmcgdG8gdGhlIGJyb3dzZXIgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHBhaW50LCBzbyB3ZSBjYW5cbn07XG5cbnZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuaWYgKHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBOb2RlLmpzIGFuZCBvbGQgSUUuXG4gIC8vIFRoZXJlJ3MgYSBmZXcgcmVhc29ucyBmb3Igd2h5IHdlIHByZWZlciBzZXRJbW1lZGlhdGUuXG4gIC8vXG4gIC8vIFVubGlrZSBNZXNzYWdlQ2hhbm5lbCwgaXQgZG9lc24ndCBwcmV2ZW50IGEgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy5cbiAgLy8gKEV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBET00gZm9yayBvZiB0aGUgU2NoZWR1bGVyLCB5b3UgY291bGQgZ2V0IGhlcmVcbiAgLy8gd2l0aCBhIG1peCBvZiBOb2RlLmpzIDE1Kywgd2hpY2ggaGFzIGEgTWVzc2FnZUNoYW5uZWwsIGFuZCBqc2RvbS4pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjA3NTZcbiAgLy9cbiAgLy8gQnV0IGFsc28sIGl0IHJ1bnMgZWFybGllciB3aGljaCBpcyB0aGUgc2VtYW50aWMgd2Ugd2FudC5cbiAgLy8gSWYgb3RoZXIgYnJvd3NlcnMgZXZlciBpbXBsZW1lbnQgaXQsIGl0J3MgYmV0dGVyIHRvIHVzZSBpdC5cbiAgLy8gQWx0aG91Z2ggYm90aCBvZiB0aGVzZSB3b3VsZCBiZSBpbmZlcmlvciB0byBuYXRpdmUgc2NoZWR1bGluZy5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBET00gYW5kIFdvcmtlciBlbnZpcm9ubWVudHMuXG4gIC8vIFdlIHByZWZlciBNZXNzYWdlQ2hhbm5lbCBiZWNhdXNlIG9mIHRoZSA0bXMgc2V0VGltZW91dCBjbGFtcGluZy5cbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZTtcblxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZmFsbGJhY2sgaGVyZSBpbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gIGlmICghaXNNZXNzYWdlTG9vcFJ1bm5pbmcpIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IHRydWU7XG4gICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gIHRhc2tUaW1lb3V0SUQgPSBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKGV4cG9ydHMudW5zdGFibGVfbm93KCkpO1xuICB9LCBtcyk7XG59XG5cbmZ1bmN0aW9uIGNhbmNlbEhvc3RUaW1lb3V0KCkge1xuICBsb2NhbENsZWFyVGltZW91dCh0YXNrVGltZW91dElEKTtcbiAgdGFza1RpbWVvdXRJRCA9IC0xO1xufVxuXG52YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50O1xudmFyIHVuc3RhYmxlX1Byb2ZpbGluZyA9ICBudWxsO1xuXG5leHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHkgPSBMb3dQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nID0gdW5zdGFibGVfUHJvZmlsaW5nO1xuZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZvcmNlRnJhbWVSYXRlO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSA9IHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9uZXh0ID0gdW5zdGFibGVfbmV4dDtcbmV4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb24gPSB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50ID0gdW5zdGFibGVfcmVxdWVzdFBhaW50O1xuZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xuZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IHNob3VsZFlpZWxkVG9Ib3N0O1xuZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSB1bnN0YWJsZV93cmFwQ2FsbGJhY2s7XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWRvbS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG52YXIgc3VwcHJlc3NXYXJuaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBzZXRTdXBwcmVzc1dhcm5pbmcobmV3U3VwcHJlc3NXYXJuaW5nKSB7XG4gIHtcbiAgICBzdXBwcmVzc1dhcm5pbmcgPSBuZXdTdXBwcmVzc1dhcm5pbmc7XG4gIH1cbn0gLy8gSW4gREVWLCBjYWxscyB0byBjb25zb2xlLndhcm4gYW5kIGNvbnNvbGUuZXJyb3IgZ2V0IHJlcGxhY2VkXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBTY29wZUNvbXBvbmVudCA9IDIxO1xudmFyIE9mZnNjcmVlbkNvbXBvbmVudCA9IDIyO1xudmFyIExlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IDIzO1xudmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7XG52YXIgVHJhY2luZ01hcmtlckNvbXBvbmVudCA9IDI1O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCA9IHRydWU7IC8vIFRPRE86IE5lZWQgdG8gcmV2aWV3IHRoaXMgY29kZSBvbmUgbW9yZSB0aW1lIGJlZm9yZSBsYW5kaW5nXG4vLyB0aGUgcmVhY3QtcmVjb25jaWxlciBwYWNrYWdlLlxuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBTdXBwb3J0IGxlZ2FjeSBQcmltZXIgc3VwcG9ydCBvbiBpbnRlcm5hbCBGQiB3d3dcblxudmFyIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gPSBmYWxzZTsgLy8gRkItb25seSB1c2FnZS4gVGhlIG5ldyBBUEkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MuXG5cbnZhciBlbmFibGVMZWdhY3lIaWRkZW4gPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpYmVyXG5cbnZhciBlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaXp6XG4vLyBSZWFjdCBET00gQ2hvcHBpbmcgQmxvY2tcbi8vXG4vLyBTaW1pbGFyIHRvIG1haW4gQ2hvcHBpbmcgQmxvY2sgYnV0IG9ubHkgZmxhZ3MgcmVsYXRlZCB0byBSZWFjdCBET00uIFRoZXNlIGFyZVxuLy8gZ3JvdXBlZCBiZWNhdXNlIHdlIHdpbGwgbGlrZWx5IGJhdGNoIGFsbCBvZiB0aGVtIGludG8gYSBzaW5nbGUgbWFqb3IgcmVsZWFzZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEaXNhYmxlIHN1cHBvcnQgZm9yIGNvbW1lbnQgbm9kZXMgYXMgUmVhY3QgRE9NIGNvbnRhaW5lcnMuIEFscmVhZHkgZGlzYWJsZWRcbi8vIGluIG9wZW4gc291cmNlLCBidXQgd3d3IGNvZGViYXNlIHN0aWxsIHJlbGllcyBvbiBpdC4gTmVlZCB0byByZW1vdmUuXG5cbnZhciBkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgPSB0cnVlOyAvLyBEaXNhYmxlIGphdmFzY3JpcHQ6IFVSTCBzdHJpbmdzIGluIGhyZWYgZm9yIFhTUyBwcm90ZWN0aW9uLlxuLy8gYW5kIGNsaWVudCByZW5kZXJpbmcsIG1vc3RseSB0byBhbGxvdyBKU1ggYXR0cmlidXRlcyB0byBhcHBseSB0byB0aGUgY3VzdG9tXG4vLyBlbGVtZW50J3Mgb2JqZWN0IHByb3BlcnRpZXMgaW5zdGVhZCBvZiBvbmx5IEhUTUwgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTEzNDdcblxudmFyIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPSBmYWxzZTsgLy8gRGlzYWJsZXMgY2hpbGRyZW4gZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHNcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gdHJ1ZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZGRzIHVzZXIgdGltaW5nIG1hcmtzIGZvciBlLmcuIHN0YXRlIHVwZGF0ZXMsIHN1c3BlbnNlLCBhbmQgd29yayBsb29wIHN0dWZmLFxuLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLlxuXG52YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIFwidXBkYXRlXCIgYW5kIGEgXCJjYXNjYWRpbmctdXBkYXRlXCIuXG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBhdHRyaWJ1dGUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgYXR0cmlidXRlTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIHByb3AgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIENTUyBwcm9wZXJ0eSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBIVE1MIG1hcmt1cCB1c2VzIGEgdmFsdWUgb2YgdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdGb3JtIGZpZWxkIHZhbHVlcyAodmFsdWUsIGNoZWNrZWQsIGRlZmF1bHRWYWx1ZSwgb3IgZGVmYXVsdENoZWNrZWQgcHJvcHMpJyArICcgbXVzdCBiZSBzdHJpbmdzLCBub3QgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIHJlc2VydmVkIGF0dHJpYnV0ZS5cbi8vIEl0IGlzIGhhbmRsZWQgYnkgUmVhY3Qgc2VwYXJhdGVseSBhbmQgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbnZhciBSRVNFUlZFRCA9IDA7IC8vIEEgc2ltcGxlIHN0cmluZyBhdHRyaWJ1dGUuXG4vLyBBdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGluIHRoZSBmaWx0ZXIgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLlxuXG52YXIgU1RSSU5HID0gMTsgLy8gQSBzdHJpbmcgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBib29sZWFucyBpbiBSZWFjdC4gSW4gSFRNTCwgdGhlc2UgYXJlIGNhbGxlZFxuLy8gXCJlbnVtZXJhdGVkXCIgYXR0cmlidXRlcyB3aXRoIFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIgYXMgcG9zc2libGUgdmFsdWVzLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJ0cnVlXCIgc3RyaW5nLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwiZmFsc2VcIiBzdHJpbmcuXG5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7IC8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuXG52YXIgQk9PTEVBTiA9IDM7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBhcyB3ZWxsIGFzIHdpdGggYSB2YWx1ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuLy8gRm9yIGFueSBvdGhlciB2YWx1ZSwgc2hvdWxkIGJlIHByZXNlbnQgd2l0aCB0aGF0IHZhbHVlLlxuXG52YXIgT1ZFUkxPQURFRF9CT09MRUFOID0gNDsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgTlVNRVJJQyA9IDU7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIFBPU0lUSVZFX05VTUVSSUMgPSA2O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9IFwiOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFwiO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArIFwiXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBcIjtcbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcblxuICAgIHN3aXRjaCAocHJvcGVydHlJbmZvLnR5cGUpIHtcbiAgICAgIGNhc2UgQk9PTEVBTjpcbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcblxuICAgICAgY2FzZSBPVkVSTE9BREVEX0JPT0xFQU46XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7XG5cbiAgICAgIGNhc2UgTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKTtcblxuICAgICAgY2FzZSBQT1NJVElWRV9OVU1FUklDOlxuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpIHx8IHZhbHVlIDwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUluZm8obmFtZSkge1xuICByZXR1cm4gcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgdHlwZSwgbXVzdFVzZVByb3BlcnR5LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lc3BhY2UsIHNhbml0aXplVVJMLCByZW1vdmVFbXB0eVN0cmluZykge1xuICB0aGlzLmFjY2VwdHNCb29sZWFucyA9IHR5cGUgPT09IEJPT0xFQU5JU0hfU1RSSU5HIHx8IHR5cGUgPT09IEJPT0xFQU4gfHwgdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICB0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IGF0dHJpYnV0ZU5hbWVzcGFjZTtcbiAgdGhpcy5tdXN0VXNlUHJvcGVydHkgPSBtdXN0VXNlUHJvcGVydHk7XG4gIHRoaXMucHJvcGVydHlOYW1lID0gbmFtZTtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5zYW5pdGl6ZVVSTCA9IHNhbml0aXplVVJMO1xuICB0aGlzLnJlbW92ZUVtcHR5U3RyaW5nID0gcmVtb3ZlRW1wdHlTdHJpbmc7XG59IC8vIFdoZW4gYWRkaW5nIGF0dHJpYnV0ZXMgdG8gdGhpcyBsaXN0LCBiZSBzdXJlIHRvIGFsc28gYWRkIHRoZW0gdG9cbi8vIHRoZSBgcG9zc2libGVTdGFuZGFyZE5hbWVzYCBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0XG4vLyBuYW1lIHdhcm5pbmdzLlxuXG5cbnZhciBwcm9wZXJ0aWVzID0ge307IC8vIFRoZXNlIHByb3BzIGFyZSByZXNlcnZlZCBieSBSZWFjdC4gVGhleSBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxuXG52YXIgcmVzZXJ2ZWRQcm9wcyA9IFsnY2hpbGRyZW4nLCAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLCAvLyBUT0RPOiBUaGlzIHByZXZlbnRzIHRoZSBhc3NpZ25tZW50IG9mIGRlZmF1bHRWYWx1ZSB0byByZWd1bGFyXG4vLyBlbGVtZW50cyAobm90IGp1c3QgaW5wdXRzKS4gTm93IHRoYXQgUmVhY3RET01JbnB1dCBhc3NpZ25zIHRvIHRoZVxuLy8gZGVmYXVsdFZhbHVlIHByb3BlcnR5IC0tIGRvIHdlIG5lZWQgdGhpcz9cbidkZWZhdWx0VmFsdWUnLCAnZGVmYXVsdENoZWNrZWQnLCAnaW5uZXJIVE1MJywgJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLCAnc3R5bGUnXTtcblxucmVzZXJ2ZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFJFU0VSVkVELCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gQSBmZXcgUmVhY3Qgc3RyaW5nIGF0dHJpYnV0ZXMgaGF2ZSBhIGRpZmZlcmVudCBuYW1lLlxuLy8gVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBSZWFjdCBwcm9wIG5hbWVzIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZXMuXG5cbltbJ2FjY2VwdENoYXJzZXQnLCAnYWNjZXB0LWNoYXJzZXQnXSwgWydjbGFzc05hbWUnLCAnY2xhc3MnXSwgWydodG1sRm9yJywgJ2ZvciddLCBbJ2h0dHBFcXVpdicsICdodHRwLWVxdWl2J11dLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmWzBdLFxuICAgICAgYXR0cmlidXRlTmFtZSA9IF9yZWZbMV07XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG5cblsnY29udGVudEVkaXRhYmxlJywgJ2RyYWdnYWJsZScsICdzcGVsbENoZWNrJywgJ3ZhbHVlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIFNWRyBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuLy8gU2luY2UgdGhlc2UgYXJlIFNWRyBhdHRyaWJ1dGVzLCB0aGVpciBhdHRyaWJ1dGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuXG5bJ2F1dG9SZXZlcnNlJywgJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLCAnZm9jdXNhYmxlJywgJ3ByZXNlcnZlQWxwaGEnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuXG5bJ2FsbG93RnVsbFNjcmVlbicsICdhc3luYycsIC8vIE5vdGU6IHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyB3cml0dGVuIHRvIHRoZSBET01cbi8vIG9uIHRoZSBjbGllbnQgc2lkZSBiZWNhdXNlIHRoZSBicm93c2VycyBhcmUgaW5jb25zaXN0ZW50LiBJbnN0ZWFkIHdlIGNhbGwgZm9jdXMoKS5cbidhdXRvRm9jdXMnLCAnYXV0b1BsYXknLCAnY29udHJvbHMnLCAnZGVmYXVsdCcsICdkZWZlcicsICdkaXNhYmxlZCcsICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLCAnZm9ybU5vVmFsaWRhdGUnLCAnaGlkZGVuJywgJ2xvb3AnLCAnbm9Nb2R1bGUnLCAnbm9WYWxpZGF0ZScsICdvcGVuJywgJ3BsYXlzSW5saW5lJywgJ3JlYWRPbmx5JywgJ3JlcXVpcmVkJywgJ3JldmVyc2VkJywgJ3Njb3BlZCcsICdzZWFtbGVzcycsIC8vIE1pY3JvZGF0YVxuJ2l0ZW1TY29wZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIHRoZSBmZXcgUmVhY3QgcHJvcHMgdGhhdCB3ZSBzZXQgYXMgRE9NIHByb3BlcnRpZXNcbi8vIHJhdGhlciB0aGFuIGF0dHJpYnV0ZXMuIFRoZXNlIGFyZSBhbGwgYm9vbGVhbnMuXG5cblsnY2hlY2tlZCcsIC8vIE5vdGU6IGBvcHRpb24uc2VsZWN0ZWRgIGlzIG5vdCB1cGRhdGVkIGlmIGBzZWxlY3QubXVsdGlwbGVgIGlzXG4vLyBkaXNhYmxlZCB3aXRoIGByZW1vdmVBdHRyaWJ1dGVgLiBXZSBoYXZlIHNwZWNpYWwgbG9naWMgZm9yIGhhbmRsaW5nIHRoaXMuXG4nbXVsdGlwbGUnLCAnbXV0ZWQnLCAnc2VsZWN0ZWQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIHRydWUsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBhcmUgXCJvdmVybG9hZGVkIGJvb2xlYW5zXCI6IHRoZXkgYmVoYXZlIGxpa2Vcbi8vIGJvb2xlYW5zLCBidXQgY2FuIGFsc28gYWNjZXB0IGEgc3RyaW5nIHZhbHVlLlxuXG5bJ2NhcHR1cmUnLCAnZG93bmxvYWQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE9WRVJMT0FERURfQk9PTEVBTiwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlcnMuXG5cblsnY29scycsICdyb3dzJywgJ3NpemUnLCAnc3BhbicgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUE9TSVRJVkVfTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIG51bWJlcnMuXG5cblsncm93U3BhbicsICdzdGFydCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgTlVNRVJJQywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTtcbnZhciBDQU1FTElaRSA9IC9bXFwtXFw6XShbYS16XSkvZztcblxudmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgcmV0dXJuIHRva2VuWzFdLnRvVXBwZXJDYXNlKCk7XG59OyAvLyBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBuZWVkIHNwZWNpYWwgY2FzaW5nLCBuYW1lc3BhY2luZyxcbi8vIG9yIGJvb2xlYW4gdmFsdWUgYXNzaWdubWVudC4gUmVndWxhciBhdHRyaWJ1dGVzIHRoYXQganVzdCBhY2NlcHQgc3RyaW5nc1xuLy8gYW5kIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXJlIG9taXR0ZWQsIGp1c3QgbGlrZSBpbiB0aGUgSFRNTCBhdHRyaWJ1dGUgZmlsdGVyLlxuLy8gU29tZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBoYXJkIHRvIGZpbmQuIFRoaXMgbGlzdCB3YXMgY3JlYXRlZCBieVxuLy8gc2NyYXBpbmcgdGhlIE1ETiBkb2N1bWVudGF0aW9uLlxuXG5cblsnYWNjZW50LWhlaWdodCcsICdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnYXJhYmljLWZvcm0nLCAnYmFzZWxpbmUtc2hpZnQnLCAnY2FwLWhlaWdodCcsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2RvbWluYW50LWJhc2VsaW5lJywgJ2VuYWJsZS1iYWNrZ3JvdW5kJywgJ2ZpbGwtb3BhY2l0eScsICdmaWxsLXJ1bGUnLCAnZmxvb2QtY29sb3InLCAnZmxvb2Qtb3BhY2l0eScsICdmb250LWZhbWlseScsICdmb250LXNpemUnLCAnZm9udC1zaXplLWFkanVzdCcsICdmb250LXN0cmV0Y2gnLCAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnZ2x5cGgtbmFtZScsICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJywgJ2dseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsJywgJ2hvcml6LWFkdi14JywgJ2hvcml6LW9yaWdpbi14JywgJ2ltYWdlLXJlbmRlcmluZycsICdsZXR0ZXItc3BhY2luZycsICdsaWdodGluZy1jb2xvcicsICdtYXJrZXItZW5kJywgJ21hcmtlci1taWQnLCAnbWFya2VyLXN0YXJ0JywgJ292ZXJsaW5lLXBvc2l0aW9uJywgJ292ZXJsaW5lLXRoaWNrbmVzcycsICdwYWludC1vcmRlcicsICdwYW5vc2UtMScsICdwb2ludGVyLWV2ZW50cycsICdyZW5kZXJpbmctaW50ZW50JywgJ3NoYXBlLXJlbmRlcmluZycsICdzdG9wLWNvbG9yJywgJ3N0b3Atb3BhY2l0eScsICdzdHJpa2V0aHJvdWdoLXBvc2l0aW9uJywgJ3N0cmlrZXRocm91Z2gtdGhpY2tuZXNzJywgJ3N0cm9rZS1kYXNoYXJyYXknLCAnc3Ryb2tlLWRhc2hvZmZzZXQnLCAnc3Ryb2tlLWxpbmVjYXAnLCAnc3Ryb2tlLWxpbmVqb2luJywgJ3N0cm9rZS1taXRlcmxpbWl0JywgJ3N0cm9rZS1vcGFjaXR5JywgJ3N0cm9rZS13aWR0aCcsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndW5kZXJsaW5lLXBvc2l0aW9uJywgJ3VuZGVybGluZS10aGlja25lc3MnLCAndW5pY29kZS1iaWRpJywgJ3VuaWNvZGUtcmFuZ2UnLCAndW5pdHMtcGVyLWVtJywgJ3YtYWxwaGFiZXRpYycsICd2LWhhbmdpbmcnLCAndi1pZGVvZ3JhcGhpYycsICd2LW1hdGhlbWF0aWNhbCcsICd2ZWN0b3ItZWZmZWN0JywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dvcmQtc3BhY2luZycsICd3cml0aW5nLW1vZGUnLCAneG1sbnM6eGxpbmsnLCAneC1oZWlnaHQnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bGluayBuYW1lc3BhY2UuXG5cblsneGxpbms6YWN0dWF0ZScsICd4bGluazphcmNyb2xlJywgJ3hsaW5rOnJvbGUnLCAneGxpbms6c2hvdycsICd4bGluazp0aXRsZScsICd4bGluazp0eXBlJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhtbCBuYW1lc3BhY2UuXG5cblsneG1sOmJhc2UnLCAneG1sOmxhbmcnLCAneG1sOnNwYWNlJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhdHRyaWJ1dGUgZXhpc3RzIGJvdGggaW4gSFRNTCBhbmQgU1ZHLlxuLy8gVGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGNhc2Utc2Vuc2l0aXZlIGluIFNWRyBzbyB3ZSBjYW4ndCBqdXN0IHVzZVxuLy8gdGhlIFJlYWN0IG5hbWUgbGlrZSB3ZSBkbyBmb3IgYXR0cmlidXRlcyB0aGF0IGV4aXN0IG9ubHkgaW4gSFRNTC5cblxuWyd0YWJJbmRleCcsICdjcm9zc09yaWdpbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFjY2VwdCBVUkxzLiBUaGVzZSBtdXN0IG5vdCBhbGxvdyBqYXZhc2NyaXB0OiBVUkxTLlxuLy8gVGhlc2Ugd2lsbCBhbHNvIG5lZWQgdG8gYWNjZXB0IFRydXN0ZWQgVHlwZXMgb2JqZWN0IGluIHRoZSBmdXR1cmUuXG5cbnZhciB4bGlua0hyZWYgPSAneGxpbmtIcmVmJztcbnByb3BlcnRpZXNbeGxpbmtIcmVmXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoJ3hsaW5rSHJlZicsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuJ3hsaW5rOmhyZWYnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsIHRydWUsIC8vIHNhbml0aXplVVJMXG5mYWxzZSk7XG5bJ3NyYycsICdocmVmJywgJ2FjdGlvbicsICdmb3JtQWN0aW9uJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuICB0cnVlKTtcbn0pO1xuXG4vLyBhbmQgYW55IG5ld2xpbmUgb3IgdGFiIGFyZSBmaWx0ZXJlZCBvdXQgYXMgaWYgdGhleSdyZSBub3QgcGFydCBvZiB0aGUgVVJMLlxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmwtcGFyc2luZ1xuLy8gVGFiIG9yIG5ld2xpbmUgYXJlIGRlZmluZWQgYXMgXFxyXFxuXFx0OlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2FzY2lpLXRhYi1vci1uZXdsaW5lXG4vLyBBIEMwIGNvbnRyb2wgaXMgYSBjb2RlIHBvaW50IGluIHRoZSByYW5nZSBcXHUwMDAwIE5VTEwgdG8gXFx1MDAxRlxuLy8gSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORSwgaW5jbHVzaXZlOlxuLy8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2MwLWNvbnRyb2wtb3Itc3BhY2VcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG52YXIgaXNKYXZhU2NyaXB0UHJvdG9jb2wgPSAvXltcXHUwMDAwLVxcdTAwMUYgXSpqW1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnZbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qc1tcXHJcXG5cXHRdKmNbXFxyXFxuXFx0XSpyW1xcclxcblxcdF0qaVtcXHJcXG5cXHRdKnBbXFxyXFxuXFx0XSp0W1xcclxcblxcdF0qXFw6L2k7XG52YXIgZGlkV2FybiA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzYW5pdGl6ZVVSTCh1cmwpIHtcbiAge1xuICAgIGlmICghZGlkV2FybiAmJiBpc0phdmFTY3JpcHRQcm90b2NvbC50ZXN0KHVybCkpIHtcbiAgICAgIGRpZFdhcm4gPSB0cnVlO1xuXG4gICAgICBlcnJvcignQSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdCB3aWxsIGJsb2NrIGphdmFzY3JpcHQ6IFVSTHMgYXMgYSBzZWN1cml0eSBwcmVjYXV0aW9uLiAnICsgJ1VzZSBldmVudCBoYW5kbGVycyBpbnN0ZWFkIGlmIHlvdSBjYW4uIElmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIHVuc2FmZSBIVE1MIHRyeSAnICsgJ3VzaW5nIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGluc3RlYWQuIFJlYWN0IHdhcyBwYXNzZWQgJXMuJywgSlNPTi5zdHJpbmdpZnkodXJsKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLlxuICogVGhlIFwiZXhwZWN0ZWRcIiBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy5cbiAqIFNvbWUgcHJvcGVydGllcyBoYXZlIG11bHRpcGxlIGVxdWl2YWxlbnQgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8pIHtcbiAge1xuICAgIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7XG4gICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgIHJldHVybiBub2RlW3Byb3BlcnR5TmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgY2hlY2sgcHJvdGVjdHMgbXVsdGlwbGUgdXNlcyBvZiBgZXhwZWN0ZWRgLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbiBydWxlIGlzIGRpc2FibGVkIGluIHNldmVyYWwgc3BvdHNcbiAgICAgIC8vIGJlbG93LlxuICAgICAge1xuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICAgIHNhbml0aXplVVJMKCcnICsgZXhwZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gbnVsbDtcblxuICAgICAgaWYgKHByb3BlcnR5SW5mby50eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4pIHtcbiAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICAgIC8vIFdlIGhhZCBhbiBhdHRyaWJ1dGUgYnV0IHNob3VsZG4ndCBoYXZlIGhhZCBvbmUsIHNvIHJlYWQgaXRcbiAgICAgICAgICAvLyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby50eXBlID09PSBCT09MRUFOKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBib29sZWFuLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBpc1xuICAgICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgZXhwZWN0ZWQuXG4gICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICB9IC8vIEV2ZW4gaWYgdGhpcyBwcm9wZXJ0eSB1c2VzIGEgbmFtZXNwYWNlIHdlIHVzZSBnZXRBdHRyaWJ1dGVcbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBhc3N1bWUgaXRzIG5hbWVzcGFjZWQgbmFtZSBpcyB0aGUgc2FtZSBhcyBvdXIgY29uZmlnLlxuICAgICAgICAvLyBUbyB1c2UgZ2V0QXR0cmlidXRlTlMgd2UgbmVlZCB0aGUgbG9jYWwgbmFtZSB3aGljaCB3ZSBkb24ndCBoYXZlXG4gICAgICAgIC8vIGluIG91ciBjb25maWcgYXRtLlxuXG5cbiAgICAgICAgc3RyaW5nVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlID09PSBudWxsID8gZXhwZWN0ZWQgOiBzdHJpbmdWYWx1ZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBhdHRyaWJ1dGUgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy4gU29tZVxuICogYXR0cmlidXRlcyBoYXZlIG11bHRpcGxlIGVxdWl2YWxlbnQgdmFsdWVzLlxuICovXG5cbmZ1bmN0aW9uIGdldFZhbHVlRm9yQXR0cmlidXRlKG5vZGUsIG5hbWUsIGV4cGVjdGVkLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH1cblxuXG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyB8fCBwcm9wZXJ0eUluZm8gPT09IG51bGwpIHtcbiAgICBpZiAoaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgdmFyIF9hdHRyaWJ1dGVOYW1lID0gbmFtZTtcblxuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKF9hdHRyaWJ1dGVOYW1lLCAgJycgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG11c3RVc2VQcm9wZXJ0eSA9IHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHk7XG5cbiAgaWYgKG11c3RVc2VQcm9wZXJ0eSkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YXIgdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdHlwZSA9PT0gQk9PTEVBTiA/IGZhbHNlIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnRyYXJ5IHRvIGBzZXRBdHRyaWJ1dGVgLCBvYmplY3QgcHJvcGVydGllcyBhcmUgcHJvcGVybHlcbiAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGUgcmVzdCBhcmUgdHJlYXRlZCBhcyBhdHRyaWJ1dGVzIHdpdGggc3BlY2lhbCBjYXNlcy5cblxuXG4gIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBfdHlwZSA9IHByb3BlcnR5SW5mby50eXBlO1xuICAgIHZhciBhdHRyaWJ1dGVWYWx1ZTtcblxuICAgIGlmIChfdHlwZSA9PT0gQk9PTEVBTiB8fCBfdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAvLyBJZiBhdHRyaWJ1dGUgdHlwZSBpcyBib29sZWFuLCB3ZSBrbm93IGZvciBzdXJlIGl0IHdvbid0IGJlIGFuIGV4ZWN1dGlvbiBzaW5rXG4gICAgICAvLyBhbmQgd2Ugd29uJ3QgcmVxdWlyZSBUcnVzdGVkIFR5cGUgaGVyZS5cbiAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRwdXQgdGhlIGNvcnJlY3QgdG9TdHJpbmcoKS12YWx1ZS5cbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIHNhbml0aXplVVJMKGF0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdHRyaWJ1dGVOYW1lc3BhY2UpIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoYXR0cmlidXRlTmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKTtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKTtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5Jyk7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJyk7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG52YXIgUkVBQ1RfQ0FDSEVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmNhY2hlJyk7XG52YXIgUkVBQ1RfVFJBQ0lOR19NQVJLRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnRyYWNpbmdfbWFya2VyJyk7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoY3Rvciwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShjdG9yLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qod29ya0luUHJvZ3Jlc3MpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICBkbyB7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlRmliZXIobm9kZSk7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSk7XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfSBjYXRjaCAoeCkge1xuICAgIHJldHVybiAnXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogJyArIHgubWVzc2FnZSArICdcXG4nICsgeC5zdGFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZSQxKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUkMSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikge1xuICB2YXIgdGFnID0gZmliZXIudGFnLFxuICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdDYWNoZSc7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdEZWh5ZHJhdGVkRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lJDEodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAvLyBIb3N0IGNvbXBvbmVudCB0eXBlIGlzIHRoZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJkaXZcIiwgXCJWaWV3XCIpXG4gICAgICByZXR1cm4gdHlwZTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gJ1Jvb3QnO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiAnVGV4dCc7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICAvLyBOYW1lIGNvbWVzIGZyb20gdGhlIHR5cGUgaW4gdGhpcyBjYXNlOyB3ZSBkb24ndCBoYXZlIGEgdGFnLlxuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIGlmICh0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFKSB7XG4gICAgICAgIC8vIERvbid0IGJlIGxlc3Mgc3BlY2lmaWMgdGhhbiBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG4gICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTW9kZSc7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1Njb3BlJztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdUcmFjaW5nTWFya2VyJztcbiAgICAvLyBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIHRhZ3MgY29tZSBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIHR5cGU6XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xudmFyIGN1cnJlbnQgPSBudWxsO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBTYWZlIGJlY2F1c2UgaWYgY3VycmVudCBmaWJlciBleGlzdHMsIHdlIGFyZSByZWNvbmNpbGluZyxcbiAgICAvLyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgd29yay1pbi1wcm9ncmVzcyB2ZXJzaW9uLlxuXG5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBmaWJlciA9PT0gbnVsbCA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuXG4vLyBGbG93IGRvZXMgbm90IGFsbG93IHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIG1vc3Qgbm9uLXN0cmluZyB0eXBlcy4gVG8gd29ya1xuLy8gYXJvdW5kIHRoaXMgbGltaXRhdGlvbiwgd2UgdXNlIGFuIG9wYXF1ZSB0eXBlIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgYnlcbi8vIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggZ2V0VG9TdHJpbmdWYWx1ZSBmaXJzdC5cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIFRoZSBjb2VyY2lvbiBzYWZldHkgY2hlY2sgaXMgcGVyZm9ybWVkIGluIGdldFRvU3RyaW5nVmFsdWUoKS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcblxuICB7XG4gICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKG5vZGVbdmFsdWVGaWVsZF0pO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIHNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pOyAvLyBXZSBjb3VsZCd2ZSBwYXNzZWQgdGhpcyB0aGUgZmlyc3QgdGltZVxuICAvLyBidXQgaXQgdHJpZ2dlcnMgYSBidWcgaW4gSUUxMSBhbmQgRWRnZSAxNC8xNS5cbiAgLy8gQ2FsbGluZyBkZWZpbmVQcm9wZXJ0eSgpIGFnYWluIHNob3VsZCBiZSBlcXVpdmFsZW50LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExNzY4XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG4gIHZhciB0cmFja2VyID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH0sXG4gICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUT0RPOiBPbmNlIGl0J3MganVzdCBGaWJlciB3ZSBjYW4gbW92ZSB0aGlzIHRvIG5vZGUuX3dyYXBwZXJTdGF0ZVxuXG5cbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gdHJhY2tWYWx1ZU9uTm9kZShub2RlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpOyAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcblxuICBpZiAoIXRyYWNrZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsYXN0VmFsdWUgPSB0cmFja2VyLmdldFZhbHVlKCk7XG4gIHZhciBuZXh0VmFsdWUgPSBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpO1xuXG4gIGlmIChuZXh0VmFsdWUgIT09IGxhc3RWYWx1ZSkge1xuICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHtcbiAgZG9jID0gZG9jIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuXG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkXG4gIH0pO1xuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnaW5wdXQnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgPyAnJyA6IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcblxuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcblxuICAgIGlmICghbm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSB1bmRlZmluZWQgdG8gJyArICdhIGRlZmluZWQgdmFsdWUsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxlZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIGEgZGVmaW5lZCB0byAnICsgJ3VuZGVmaW5lZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcyk7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fCAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gY29lcmNlIHRvIG51bWJlciBoZXJlIGlmIHBvc3NpYmxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBub2RlLnZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpIHtcbiAgICAvLyBTdWJtaXQvcmVzZXQgaW5wdXRzIG5lZWQgdGhlIGF0dHJpYnV0ZSByZW1vdmVkIGNvbXBsZXRlbHkgdG8gYXZvaWRcbiAgICAvLyBibGFuay10ZXh0IGJ1dHRvbnMuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyKGVsZW1lbnQsIHByb3BzLCBpc0h5ZHJhdGluZykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgfHwgcHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHZhciBpc0J1dHRvbiA9IHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCc7IC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG5cbiAgICBpZiAoaXNCdXR0b24gJiYgKHByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcHMudmFsdWUgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpOyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICAgIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAgIHtcbiAgICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzaG91bGQgdXNlXG4gICAgICAgIC8vIHRoZSB3cmFwcGVyU3RhdGUuX2luaXRpYWxWYWx1ZSBwcm9wZXJ0eS4gVGhpcyB1c2VzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDMuIEFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzeW5jaHJvbml6ZWQgdG8gdGhlIHByb3BlcnR5LFxuICAgICAgLy8gc28gd2UgYXNzaWduIGRlZmF1bHRWYWx1ZSB0byB0aGUgc2FtZSB0aGluZyBhcyB0aGUgdmFsdWUgcHJvcGVydHlcbiAgICAgIC8vIGFzc2lnbm1lbnQgc3RlcCBhYm92ZS5cbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfSAvLyBOb3JtYWxseSwgd2UnZCBqdXN0IGRvIGBub2RlLmNoZWNrZWQgPSBub2RlLmNoZWNrZWRgIHVwb24gaW5pdGlhbCBtb3VudCwgbGVzcyB0aGlzIGJ1Z1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuXG4gIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjA4NDE2XG4gIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG5cblxuICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSAnJztcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBib3RoIHRoZSBjaGVja2VkIHByb3BlcnR5IGFuZFxuICAgIC8vIGF0dHJpYnV0ZSBhcmUgYXNzaWduZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyBkZWZhdWx0Q2hlY2tlZC4gVGhpcyB1c2VzOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgY2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDIuIFRoZSBkZWZhdWx0Q2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDMuIE90aGVyd2lzZSwgZmFsc2VcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1xuICB9XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHVwZGF0ZVdyYXBwZXIobm9kZSwgcHJvcHMpO1xuICB1cGRhdGVOYW1lZENvdXNpbnMobm9kZSwgcHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVOYW1lZENvdXNpbnMocm9vdE5vZGUsIHByb3BzKSB7XG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcblxuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH0gLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cblxuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCAnbmFtZScpO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlICcgKyAnc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gLy8gV2UgbmVlZCB1cGRhdGUgdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG5hbWVkIGNvdXNpbiBzaW5jZSB0aGUgdmFsdWVcbiAgICAgIC8vIHdhcyBjaGFuZ2VkIGJ1dCB0aGUgaW5wdXQgc2F3IG5vIGV2ZW50IG9yIHZhbHVlIHNldFxuXG5cbiAgICAgIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7IC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNrZWRcbiAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLlxuXG4gICAgICB1cGRhdGVXcmFwcGVyKG90aGVyTm9kZSwgb3RoZXJQcm9wcyk7XG4gICAgfVxuICB9XG59IC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4vLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsXG4vLyBDaHJvbWUgcmFpc2VzIFwiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLlxuLy9cbi8vIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZWZhdWx0VmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGF2b2lkaW5nIHRoZXNlIHByb2JsZW1zXG4vLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0XG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzXG5cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIGlmICggLy8gRm9jdXNlZCBudW1iZXIgaW5wdXRzIHN5bmNocm9uaXplIG9uIGJsdXIuIFNlZSBDaGFuZ2VFdmVudFBsdWdpbi5qc1xuICB0eXBlICE9PSAnbnVtYmVyJyB8fCBnZXRBY3RpdmVFbGVtZW50KG5vZGUub3duZXJEb2N1bWVudCkgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZENoaWxkID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSBmYWxzZTtcbi8qKlxuICogSW1wbGVtZW50cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBpcyBzZXQuXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gSWYgYSB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGNoaWxkcmVuIG11c3QgYmUgc2ltcGxlLlxuICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnb2JqZWN0JyAmJiBwcm9wcy5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkQ2hpbGQpIHtcbiAgICAgICAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignQ2Fubm90IGluZmVyIHRoZSBvcHRpb24gdmFsdWUgb2YgY29tcGxleCBjaGlsZHJlbi4gJyArICdQYXNzIGEgYHZhbHVlYCBwcm9wIG9yIHVzZSBhIHBsYWluIHN0cmluZyBhcyBjaGlsZHJlbiB0byA8b3B0aW9uPi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICAgIGlmICghZGlkV2FybkludmFsaWRJbm5lckhUTUwpIHtcbiAgICAgICAgICBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUGFzcyBhIGB2YWx1ZWAgcHJvcCBpZiB5b3Ugc2V0IGRhbmdlcm91c2x5SW5uZXJIVE1MIHNvIFJlYWN0IGtub3dzICcgKyAnd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi5cblxuXG4gICAgaWYgKHByb3BzLnNlbGVjdGVkICE9IG51bGwgJiYgIWRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uKSB7XG4gICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG5cbiAgICAgIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxO1xuXG57XG4gIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuXG5mdW5jdGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnc2VsZWN0JywgcHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG5cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BOYW1lSXNBcnJheSA9IGlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFByZWZpeCB0byBhdm9pZCBjaGFvcyB3aXRoIHNwZWNpYWwga2V5cy5cbiAgICAgIHNlbGVjdGVkVmFsdWVbJyQnICsgc2VsZWN0ZWRWYWx1ZXNbaV1dID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3B0aW9ucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkoJyQnICsgb3B0aW9uc1tfaV0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHZhciBfc2VsZWN0ZWRWYWx1ZSA9IHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKSk7XG5cbiAgICB2YXIgZGVmYXVsdFNlbGVjdGVkID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgICAgb3B0aW9uc1tfaTJdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRTZWxlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFNlbGVjdGVkLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJyk7XG4gIH0gLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gIC8vIHRvIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5vZGUgdmFsdWUgKHdoaWNoIHdvdWxkXG4gIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitTb3BoaWUgc2VlbWVkIHRvIGxpa2UgdGhpc1xuICAvLyBzb2x1dGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWRcbiAgLy8gdG8gYmUgYSBzdHJpbmcuXG5cblxuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hpbGRyZW46IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpXG4gIH0pO1xuXG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCd0ZXh0YXJlYScsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGEgdGV4dGFyZWEgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcblxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbml0aWFsVmFsdWUgPSBwcm9wcy52YWx1ZTsgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcblxuICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOyAvLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5cbmZ1bmN0aW9uIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N2Zyc6XG4gICAgICByZXR1cm4gU1ZHX05BTUVTUEFDRTtcblxuICAgIGNhc2UgJ21hdGgnOlxuICAgICAgcmV0dXJuIE1BVEhfTkFNRVNQQUNFO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50TmFtZXNwYWNlLCB0eXBlKSB7XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT0gbnVsbCB8fCBwYXJlbnROYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PT0gU1ZHX05BTUVTUEFDRSAmJiB0eXBlID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyBXZSdyZSBsZWF2aW5nIFNWRy5cbiAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH0gLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG5cblxuICByZXR1cm4gcGFyZW50TmFtZXNwYWNlO1xufVxuXG4vKiBnbG9iYWxzIE1TQXBwICovXG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG52YXIgcmV1c2FibGVTVkdDb250YWluZXI7XG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZVxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBhc3BlY3RSYXRpbzogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgY29sdW1uczogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3BhbjogdHJ1ZSxcbiAgZ3JpZFJvd1N0YXJ0OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3BhbjogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddOyAvLyBVc2luZyBPYmplY3Qua2V5cyBoZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFuXG4vLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFkZGVkIHByb3BzIHRvby5cblxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQuXG4gKi9cblxuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuXG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHtcbiAgICBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBhc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbnZhciBIVE1MID0gJ19faHRtbCc7XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcykge1xuICBpZiAoIXByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdoaWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cblxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCB8fCBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciBcIiArICd1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09ICdvYmplY3QnIHx8ICEoSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gJyArICdQbGVhc2UgdmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sICcgKyAnZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmICghcHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nICYmIHByb3BzLmNvbnRlbnRFZGl0YWJsZSAmJiBwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wcy5zdHlsZSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgJyArIFwibm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIFwiICsgJ3VzaW5nIEpTWC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW1hZ2VzaXplczogJ2ltYWdlU2l6ZXMnLFxuICBpbWFnZXNyY3NldDogJ2ltYWdlU3JjU2V0JyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRlc2NyaXB0aW9uJzogMCxcbiAgJ2FyaWEtZGV0YWlscyc6IDAsXG4gICdhcmlhLWRpc2FibGVkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaGlkZGVuJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaW52YWxpZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICdhcmlhLWxhYmVsJzogMCxcbiAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCxcbiAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCxcbiAgJ2FyaWEtY2hlY2tlZCc6IDAsXG4gICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgJ2FyaWEtaGFzcG9wdXAnOiAwLFxuICAnYXJpYS1sZXZlbCc6IDAsXG4gICdhcmlhLW1vZGFsJzogMCxcbiAgJ2FyaWEtbXVsdGlsaW5lJzogMCxcbiAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCxcbiAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAnYXJpYS1wbGFjZWhvbGRlcic6IDAsXG4gICdhcmlhLXByZXNzZWQnOiAwLFxuICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICdhcmlhLXJlcXVpcmVkJzogMCxcbiAgJ2FyaWEtc2VsZWN0ZWQnOiAwLFxuICAnYXJpYS1zb3J0JzogMCxcbiAgJ2FyaWEtdmFsdWVtYXgnOiAwLFxuICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICdhcmlhLXZhbHVlbm93JzogMCxcbiAgJ2FyaWEtdmFsdWV0ZXh0JzogMCxcbiAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlc1xuICAnYXJpYS1hdG9taWMnOiAwLFxuICAnYXJpYS1idXN5JzogMCxcbiAgJ2FyaWEtbGl2ZSc6IDAsXG4gICdhcmlhLXJlbGV2YW50JzogMCxcbiAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWRyb3BlZmZlY3QnOiAwLFxuICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsXG4gICdhcmlhLWNvbGNvdW50JzogMCxcbiAgJ2FyaWEtY29saW5kZXgnOiAwLFxuICAnYXJpYS1jb2xzcGFuJzogMCxcbiAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAnYXJpYS1kZXNjcmliZWRieSc6IDAsXG4gICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsXG4gICdhcmlhLWZsb3d0byc6IDAsXG4gICdhcmlhLWxhYmVsbGVkYnknOiAwLFxuICAnYXJpYS1vd25zJzogMCxcbiAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAnYXJpYS1yb3djb3VudCc6IDAsXG4gICdhcmlhLXJvd2luZGV4JzogMCxcbiAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICdhcmlhLXNldHNpemUnOiAwXG59O1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgckFSSUFDYW1lbCA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBFVkVOVF9OQU1FX1JFR0VYID0gL15vbi4vO1xuICB2YXIgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYID0gL15vblteQS1aXS87XG4gIHZhciByQVJJQSQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG4gIHZhciByQVJJQUNhbWVsJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcyQxLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNpbicgfHwgbG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3Vzb3V0Jykge1xuICAgICAgZXJyb3IoJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuXG5cbiAgICBpZiAoZXZlbnRSZWdpc3RyeSAhPSBudWxsKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IGV2ZW50UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gZXZlbnRSZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAvLyBJZiBubyBldmVudCBwbHVnaW5zIGhhdmUgYmVlbiBpbmplY3RlZCwgd2UgYXJlIGluIGEgc2VydmVyIGVudmlyb25tZW50LlxuICAgICAgLy8gU28gd2UgY2FuJ3QgdGVsbCBpZiB0aGUgZXZlbnQgbmFtZSBpcyBjb3JyZWN0IGZvciBzdXJlLCBidXQgd2UgY2FuIGZpbHRlclxuICAgICAgLy8gb3V0IGtub3duIGJhZCBvbmVzIGxpa2UgYG9uY2xpY2tgLiBXZSBjYW4ndCBzdWdnZXN0IGEgc3BlY2lmaWMgcmVwbGFjZW1lbnQgdGhvdWdoLlxuICAgICAgaWYgKElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gJyArICdSZWFjdCBldmVudHMgdXNlIHRoZSBjYW1lbENhc2UgbmFtaW5nIGNvbnZlbnRpb24sIGZvciBleGFtcGxlIGBvbkNsaWNrYC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuXG5cbiAgICBpZiAockFSSUEkMS50ZXN0KG5hbWUpIHx8IHJBUklBQ2FtZWwkMS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpbm5lcmh0bWwnKSB7XG4gICAgICBlcnJvcignRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBgaW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnYXJpYScpIHtcbiAgICAgIGVycm9yKCdUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gJyArICdQYXNzIGluZGl2aWR1YWwgYGFyaWEtYCBhdHRyaWJ1dGVzIGluc3RlYWQuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpcycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgTmFOIGZvciB0aGUgYCVzYCBhdHRyaWJ1dGUuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgbmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICAgIHZhciBpc1Jlc2VydmVkID0gcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDsgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cblxuICAgIGlmIChwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBET00gcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkICYmIG5hbWUgIT09IGxvd2VyQ2FzZWROYW1lKSB7XG4gICAgICAvLyBVbmtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIGhhdmUgbG93ZXJjYXNlIGNhc2luZyBzaW5jZSB0aGF0J3MgaG93IHRoZXlcbiAgICAgIC8vIHdpbGwgYmUgY2FzZWQgYW55d2F5IHdpdGggc2VydmVyIHJlbmRlcmluZy5cbiAgICAgIGVycm9yKCdSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGAlc2AgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBJZiB5b3UgJyArICdpbnRlbnRpb25hbGx5IHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBET00gYXMgYSBjdXN0b20gJyArICdhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuICcgKyAnSWYgeW91IGFjY2lkZW50YWxseSBwYXNzZWQgaXQgZnJvbSBhIHBhcmVudCBjb21wb25lbnQsIHJlbW92ZSAnICsgJ2l0IGZyb20gdGhlIERPTSBlbGVtZW50LicsIG5hbWUsIGxvd2VyQ2FzZWROYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTm93IHRoYXQgd2UndmUgdmFsaWRhdGVkIGNhc2luZywgZG8gbm90IHZhbGlkYXRlXG4gICAgLy8gZGF0YSB0eXBlcyBmb3IgcmVzZXJ2ZWQgcHJvcHNcblxuXG4gICAgaWYgKGlzUmVzZXJ2ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2FybiB3aGVuIGEga25vd24gYXR0cmlidXRlIGlzIGEgYmFkIHR5cGVcblxuXG4gICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBwYXNzaW5nIHRoZSBzdHJpbmdzICdmYWxzZScgb3IgJ3RydWUnIGludG8gYSBib29sZWFuIHByb3BcblxuXG4gICAgaWYgKCh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJ3RydWUnKSAmJiBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICB7XG4gICAgdmFyIHVua25vd25Qcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkkMSh0eXBlLCBrZXksIHByb3BzW2tleV0sIGV2ZW50UmVnaXN0cnkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCB0aGVtIGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuVW5rbm93blByb3BlcnRpZXModHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpO1xufVxuXG52YXIgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgPSAxO1xudmFyIElTX05PTl9ERUxFR0FURUQgPSAxIDw8IDE7XG52YXIgSVNfQ0FQVFVSRV9QSEFTRSA9IDEgPDwgMjtcbi8vIHNldCB0byBMRUdBQ1lfRkJfU1VQUE9SVC4gTEVHQUNZX0ZCX1NVUFBPUlQgb25seSBnZXRzIHNldCB3aGVuXG4vLyB3ZSBjYWxsIHdpbGxEZWZlckxhdGVyRm9yTGVnYWN5RkJTdXBwb3J0LCB0aHVzIG5vdCBiYWlsaW5nIG91dFxuLy8gd2lsbCByZXN1bHQgaW4gZW5kbGVzcyBjeWNsZXMgbGlrZSBhbiBpbmZpbml0ZSBsb29wLlxuLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGRlZmVyIGR1cmluZyBldmVudCByZXBsYXlpbmcuXG5cbnZhciBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUyA9IElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFIHwgSVNfTk9OX0RFTEVHQVRFRCB8IElTX0NBUFRVUkVfUEhBU0U7XG5cbi8vIFRoaXMgZXhpc3RzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBSZWFjdERPTUV2ZW50UmVwbGF5aW5nXG4vLyBhbmQgRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG52YXIgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNldFJlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gZXZlbnQ7XG59XG5mdW5jdGlvbiByZXNldFJlcGxheWluZ0V2ZW50KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xufVxuZnVuY3Rpb24gaXNSZXBsYXlpbmdFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQgPT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHJlc3RvcmVJbXBsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGZvciBjb250cm9sbGVkICcgKyAnZXZlbnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN0YXRlTm9kZSA9IGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlOyAvLyBHdWFyZCBhZ2FpbnN0IEZpYmVyIGJlaW5nIHVubW91bnRlZC5cblxuICBpZiAoc3RhdGVOb2RlKSB7XG4gICAgdmFyIF9wcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICAgIHJlc3RvcmVJbXBsKGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlLCBpbnRlcm5hbEluc3RhbmNlLnR5cGUsIF9wcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKGltcGwpIHtcbiAgcmVzdG9yZUltcGwgPSBpbXBsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZHNTdGF0ZVJlc3RvcmUoKSB7XG4gIHJldHVybiByZXN0b3JlVGFyZ2V0ICE9PSBudWxsIHx8IHJlc3RvcmVRdWV1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCkge1xuICBpZiAoIXJlc3RvcmVUYXJnZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGFyZ2V0ID0gcmVzdG9yZVRhcmdldDtcbiAgdmFyIHF1ZXVlZFRhcmdldHMgPSByZXN0b3JlUXVldWU7XG4gIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xuICByZXN0b3JlUXVldWUgPSBudWxsO1xuICByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpO1xuXG4gIGlmIChxdWV1ZWRUYXJnZXRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZWRUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0b3JlU3RhdGVPZlRhcmdldChxdWV1ZWRUYXJnZXRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gdGhlIHJlbmRlcmVyLiBTdWNoIGFzIHdoZW4gd2UncmUgZGlzcGF0Y2hpbmcgZXZlbnRzIG9yIGlmIHRoaXJkIHBhcnR5XG4vLyBsaWJyYXJpZXMgbmVlZCB0byBjYWxsIGJhdGNoZWRVcGRhdGVzLiBFdmVudHVhbGx5LCB0aGlzIEFQSSB3aWxsIGdvIGF3YXkgd2hlblxuLy8gZXZlcnl0aGluZyBpcyBiYXRjaGVkIGJ5IGRlZmF1bHQuIFdlJ2xsIHRoZW4gaGF2ZSBhIHNpbWlsYXIgQVBJIHRvIG9wdC1vdXQgb2Zcbi8vIHNjaGVkdWxlZCB3b3JrIGFuZCBpbnN0ZWFkIGRvIHN5bmNocm9ub3VzIHdvcmsuXG4vLyBEZWZhdWx0c1xuXG52YXIgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcblxudmFyIGZsdXNoU3luY0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZpbmlzaEV2ZW50SGFuZGxlcigpIHtcbiAgLy8gSGVyZSB3ZSB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2ggaXMgaW1wb3J0YW50XG4gIC8vIHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAvLyBUaGVuIHdlIHJlc3RvcmUgc3RhdGUgb2YgYW55IGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICB2YXIgY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMgPSBuZWVkc1N0YXRlUmVzdG9yZSgpO1xuXG4gIGlmIChjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcykge1xuICAgIC8vIElmIGEgY29udHJvbGxlZCBldmVudCB3YXMgZmlyZWQsIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mXG4gICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAvLyBiYWlscyBvdXQgb2YgdGhlIHVwZGF0ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBET00uXG4gICAgLy8gVE9ETzogUmVzdG9yZSBzdGF0ZSBpbiB0aGUgbWljcm90YXNrLCBhZnRlciB0aGUgZGlzY3JldGUgdXBkYXRlcyBmbHVzaCxcbiAgICAvLyBpbnN0ZWFkIG9mIGVhcmx5IGZsdXNoaW5nIHRoZW0gaGVyZS5cbiAgICBmbHVzaFN5bmNJbXBsKCk7XG4gICAgcmVzdG9yZVN0YXRlSWZOZWVkZWQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyhmbiwgYSwgYikge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYmF0Y2hlZFVwZGF0ZXNJbXBsKGZuLCBhLCBiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59IC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBmbHVzaFN5bmNcbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaFN5bmNJbXBsKSB7XG4gIGJhdGNoZWRVcGRhdGVzSW1wbCA9IF9iYXRjaGVkVXBkYXRlc0ltcGw7XG4gIGZsdXNoU3luY0ltcGwgPSBfZmx1c2hTeW5jSW1wbDtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZUVudGVyJzpcbiAgICAgIHJldHVybiAhIShwcm9wcy5kaXNhYmxlZCAmJiBpc0ludGVyYWN0aXZlKHR5cGUpKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuXG4gIGlmIChzdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICBpZiAocHJvcHMgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QudHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxudmFyIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7IC8vIENoZWNrIGlmIGJyb3dzZXIgc3VwcG9ydCBldmVudHMgd2l0aCBwYXNzaXZlIGxpc3RlbmVyc1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjU2FmZWx5X2RldGVjdGluZ19vcHRpb25fc3VwcG9ydFxuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTsgLy8gJEZsb3dGaXhNZTogSWdub3JlIEZsb3cgY29tcGxhaW5pbmcgYWJvdXQgbmVlZGluZyBhIHZhbHVlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucywgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgdHJ5IHtcbiAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZDtcblxue1xuICAvLyBJbiBERVYgbW9kZSwgd2Ugc3dhcCBvdXQgaW52b2tlR3VhcmRlZENhbGxiYWNrIGZvciBhIHNwZWNpYWwgdmVyc2lvblxuICAvLyB0aGF0IHBsYXlzIG1vcmUgbmljZWx5IHdpdGggdGhlIGJyb3dzZXIncyBEZXZUb29scy4gVGhlIGlkZWEgaXMgdG8gcHJlc2VydmVcbiAgLy8gXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IuIEJlY2F1c2UgUmVhY3Qgd3JhcHMgYWxsIHVzZXItcHJvdmlkZWRcbiAgLy8gZnVuY3Rpb25zIGluIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYW5kIHRoZSBwcm9kdWN0aW9uIHZlcnNpb24gb2ZcbiAgLy8gaW52b2tlR3VhcmRlZENhbGxiYWNrIHVzZXMgYSB0cnktY2F0Y2gsIGFsbCB1c2VyIGV4Y2VwdGlvbnMgYXJlIHRyZWF0ZWRcbiAgLy8gbGlrZSBjYXVnaHQgZXhjZXB0aW9ucywgYW5kIHRoZSBEZXZUb29scyB3b24ndCBwYXVzZSB1bmxlc3MgdGhlIGRldmVsb3BlclxuICAvLyB0YWtlcyB0aGUgZXh0cmEgc3RlcCBvZiBlbmFibGluZyBwYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9ucy4gVGhpcyBpc1xuICAvLyB1bmludHVpdGl2ZSwgdGhvdWdoLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIFJlYWN0IGhhcyBjYXVnaHQgdGhlIGVycm9yLCBmcm9tXG4gIC8vIHRoZSBkZXZlbG9wZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGVycm9yIGlzIHVuY2F1Z2h0LlxuICAvL1xuICAvLyBUbyBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IsIHdlIGRvbid0IHVzZSBhXG4gIC8vIHRyeS1jYXRjaCBpbiBERVYuIEluc3RlYWQsIHdlIHN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IHRvIGEgZmFrZVxuICAvLyBET00gbm9kZSwgYW5kIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgZnJvbSBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlclxuICAvLyBmb3IgdGhhdCBmYWtlIGV2ZW50LiBJZiB0aGUgY2FsbGJhY2sgdGhyb3dzLCB0aGUgZXJyb3IgaXMgXCJjYXB0dXJlZFwiIHVzaW5nXG4gIC8vIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuIEJ1dCBiZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5zIGluIGEgZGlmZmVyZW50XG4gIC8vIGV2ZW50IGxvb3AgY29udGV4dCwgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRoZSBub3JtYWwgcHJvZ3JhbSBmbG93LlxuICAvLyBFZmZlY3RpdmVseSwgdGhpcyBnaXZlcyB1cyB0cnktY2F0Y2ggYmVoYXZpb3Igd2l0aG91dCBhY3R1YWxseSB1c2luZ1xuICAvLyB0cnktY2F0Y2guIE5lYXQhXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0RldihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZG9jdW1lbnRgIGdsb2JhbCB3YXMgZGVmaW5lZCB3aGVuIFJlYWN0IHdhcyBpbml0aWFsaXplZCwgYnV0IGlzIG5vdCAnICsgJ2RlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCAnICsgJ3NjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSAnICsgJ2ZpbmlzaGVkIHJ1bm5pbmcuIFRvIHNvbHZlIHRoaXMsIHlvdSBjYW4gZWl0aGVyIHVubW91bnQgdGhlIGNvbXBvbmVudCBhdCAnICsgJ3RoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCAnICsgJ2NhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgJyArICd0byBiZSBhc3luY2hyb25vdXMuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIHZhciBkaWRDYWxsID0gZmFsc2U7IC8vIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuIFdlXG4gICAgICAvLyBzZXQgdGhpcyB0byB0cnVlIGF0IHRoZSBiZWdpbm5pbmcsIHRoZW4gc2V0IGl0IHRvIGZhbHNlIHJpZ2h0IGFmdGVyXG4gICAgICAvLyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGVycm9ycywgYGRpZEVycm9yYCB3aWxsIG5ldmVyIGJlXG4gICAgICAvLyBzZXQgdG8gZmFsc2UuIFRoaXMgc3RyYXRlZ3kgd29ya3MgZXZlbiBpZiB0aGUgYnJvd3NlciBpcyBmbGFreSBhbmRcbiAgICAgIC8vIGZhaWxzIHRvIGNhbGwgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvblxuICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IGF0IGFsbC5cblxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG5cbiAgICAgIHZhciB3aW5kb3dFdmVudCA9IHdpbmRvdy5ldmVudDsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGRlc2NyaXB0b3Igb2Ygd2luZG93LmV2ZW50IHRvIHJlc3RvcmUgaXQgYWZ0ZXIgZXZlbnRcbiAgICAgIC8vIGRpc3BhdGNoaW5nOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjg4XG5cbiAgICAgIHZhciB3aW5kb3dFdmVudERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2V2ZW50Jyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3RvcmVBZnRlckRpc3BhdGNoKCkge1xuICAgICAgICAvLyBXZSBpbW1lZGlhdGVseSByZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gZXZlbnQgbGlzdGVuZXJzIHNvIHRoYXRcbiAgICAgICAgLy8gbmVzdGVkIGBpbnZva2VHdWFyZGVkQ2FsbGJhY2tgIGNhbGxzIGRvIG5vdCBjbGFzaC4gT3RoZXJ3aXNlLCBhXG4gICAgICAgIC8vIG5lc3RlZCBjYWxsIHdvdWxkIHRyaWdnZXIgdGhlIGZha2UgZXZlbnQgaGFuZGxlcnMgb2YgYW55IGNhbGwgaGlnaGVyXG4gICAgICAgIC8vIGluIHRoZSBzdGFjay5cbiAgICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gV2UgY2hlY2sgZm9yIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSB0byBwcmV2ZW50IHRoZVxuICAgICAgICAvLyB3aW5kb3cuZXZlbnQgYXNzaWdubWVudCBpbiBib3RoIElFIDw9IDEwIGFzIHRoZXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gXCJNZW1iZXIgbm90IGZvdW5kXCIgaW4gc3RyaWN0IG1vZGUsIGFuZCBpbiBGaXJlZm94IHdoaWNoIGRvZXMgbm90XG4gICAgICAgIC8vIHN1cHBvcnQgd2luZG93LmV2ZW50LlxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykpIHtcbiAgICAgICAgICB3aW5kb3cuZXZlbnQgPSB3aW5kb3dFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBmb3Igb3VyIGZha2UgZXZlbnQuIFdlIHdpbGwgc3luY2hyb25vdXNseVxuICAgICAgLy8gZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQgdXNpbmcgYGRpc3BhdGNoRXZlbnRgLiBJbnNpZGUgdGhlIGhhbmRsZXIsIHdlXG4gICAgICAvLyBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrLlxuXG5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjaygpIHtcbiAgICAgICAgZGlkQ2FsbCA9IHRydWU7XG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICAgICAgICBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgfSAvLyBDcmVhdGUgYSBnbG9iYWwgZXJyb3IgZXZlbnQgaGFuZGxlci4gV2UgdXNlIHRoaXMgdG8gY2FwdHVyZSB0aGUgdmFsdWVcbiAgICAgIC8vIHRoYXQgd2FzIHRocm93bi4gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZXJyb3IgaGFuZGxlciB3aWxsIGZpcmUgbW9yZVxuICAgICAgLy8gdGhhbiBvbmNlOyBmb3IgZXhhbXBsZSwgaWYgbm9uLVJlYWN0IGNvZGUgYWxzbyBjYWxscyBgZGlzcGF0Y2hFdmVudGBcbiAgICAgIC8vIGFuZCBhIGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQgdGhyb3dzLiBXZSBzaG91bGQgYmUgcmVzaWxpZW50IHRvIG1vc3Qgb2ZcbiAgICAgIC8vIHRob3NlIGNhc2VzLiBFdmVuIGlmIG91ciBlcnJvciBldmVudCBoYW5kbGVyIGZpcmVzIG1vcmUgdGhhbiBvbmNlLCB0aGVcbiAgICAgIC8vIGxhc3QgZXJyb3IgZXZlbnQgaXMgYWx3YXlzIHVzZWQuIElmIHRoZSBjYWxsYmFjayBhY3R1YWxseSBkb2VzIGVycm9yLFxuICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBsYXN0IGVycm9yIGV2ZW50IGlzIHRoZSBjb3JyZWN0IG9uZSwgYmVjYXVzZSBpdCdzIG5vdFxuICAgICAgLy8gcG9zc2libGUgZm9yIGFueXRoaW5nIGVsc2UgdG8gaGF2ZSBoYXBwZW5lZCBpbiBiZXR3ZWVuIG91ciBjYWxsYmFja1xuICAgICAgLy8gZXJyb3JpbmcgYW5kIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB0aGUgYGRpc3BhdGNoRXZlbnRgIGNhbGwgYmVsb3cuIElmXG4gICAgICAvLyB0aGUgY2FsbGJhY2sgZG9lc24ndCBlcnJvciwgYnV0IHRoZSBlcnJvciBldmVudCB3YXMgZmlyZWQsIHdlIGtub3cgdG9cbiAgICAgIC8vIGlnbm9yZSBpdCBiZWNhdXNlIGBkaWRFcnJvcmAgd2lsbCBiZSBmYWxzZSwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXG5cbiAgICAgIHZhciBlcnJvcjsgLy8gVXNlIHRoaXMgdG8gdHJhY2sgd2hldGhlciB0aGUgZXJyb3IgZXZlbnQgaXMgZXZlciBjYWxsZWQuXG5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsICYmIGV2ZW50LmNvbG5vID09PSAwICYmIGV2ZW50LmxpbmVubyA9PT0gMCkge1xuICAgICAgICAgIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IgaGFuZGxlciBoYXMgcHJldmVudGVkIGRlZmF1bHQuXG4gICAgICAgICAgLy8gQnJvd3NlcnMgc2lsZW5jZSB0aGUgZXJyb3IgcmVwb3J0IGlmIHRoaXMgaGFwcGVucy5cbiAgICAgICAgICAvLyBXZSdsbCByZW1lbWJlciB0aGlzIHRvIGxhdGVyIGRlY2lkZSB3aGV0aGVyIHRvIGxvZyBpdCBvciBub3QuXG4gICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChpbm5lcikgey8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuXG5cbiAgICAgIHZhciBldnRUeXBlID0gXCJyZWFjdC1cIiArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTsgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG4gICAgICBmYWtlTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBTeW5jaHJvbm91c2x5IGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50LiBJZiB0aGUgdXNlci1wcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gZXJyb3JzLCBpdCB3aWxsIHRyaWdnZXIgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLlxuXG4gICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgICAgIGlmICh3aW5kb3dFdmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2V2ZW50Jywgd2luZG93RXZlbnREZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZENhbGwgJiYgZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkEgY3Jvc3Mtb3JpZ2luIGVycm9yIHdhcyB0aHJvd24uIFJlYWN0IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gXCIgKyAndGhlIGFjdHVhbCBlcnJvciBvYmplY3QgaW4gZGV2ZWxvcG1lbnQuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICB9IC8vIFJlbW92ZSBvdXIgZXZlbnQgbGlzdGVuZXJzXG5cblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuXG4gICAgICBpZiAoIWRpZENhbGwpIHtcbiAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLCBhbmQgb3VyIGV2ZW50IHdhcyBub3QgZGlzcGF0Y2hlZC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjczNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NTg1XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgcHJvZHVjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG52YXIgaGFzRXJyb3IgPSBmYWxzZTtcbnZhciBjYXVnaHRFcnJvciA9IG51bGw7IC8vIFVzZWQgYnkgZXZlbnQgc3lzdGVtIHRvIGNhcHR1cmUvcmV0aHJvdyB0aGUgZmlyc3QgZXJyb3IuXG5cbnZhciBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbnZhciByZXRocm93RXJyb3IgPSBudWxsO1xudmFyIHJlcG9ydGVyID0ge1xuICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufTtcbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEuYXBwbHkocmVwb3J0ZXIsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaFxuICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICovXG5cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDYXVnaHRFcnJvcigpIHtcbiAgcmV0dXJuIGhhc0Vycm9yO1xufVxuZnVuY3Rpb24gY2xlYXJDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJDYXVnaHRFcnJvciB3YXMgY2FsbGVkIGJ1dCBubyBlcnJvciB3YXMgY2FwdHVyZWQuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFpbnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsXG4gKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpY1xuICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFzIGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrXG4gKiB0byBpbnRlcm5hbCBtZXRob2RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgc2hhcmVkIGFuZCBhc3N1bWVkIHRvIGJlIHN0YXRlbGVzcy5cbiAqIElmIHRoaXMgYmVjb21lcyBhbiBhY3R1YWwgTWFwLCB0aGF0IHdpbGwgYnJlYWsuXG4gKi9cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHM7XG59XG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxzID0gdmFsdWU7XG59XG5cbi8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLlxudmFyIE5vRmxhZ3MgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgUGVyZm9ybWVkV29yayA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuXG5cbnZhciBQbGFjZW1lbnQgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFVwZGF0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgQ2hpbGREZWxldGlvbiA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIEZvcmNlQ2xpZW50UmVuZGVyID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBSZWYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgU25hcHNob3QgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIEh5ZHJhdGluZyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVmlzaWJpbGl0eSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBTdG9yZUNvbnNpc3RlbmN5ID1cbi8qICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KVxuXG52YXIgSG9zdEVmZmVjdE1hc2sgPVxuLyogICAgICAgICAgICAgICAqL1xuMzI3Njc7IC8vIFRoZXNlIGFyZSBub3QgcmVhbGx5IHNpZGUgZWZmZWN0cywgYnV0IHdlIHN0aWxsIHJldXNlIHRoaXMgZmllbGQuXG5cbnZhciBJbmNvbXBsZXRlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlID1cbi8qICovXG4xMzEwNzI7XG52YXIgRm9ya2VkID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjsgLy8gU3RhdGljIHRhZ3MgZGVzY3JpYmUgYXNwZWN0cyBvZiBhIGZpYmVyIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlcixcbi8vIGUuZy4gYSBmaWJlciB1c2VzIGEgcGFzc2l2ZSBlZmZlY3QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgb24gdGhpcyBwYXJ0aWN1bGFyIHJlbmRlcikuXG4vLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsXG4vLyBzaW5jZSB3ZSBjYW4gZGVmZXIgdHJhdmVyc2luZyB0aGUgdHJlZSBkdXJpbmcgbGF5b3V0IHRvIGxvb2sgZm9yIFBhc3NpdmUgZWZmZWN0cyxcbi8vIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIHN0YXRpYyBmbGFnIGFzIGEgc2lnbmFsIHRoYXQgdGhlcmUgbWF5IGJlIGNsZWFudXAgd29yay5cblxudmFyIFJlZlN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgTGF5b3V0U3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBQYXNzaXZlU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICovXG44Mzg4NjA4OyAvLyBUaGVzZSBmbGFncyBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0byBmaWJlcnMgdGhhdCBoYXZlIGVmZmVjdHMgb24gbW91bnRcbi8vIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgZW50aXJlIHRyZWUgYWZ0ZXIgZXZlcnkgY29tbWl0IGZvclxuLy8gZG91YmxlIGludm9raW5nXG5cbnZhciBNb3VudExheW91dERldiA9XG4vKiAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBNb3VudFBhc3NpdmVEZXYgPVxuLyogICAgICAgICAgICAgICovXG4zMzU1NDQzMjsgLy8gR3JvdXBzIG9mIGZsYWdzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGNvbW1pdCBwaGFzZSB0byBza2lwIG92ZXIgdHJlZXMgdGhhdFxuLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuXG5cbnZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5XG4vLyBmbGFnIGxvZ2ljIChzZWUgIzIwMDQzKVxuVXBkYXRlIHwgU25hcHNob3QgfCAoIDApO1xudmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5O1xudmFyIExheW91dE1hc2sgPSBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFZpc2liaWxpdHk7IC8vIFRPRE86IFNwbGl0IGludG8gUGFzc2l2ZU1vdW50TWFzayBhbmQgUGFzc2l2ZVVubW91bnRNYXNrXG5cbnZhciBQYXNzaXZlTWFzayA9IFBhc3NpdmUgfCBDaGlsZERlbGV0aW9uOyAvLyBVbmlvbiBvZiB0YWdzIHRoYXQgZG9uJ3QgZ2V0IHJlc2V0IG9uIGNsb25lcy5cbi8vIFRoaXMgYWxsb3dzIGNlcnRhaW4gY29uY2VwdHMgdG8gcGVyc2lzdCB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlbSxcbi8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuXG5cbnZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG5mdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gIHZhciBub2RlID0gZmliZXI7XG4gIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyO1xuXG4gIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGlzIG1pZ2h0IGJlIGEgbmV3IHRyZWUgdGhhdCBpc24ndCBpbnNlcnRlZFxuICAgIC8vIHlldC4gSWYgaXQgaXMsIHRoZW4gaXQgd2lsbCBoYXZlIGEgcGVuZGluZyBpbnNlcnRpb24gZWZmZWN0IG9uIGl0LlxuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7XG5cbiAgICBkbyB7XG4gICAgICBub2RlID0gbmV4dE5vZGU7XG5cbiAgICAgIGlmICgobm9kZS5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbiBvciBpbi1wcm9ncmVzcyBoeWRyYXRpb24uIFRoZSBuZWFyZXN0IHBvc3NpYmxlXG4gICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0XG4gICAgICAgIC8vIGlmIHRoYXQgb25lIGlzIHN0aWxsIG1vdW50ZWQuXG4gICAgICAgIG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobmV4dE5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChub2RlLnJldHVybikge1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHdhcyBhIG5lc3RlZCBIb3N0Um9vdCB3aGVuIHVzZWQgd2l0aFxuICAgIC8vIHJlbmRlckNvbnRhaW5lckludG9TdWJ0cmVlLlxuICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDtcbiAgfSAvLyBJZiB3ZSBkaWRuJ3QgaGl0IHRoZSByb290LCB0aGF0IG1lYW5zIHRoYXQgd2UncmUgaW4gYW4gZGlzY29ubmVjdGVkIHRyZWVcbiAgLy8gdGhhdCBoYXMgYmVlbiB1bm1vdW50ZWQuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXJGcm9tRmliZXIoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgPyBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICghaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyRmliZXIpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gIGlmICghZmliZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc01vdW50ZWQoZmliZXIpIHtcbiAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKCFhbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIG1vdW50ZWQuXG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcik7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gZmliZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBJZiB3ZSBoYXZlIHR3byBwb3NzaWJsZSBicmFuY2hlcywgd2UnbGwgd2FsayBiYWNrd2FyZHMgdXAgdG8gdGhlIHJvb3RcbiAgLy8gdG8gc2VlIHdoYXQgcGF0aCB0aGUgcm9vdCBwb2ludHMgdG8uIE9uIHRoZSB3YXkgd2UgbWF5IGhpdCBvbmUgb2YgdGhlXG4gIC8vIHNwZWNpYWwgY2FzZXMgYW5kIHdlJ2xsIGRlYWwgd2l0aCB0aGVtLlxuXG5cbiAgdmFyIGEgPSBmaWJlcjtcbiAgdmFyIGIgPSBhbHRlcm5hdGU7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50QSA9IGEucmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudEEgPT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGF0IHRoZSByb290LlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcblxuICAgIGlmIChwYXJlbnRCID09PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBhbHRlcm5hdGUuIFRoaXMgaXMgYW4gdW51c3VhbCBjYXNlLiBDdXJyZW50bHksIGl0IG9ubHlcbiAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIFN1c3BlbnNlIGNvbXBvbmVudCBpcyBoaWRkZW4uIEFuIGV4dHJhIGZyYWdtZW50IGZpYmVyXG4gICAgICAvLyBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIHRoZSBTdXNwZW5zZSBmaWJlciBhbmQgaXRzIGNoaWxkcmVuLiBTa2lwXG4gICAgICAvLyBvdmVyIHRoaXMgZXh0cmEgZnJhZ21lbnQgZmliZXIgYW5kIHByb2NlZWQgdG8gdGhlIG5leHQgcGFyZW50LlxuICAgICAgdmFyIG5leHRQYXJlbnQgPSBwYXJlbnRBLnJldHVybjtcblxuICAgICAgaWYgKG5leHRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYSA9IGIgPSBuZXh0UGFyZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGF0IHRoZSByb290LlxuXG5cbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgYm90aCBjb3BpZXMgb2YgdGhlIHBhcmVudCBmaWJlciBwb2ludCB0byB0aGUgc2FtZSBjaGlsZCwgd2UgY2FuXG4gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGNoaWxkIGlzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGJhaWxvdXQgb24gbG93XG4gICAgLy8gcHJpb3JpdHk6IHRoZSBiYWlsZWQgb3V0IGZpYmVyJ3MgY2hpbGQgcmV1c2VzIHRoZSBjdXJyZW50IGNoaWxkLlxuXG5cbiAgICBpZiAocGFyZW50QS5jaGlsZCA9PT0gcGFyZW50Qi5jaGlsZCkge1xuICAgICAgdmFyIGNoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gYSkge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfSAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBhbiBhbHRlcm5hdGUgZm9yIGFueSBtb3VudGluZyBub2RlLiBTbyB0aGUgb25seVxuICAgICAgLy8gd2F5IHRoaXMgY291bGQgcG9zc2libHkgaGFwcGVuIGlzIGlmIHRoaXMgd2FzIHVubW91bnRlZCwgaWYgYXQgYWxsLlxuXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnICcgKyAnaW4gUmVhY3QgcmVsYXRlZCB0byB0aGUgcmV0dXJuIHBvaW50ZXIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnMnIGFsdGVybmF0ZXMuIFwiICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmIChhLnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxuXG4gIGlmIChhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhKSB7XG4gICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBPdGhlcndpc2UgQiBoYXMgdG8gYmUgY3VycmVudCBicmFuY2guXG5cblxuICByZXR1cm4gYWx0ZXJuYXRlO1xufVxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjaGlsZCk7XG5cbiAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGlmIChjaGlsZC50YWcgIT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY2hpbGQpO1xuXG4gICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBhcyBhbiBFU00gd3JhcHBlciBhcm91bmQgdGhlIGV4dGVybmFsIENvbW1vbkpTXG52YXIgc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbENhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG52YXIgbm93ID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IFNjaGVkdWxlci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eTtcbnZhciBOb3JtYWxQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eTtcbnZhciBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eTtcbnZhciBJZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuLy8gdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IG9uIHRoZSBzY2hlZHVsZXIsIGJ1dCBpdCAqZG9lcypcbi8vIG9uIHNjaGVkdWxlci91bnN0YWJsZV9tb2NrLCB3aGljaCB3ZSdsbCBuZWVkIGZvciBpbnRlcm5hbCB0ZXN0aW5nXG52YXIgdW5zdGFibGVfeWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlO1xudmFyIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlO1xuXG52YXIgcmVuZGVyZXJJRCA9IG51bGw7XG52YXIgaW5qZWN0ZWRIb29rID0gbnVsbDtcbnZhciBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xudmFyIGlzRGV2VG9vbHNQcmVzZW50ID0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCc7XG5mdW5jdGlvbiBpbmplY3RJbnRlcm5hbHMoaW50ZXJuYWxzKSB7XG4gIGlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vIERldlRvb2xzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGhvb2sgPSBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWhvb2suc3VwcG9ydHNGaWJlcikge1xuICAgIHtcbiAgICAgIGVycm9yKCdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnKTtcbiAgICB9IC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgLy8gQ29uZGl0aW9uYWxseSBpbmplY3QgdGhlc2UgaG9va3Mgb25seSBpZiBUaW1lbGluZSBwcm9maWxlciBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZC5cbiAgICAgIC8vIFRoaXMgZ2l2ZXMgRGV2VG9vbHMgYSB3YXkgdG8gZmVhdHVyZSBkZXRlY3QgdGhhdCBpc24ndCB0aWVkIHRvIHZlcnNpb24gbnVtYmVyXG4gICAgICAvLyAoc2luY2UgcHJvZmlsaW5nIGFuZCB0aW1lbGluZSBhcmUgY29udHJvbGxlZCBieSBkaWZmZXJlbnQgZmVhdHVyZSBmbGFncykuXG4gICAgICBpbnRlcm5hbHMgPSBhc3NpZ24oe30sIGludGVybmFscywge1xuICAgICAgICBnZXRMYW5lTGFiZWxNYXA6IGdldExhbmVMYWJlbE1hcCxcbiAgICAgICAgaW5qZWN0UHJvZmlsaW5nSG9va3M6IGluamVjdFByb2ZpbGluZ0hvb2tzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhvb2suY2hlY2tEQ0UpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSByZWFsIERldlRvb2xzLlxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgaG9vayBpbnN0YWxsZWQgYnkgRmFzdCBSZWZyZXNoIHJ1bnRpbWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIGV2ZW50UHJpb3JpdHkpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgc2NoZWR1bGVyUHJpb3JpdHksIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Qb3N0Q29tbWl0Um9vdChyb290KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhuZXdJc1N0cmljdE1vZGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgdW5zdGFibGVfeWllbGRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UncmUgaW4gYSB0ZXN0IGJlY2F1c2UgU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWUgb25seSBleGlzdHNcbiAgICAgIC8vIGluIFNjaGVkdWxlck1vY2suIFRvIHJlZHVjZSB0aGUgbm9pc2UgaW4gc3RyaWN0IG1vZGUgdGVzdHMsXG4gICAgICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBhbmQgZGlzYWJsZSBzY2hlZHVsZXIgeWllbGRpbmcgZHVyaW5nIHRoZSBkb3VibGUgcmVuZGVyXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZShuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgc2V0U3VwcHJlc3NXYXJuaW5nKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlKHJlbmRlcmVySUQsIG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBQcm9maWxlciBBUEkgaG9va3NcblxuZnVuY3Rpb24gaW5qZWN0UHJvZmlsaW5nSG9va3MocHJvZmlsaW5nSG9va3MpIHtcbiAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IHByb2ZpbGluZ0hvb2tzO1xufVxuXG5mdW5jdGlvbiBnZXRMYW5lTGFiZWxNYXAoKSB7XG4gIHtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYW5lID0gMTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBUb3RhbExhbmVzOyBpbmRleCsrKSB7XG4gICAgICB2YXIgbGFiZWwgPSBnZXRMYWJlbEZvckxhbmUobGFuZSk7XG4gICAgICBtYXAuc2V0KGxhbmUsIGxhYmVsKTtcbiAgICAgIGxhbmUgKj0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyWWllbGRlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgTm9Nb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkXG5cbnZhciBDb25jdXJyZW50TW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUHJvZmlsZU1vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFN0cmljdExlZ2FjeU1vZGUgPVxuLyogICAgICAgICAgICAgICAqL1xuODtcbnZhciBTdHJpY3RFZmZlY3RzTW9kZSA9XG4vKiAgICAgICAgICAgICAgKi9cbjE2O1xuXG4vLyBUT0RPOiBUaGlzIGlzIHByZXR0eSB3ZWxsIHN1cHBvcnRlZCBieSBicm93c2Vycy4gTWF5YmUgd2UgY2FuIGRyb3AgaXQuXG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgdmFyIGFzVWludCA9IHggPj4+IDA7XG5cbiAgaWYgKGFzVWludCA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDtcbn1cblxuLy8gSWYgdGhvc2UgdmFsdWVzIGFyZSBjaGFuZ2VkIHRoYXQgcGFja2FnZSBzaG91bGQgYmUgcmVidWlsdCBhbmQgcmVkZXBsb3llZC5cblxudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgPVxuLyogICAgKi9cbjI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZSA9XG4vKiAgICAgICAgICAgICAqL1xuNDtcbnZhciBEZWZhdWx0SHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICovXG44O1xudmFyIERlZmF1bHRMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBUcmFuc2l0aW9uTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MjQwO1xudmFyIFRyYW5zaXRpb25MYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBUcmFuc2l0aW9uTGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFRyYW5zaXRpb25MYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNTY7XG52YXIgVHJhbnNpdGlvbkxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBUcmFuc2l0aW9uTGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBUcmFuc2l0aW9uTGFuZTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBUcmFuc2l0aW9uTGFuZTcgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBUcmFuc2l0aW9uTGFuZTggPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBUcmFuc2l0aW9uTGFuZTkgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxMCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFRyYW5zaXRpb25MYW5lMTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBUcmFuc2l0aW9uTGFuZTEyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMxMDcyO1xudmFyIFRyYW5zaXRpb25MYW5lMTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yNjIxNDQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUyNDI4ODtcbnZhciBUcmFuc2l0aW9uTGFuZTE1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjtcbnZhciBUcmFuc2l0aW9uTGFuZTE2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzAwMjM0MjQ7XG52YXIgUmV0cnlMYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUmV0cnlMYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7XG52YXIgUmV0cnlMYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIFJldHJ5TGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4zMzU1NDQzMjtcbnZhciBSZXRyeUxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjcxMDg4NjQ7XG52YXIgU29tZVJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG52YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NTtcbnZhciBJZGxlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTY7XG52YXIgSWRsZUxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTM2ODcwOTEyO1xudmFyIE9mZnNjcmVlbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEwNzM3NDE4MjQ7IC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGV4cGVyaW1lbnRhbCB0aW1lbGluZSAocmVhY3QtZGV2dG9vbHMtdGltZWxpbmUpXG4vLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS5cblxuZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHtcbiAge1xuICAgIGlmIChsYW5lICYgU3luY0xhbmUpIHtcbiAgICAgIHJldHVybiAnU3luYyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91c0h5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0SHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRMYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbkh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBSZXRyeUxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1JldHJ5JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnU2VsZWN0aXZlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG4gICAgfVxuICB9XG59XG52YXIgTm9UaW1lc3RhbXAgPSAtMTtcbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG52YXIgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHN3aXRjaCAoZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgICAgcmV0dXJuIFN5bmNMYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRMYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBsYW5lcyAmIFRyYW5zaXRpb25MYW5lcztcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElkbGVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIHJldHVybiBJZGxlTGFuZTtcblxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUsIGJ1dCBhcyBhIGZhbGxiYWNrLCByZXR1cm4gdGhlIGVudGlyZSBiaXRtYXNrLlxuXG5cbiAgICAgIHJldHVybiBsYW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMpIHtcbiAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKHBlbmRpbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIHJldHVybiBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIERvIG5vdCB3b3JrIG9uIGFueSBpZGxlIHdvcmsgdW50aWwgYWxsIHRoZSBub24taWRsZSB3b3JrIGhhcyBmaW5pc2hlZCxcbiAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG5cbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbm9uSWRsZVVuYmxvY2tlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVVbmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub25JZGxlUGluZ2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgcGluZ2VkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlUGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICB2YXIgdW5ibG9ja2VkTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAodW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBpbiB0aGlzIHBhdGggaWYgYSBmYWxsYmFjayB0aW1lciBpcyBub3Qgc2NoZWR1bGVkLlxuICAgIHJldHVybiBOb0xhbmVzO1xuICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0XG4gIC8vIGl0IGFuZCB3ZSdsbCBsb3NlIG91ciBwcm9ncmVzcy4gV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiB0aGUgbmV3IGxhbmVzIGFyZVxuICAvLyBoaWdoZXIgcHJpb3JpdHkuXG5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbmV4dExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7XG4gICAgdmFyIHdpcExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHdpcExhbmVzKTtcblxuICAgIGlmICggLy8gVGVzdHMgd2hldGhlciB0aGUgbmV4dCBsYW5lIGlzIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHdpcFxuICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICAgIG5leHRMYW5lID49IHdpcExhbmUgfHwgLy8gRGVmYXVsdCBwcmlvcml0eSB1cGRhdGVzIHNob3VsZCBub3QgaW50ZXJydXB0IHRyYW5zaXRpb24gdXBkYXRlcy4gVGhlXG4gICAgLy8gb25seSBkaWZmZXJlbmNlIGJldHdlZW4gZGVmYXVsdCB1cGRhdGVzIGFuZCB0cmFuc2l0aW9uIHVwZGF0ZXMgaXMgdGhhdFxuICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLlxuICAgIG5leHRMYW5lID09PSBEZWZhdWx0TGFuZSAmJiAod2lwTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgIC8vIEtlZXAgd29ya2luZyBvbiB0aGUgZXhpc3RpbmcgaW4tcHJvZ3Jlc3MgdHJlZS4gRG8gbm90IGludGVycnVwdC5cbiAgICAgIHJldHVybiB3aXBMYW5lcztcbiAgICB9XG4gIH1cblxuICBpZiAoKG5leHRMYW5lcyAmIElucHV0Q29udGludW91c0xhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlc1xuICAgIC8vIGFuZCBkZWZhdWx0IHVwZGF0ZXMsIHNvIHRoZXkgcmVuZGVyIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSByZWFzb25cbiAgICAvLyB0aGV5IHVzZSBzZXBhcmF0ZSBsYW5lcyBpcyBiZWNhdXNlIGNvbnRpbnVvdXMgdXBkYXRlcyBzaG91bGQgaW50ZXJydXB0XG4gICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC5cbiAgICBuZXh0TGFuZXMgfD0gcGVuZGluZ0xhbmVzICYgRGVmYXVsdExhbmU7XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy4gVGhlIGNvdW50ZXItYXJndW1lbnQgaXMgdGhhdCB0aGUgcGFydGlhbCB3b3JrXG4gIC8vIHJlcHJlc2VudHMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdG8gdGhlIHVzZXIuXG4gIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mXG4gIC8vIHRpbWUgaXQgdGFrZXMgdG8gc2hvdyB0aGUgZmluYWwgc3RhdGUsIHdoaWNoIGlzIHdoYXQgdGhleSBhcmUgYWN0dWFsbHlcbiAgLy8gd2FpdGluZyBmb3IuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIHN3aXRjaCAobGFuZSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIC8vIFVzZXIgaW50ZXJhY3Rpb25zIHNob3VsZCBleHBpcmUgc2xpZ2h0bHkgbW9yZSBxdWlja2x5LlxuICAgICAgLy9cbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGFzIGluIFNjaGVkdWxlci5qcy5cbiAgICAgIC8vIFdoZW4gd2UgbWFkZSBpdCBsYXJnZXIsIGEgcHJvZHVjdCBtZXRyaWMgaW4gd3d3IHJlZ3Jlc3NlZCwgc3VnZ2VzdGluZ1xuICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2ZcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZXMuIElmIHRoYXQgdGhlb3J5IGlzIGNvcnJlY3QsIHRoZSBwcm9wZXIgc29sdXRpb24gaXNcbiAgICAgIC8vIHRvIGZpeCB0aGUgc3RhcnZhdGlvbi4gSG93ZXZlciwgdGhpcyBzY2VuYXJpbyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0XG4gICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvblxuICAgICAgLy8gZG9lcyBoYXBwZW4uXG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIC8vIFRPRE86IFJldHJpZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwaXJlIGlmIHRoZXkgYXJlIENQVSBib3VuZCBmb3JcbiAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlclxuICAgICAgLy8gY3Jhc2hlcy4gVGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHVuZGVybHlpbmcgYnVnOyBub3Qgc3VwZXIgdXJnZW50IGJ1dFxuICAgICAgLy8gaWRlYWxseSBzaG91bGQgZmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlXG4gICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICAvLyBBbnl0aGluZyBpZGxlIHByaW9yaXR5IG9yIGxvd2VyIHNob3VsZCBuZXZlciBleHBpcmUuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuLy8gYXJlIHN1c3BlbmRlZC5cblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpIHtcbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3QucGVuZGluZ0xhbmVzKTtcbn1cbmZ1bmN0aW9uIGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpIHtcbiAgdmFyIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gPSByb290LnBlbmRpbmdMYW5lcyAmIH5PZmZzY3JlZW5MYW5lO1xuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47XG4gIH1cblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcbiAgfVxuXG4gIHJldHVybiBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNTeW5jTGFuZShsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKGxhbmVzKSB7XG4gIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgVXJnZW50TGFuZXMpID09PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFRyYW5zaXRpb25MYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHtcblxuICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNEZWZhdWx0TGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykge1xuICAvLyBUaGlzIGlzIGEgc2VwYXJhdGUgY2hlY2sgZnJvbSBpbmNsdWRlc0Jsb2NraW5nTGFuZSBiZWNhdXNlIGEgbGFuZSBjYW5cbiAgLy8gZXhwaXJlIGFmdGVyIGEgcmVuZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb25MYW5lKGxhbmUpIHtcbiAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBtZWFucyBldmVyeSB0cmFuc2l0aW9uIGdldHMgaXRzIG93biBsYW5lLCB1bnRpbCB3ZVxuICAvLyBydW4gb3V0IG9mIGxhbmVzIGFuZCBjeWNsZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuXG4gIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lO1xuICBuZXh0VHJhbnNpdGlvbkxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0VHJhbnNpdGlvbkxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTtcbiAgbmV4dFJldHJ5TGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRSZXRyeUxhbmUgJiBSZXRyeUxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSB7XG4gIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbn1cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikge1xuICByZXR1cm4gYSAmIGI7XG59IC8vIFNlZW1zIHJlZHVuZGFudCwgYnV0IGl0IGNoYW5nZXMgdGhlIHR5cGUgZnJvbSBhIHNpbmdsZSBsYW5lICh1c2VkIGZvclxuLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuXG5cbmZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikge1xuICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdCByYW5nZXMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gIHJldHVybiBhICE9PSBOb0xhbmUgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxhbmVNYXAoaW5pdGlhbCkge1xuICAvLyBJbnRlbnRpb25hbGx5IHB1c2hpbmcgb25lIGJ5IG9uZS5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlc1xuICB2YXIgbGFuZU1hcCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVG90YWxMYW5lczsgaSsrKSB7XG4gICAgbGFuZU1hcC5wdXNoKGluaXRpYWwpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmVNYXA7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgdXBkYXRlTGFuZSwgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZVxuICAvLyBjb3VsZCB1bmJsb2NrIHRoZW0uIENsZWFyIHRoZSBzdXNwZW5kZWQgbGFuZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IHJlbmRlcmluZ1xuICAvLyB0aGVtIGFnYWluLlxuICAvL1xuICAvLyBUT0RPOiBXZSByZWFsbHkgb25seSBuZWVkIHRvIHVuc3VzcGVuZCBvbmx5IGxhbmVzIHRoYXQgYXJlIGluIHRoZVxuICAvLyBgc3VidHJlZUxhbmVzYCBvZiB0aGUgdXBkYXRlZCBmaWJlciwgb3IgdGhlIHVwZGF0ZSBsYW5lcyBvZiB0aGUgcmV0dXJuXG4gIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLFxuICAvLyBzaW5jZSB0aGVyZSdzIG5vIHdheSBmb3IgdGhpcyB1cGRhdGUgdG8gdW5ibG9jayBpdC5cbiAgLy9cbiAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2Vzc1xuICAvLyBpZGxlIHVwZGF0ZXMgdW50aWwgYWZ0ZXIgYWxsIHRoZSByZWd1bGFyIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZDsgdGhlcmUncyBub1xuICAvLyB3YXkgaXQgY291bGQgdW5ibG9jayBhIHRyYW5zaXRpb24uXG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IElkbGVMYW5lKSB7XG4gICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcykge1xuICB2YXIgbm9Mb25nZXJQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcyAmIH5yZW1haW5pbmdMYW5lcztcbiAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW5cblxuICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QuZXhwaXJlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBDbGVhciB0aGUgbGFuZXMgdGhhdCBubyBsb25nZXIgaGF2ZSBwZW5kaW5nIHdvcmtcblxuICB2YXIgbGFuZXMgPSBub0xvbmdlclBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdID0gTm9MYW5lcztcbiAgICBldmVudFRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgLy8gSW4gYWRkaXRpb24gdG8gZW50YW5nbGluZyBlYWNoIG9mIHRoZSBnaXZlbiBsYW5lcyB3aXRoIGVhY2ggb3RoZXIsIHdlIGFsc29cbiAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFueSogb2YgdGhlIGdpdmVuIGxhbmVzLCB0aGF0IGxhbmUgaXMgbm93IHRyYW5zaXRpdmVseVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYWxsKiB0aGUgZ2l2ZW4gbGFuZXMuXG4gIC8vXG4gIC8vIFRyYW5zbGF0ZWQ6IElmIEMgaXMgZW50YW5nbGVkIHdpdGggQSwgdGhlbiBlbnRhbmdsaW5nIEEgd2l0aCBCIGFsc29cbiAgLy8gZW50YW5nbGVzIEMgd2l0aCBCLlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGhhcmQgdG8gZ3Jhc3AsIGl0IG1pZ2h0IGhlbHAgdG8gaW50ZW50aW9uYWxseSBicmVhayB0aGlzXG4gIC8vIGZ1bmN0aW9uIGFuZCBsb29rIGF0IHRoZSB0ZXN0cyB0aGF0IGZhaWwgaW4gUmVhY3RUcmFuc2l0aW9uLXRlc3QuanMuIFRyeVxuICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuXG4gIHZhciByb290RW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcykge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcblxuICAgIGlmICggLy8gSXMgdGhpcyBvbmUgb2YgdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gJiBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgZW50YW5nbGVtZW50c1tpbmRleF0gfD0gZW50YW5nbGVkTGFuZXM7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHJlbmRlckxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHJlbmRlckxhbmVzKTtcbiAgdmFyIGxhbmU7XG5cbiAgc3dpdGNoIChyZW5kZXJMYW5lKSB7XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgbGFuZSA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgbGFuZSA9IFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGFscmVhZHkgZWl0aGVyIGEgaHlkcmF0aW9uIGxhbmUsIG9yIHNob3VsZG4ndFxuICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLlxuICAgICAgbGFuZSA9IE5vTGFuZTtcbiAgICAgIGJyZWFrO1xuICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2VcbiAgLy8gYWxyZWFkeSBhdHRlbXB0ZWQgYW5kIGZhaWxlZCB0byBoeWRyYXRlIGF0IHRoYXQgbGV2ZWwuIEFsc28gY2hlY2sgaWYgd2UncmVcbiAgLy8gYWxyZWFkeSByZW5kZXJpbmcgdGhhdCBsYW5lLCB3aGljaCBpcyByYXJlIGJ1dCBjb3VsZCBoYXBwZW4uXG5cblxuICBpZiAoKGxhbmUgJiAocm9vdC5zdXNwZW5kZWRMYW5lcyB8IHJlbmRlckxhbmVzKSkgIT09IE5vTGFuZSkge1xuICAgIC8vIEdpdmUgdXAgdHJ5aW5nIHRvIGh5ZHJhdGUgYW5kIGZhbGwgYmFjayB0byBjbGllbnQgcmVuZGVyLlxuICAgIHJldHVybiBOb0xhbmU7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG4gICAgdXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcblxuICAgIGlmICh1cGRhdGVycy5zaXplID4gMCkge1xuICAgICAgdXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5hZGQoZmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25zRm9yTGFuZXMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTtcbnZhciBDb250aW51b3VzRXZlbnRQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmU7XG52YXIgRGVmYXVsdEV2ZW50UHJpb3JpdHkgPSBEZWZhdWx0TGFuZTtcbnZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lO1xudmFyIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IE5vTGFuZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShuZXdQcmlvcml0eSkge1xuICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmV2aW91c1ByaW9yaXR5O1xuICB9XG59XG5mdW5jdGlvbiBoaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGxvd2VyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhID09PSAwIHx8IGEgPiBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBpc0hpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYjtcbn1cbmZ1bmN0aW9uIGxhbmVzVG9FdmVudFByaW9yaXR5KGxhbmVzKSB7XG4gIHZhciBsYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcbn1cblxuLy8gVGhpcyBpcyBpbXBvcnRlZCBieSB0aGUgZXZlbnQgcmVwbGF5aW5nIGltcGxlbWVudGF0aW9uIGluIFJlYWN0IERPTS4gSXQnc1xuLy8gaW4gYSBzZXBhcmF0ZSBmaWxlIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSByZW5kZXJlciBhbmRcbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gaXNSb290RGVoeWRyYXRlZChyb290KSB7XG4gIHZhciBjdXJyZW50U3RhdGUgPSByb290LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG59XG5cbnZhciBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uO1xuXG5mdW5jdGlvbiBzZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZm4pIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiA9IGZuO1xufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDE7XG5mdW5jdGlvbiBzZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZm4pIHtcbiAgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEgPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5ID0gZm47XG59IC8vIFRPRE86IFVwZ3JhZGUgdGhpcyBkZWZpbml0aW9uIG9uY2Ugd2UncmUgb24gYSBuZXdlciB2ZXJzaW9uIG9mIEZsb3cgdGhhdFxuLy8gaGFzIHRoaXMgZGVmaW5pdGlvbiBidWlsdC1pbi5cblxudmFyIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gVGhlIHF1ZXVlIG9mIGRpc2NyZXRlIGV2ZW50cyB0byBiZSByZXBsYXllZC5cblxudmFyIHF1ZXVlZERpc2NyZXRlRXZlbnRzID0gW107IC8vIEluZGljYXRlcyBpZiBhbnkgY29udGludW91cyBldmVudCB0YXJnZXRzIGFyZSBub24tbnVsbCBmb3IgZWFybHkgYmFpbG91dC5cbi8vIGlmIHRoZSBsYXN0IHRhcmdldCB3YXMgZGVoeWRyYXRlZC5cblxudmFyIHF1ZXVlZEZvY3VzID0gbnVsbDtcbnZhciBxdWV1ZWREcmFnID0gbnVsbDtcbnZhciBxdWV1ZWRNb3VzZSA9IG51bGw7IC8vIEZvciBwb2ludGVyIGV2ZW50cyB0aGVyZSBjYW4gYmUgb25lIGxhdGVzdCBldmVudCBwZXIgcG9pbnRlcklkLlxuXG52YXIgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCk7XG52YXIgcXVldWVkUG9pbnRlckNhcHR1cmVzID0gbmV3IE1hcCgpOyAvLyBXZSBjb3VsZCBjb25zaWRlciByZXBsYXlpbmcgc2VsZWN0aW9uY2hhbmdlIGFuZCB0b3VjaG1vdmVzIHRvby5cblxudmFyIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cyA9IFtdO1xudmFyIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9IFsnbW91c2Vkb3duJywgJ21vdXNldXAnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hzdGFydCcsICdhdXhjbGljaycsICdkYmxjbGljaycsICdwb2ludGVyY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICdkcmFnZW5kJywgJ2RyYWdzdGFydCcsICdkcm9wJywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9uc3RhcnQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdpbnB1dCcsICd0ZXh0SW5wdXQnLCAvLyBJbnRlbnRpb25hbGx5IGNhbWVsQ2FzZVxuJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2NsaWNrJywgJ2NoYW5nZScsICdjb250ZXh0bWVudScsICdyZXNldCcsICdzdWJtaXQnXTtcbmZ1bmN0aW9uIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihldmVudFR5cGUpIHtcbiAgcmV0dXJuIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cy5pbmRleE9mKGV2ZW50VHlwZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgZG9tRXZlbnROYW1lOiBkb21FdmVudE5hbWUsXG4gICAgZXZlbnRTeXN0ZW1GbGFnczogZXZlbnRTeXN0ZW1GbGFncyxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0Q29udGFpbmVyczogW3RhcmdldENvbnRhaW5lcl1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuZGVsZXRlKHBvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZGVsZXRlKF9wb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KGV4aXN0aW5nUXVldWVkRXZlbnQsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChleGlzdGluZ1F1ZXVlZEV2ZW50ID09PSBudWxsIHx8IGV4aXN0aW5nUXVldWVkRXZlbnQubmF0aXZlRXZlbnQgIT09IG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIHF1ZXVlZEV2ZW50ID0gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBfZmliZXIyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHRhcmdldC5cbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlZEV2ZW50O1xuICB9IC8vIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgdGhpcyBleGFjdCBldmVudCwgdGhlbiBpdCdzIGJlY2F1c2VcbiAgLy8gdGhlIGRpZmZlcmVudCBldmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IERPTSBldmVudCBsaXN0ZW5lcnMuXG4gIC8vIFdlIGNhbiBhY2N1bXVsYXRlIHRoZSBmbGFncywgYW5kIHRoZSB0YXJnZXRDb250YWluZXJzLCBhbmRcbiAgLy8gc3RvcmUgYSBzaW5nbGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQuXG5cblxuICBleGlzdGluZ1F1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MgfD0gZXZlbnRTeXN0ZW1GbGFncztcbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBleGlzdGluZ1F1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gbnVsbCAmJiB0YXJnZXRDb250YWluZXJzLmluZGV4T2YodGFyZ2V0Q29udGFpbmVyKSA9PT0gLTEpIHtcbiAgICB0YXJnZXRDb250YWluZXJzLnB1c2godGFyZ2V0Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1F1ZXVlZEV2ZW50O1xufVxuXG5mdW5jdGlvbiBxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRoZXNlIHNldCByZWxhdGVkVGFyZ2V0IHRvIG51bGwgYmVjYXVzZSB0aGUgcmVwbGF5ZWQgZXZlbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHdlXG4gIC8vIG1vdmVkIGZyb20gb3V0c2lkZSB0aGUgd2luZG93IChubyB0YXJnZXQpIG9udG8gdGhlIHRhcmdldCBvbmNlIGl0IGh5ZHJhdGVzLlxuICAvLyBJbnN0ZWFkIG9mIG11dGF0aW5nIHdlIGNvdWxkIGNsb25lIHRoZSBldmVudC5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZvY3VzRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRm9jdXMgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZEZvY3VzLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBmb2N1c0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgZHJhZ0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZERyYWcgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZERyYWcsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZE1vdXNlLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBtb3VzZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IHBvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChwb2ludGVySWQsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlcnMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgX3BvaW50ZXJJZDIgPSBfcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLnNldChfcG9pbnRlcklkMiwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KF9wb2ludGVySWQyKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBfcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBDaGVjayBpZiB0aGlzIHRhcmdldCBpcyB1bmJsb2NrZWQuIFJldHVybnMgdHJ1ZSBpZiBpdCdzIHVuYmxvY2tlZC5cblxuZnVuY3Rpb24gYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNoYXJlcyBhIGxvdCBvZiBsb2dpYyB3aXRoIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQuXG4gIC8vIFRyeSB0byB1bmlmeSB0aGVtLiBJdCdzIGEgYml0IHRyaWNreSBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIHR3byByZXR1cm5cbiAgLy8gdmFsdWVzLlxuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHF1ZXVlZFRhcmdldC50YXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmxvY2tlZCBvbiBoeWRyYXRpbmcgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICAvLyBJbmNyZWFzZSBpdHMgcHJpb3JpdHkuXG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGluc3RhbmNlO1xuICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHF1ZXVlZFRhcmdldC5wcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpOyAvLyBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHdheSB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2ZcbiAgICAgICAgICAvLyBhIHJvb3Qgb3RoZXIgdGhhbiBzeW5jLlxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgd2lsbCByZWFkIHRoZSBwcmlvcml0eSBpZiBpdCdzIGRpc3BhdGNoZWQgYnkgdGhlIFJlYWN0XG4gIC8vIGV2ZW50IHN5c3RlbSBidXQgbm90IG5hdGl2ZSBldmVudHMuIFNob3VsZCByZWFkIHdpbmRvdy5ldmVudC50eXBlLCBsaWtlXG4gIC8vIHdlIGRvIGZvciB1cGRhdGVzIChnZXRDdXJyZW50RXZlbnRQcmlvcml0eSkuXG4gIHZhciB1cGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxKCk7XG4gIHZhciBxdWV1ZWRUYXJnZXQgPSB7XG4gICAgYmxvY2tlZE9uOiBudWxsLFxuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eVxuICB9O1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBTdG9wIG9uY2Ugd2UgaGl0IHRoZSBmaXJzdCB0YXJnZXQgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuXG4gICAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkodXBkYXRlUHJpb3JpdHksIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zcGxpY2UoaSwgMCwgcXVldWVkVGFyZ2V0KTtcblxuICBpZiAoaSA9PT0gMCkge1xuICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gcXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICB3aGlsZSAodGFyZ2V0Q29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcnNbMF07XG4gICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KHF1ZXVlZEV2ZW50LmRvbUV2ZW50TmFtZSwgcXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnQgPSBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50Q2xvbmUgPSBuZXcgbmF0aXZlRXZlbnQuY29uc3RydWN0b3IobmF0aXZlRXZlbnQudHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgICAgICBzZXRSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgbmF0aXZlRXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIHJlc2V0UmVwbGF5aW5nRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC4gVHJ5IGFnYWluIGxhdGVyLlxuICAgICAgdmFyIF9maWJlcjMgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHRCbG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMyAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIzKTtcbiAgICAgIH1cblxuICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgdGFyZ2V0Q29udGFpbmVycy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgaWYgKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpKSB7XG4gICAgbWFwLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxheVVuYmxvY2tlZEV2ZW50cygpIHtcbiAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlO1xuXG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRm9jdXMpKSB7XG4gICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWREcmFnKSkge1xuICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpKSB7XG4gICAgcXVldWVkTW91c2UgPSBudWxsO1xuICB9XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuXG4gICAgaWYgKCFoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0KSB7XG4gICAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gdHJ1ZTsgLy8gU2NoZWR1bGUgYSBjYWxsYmFjayB0byBhdHRlbXB0IHJlcGxheWluZyBhcyBtYW55IGV2ZW50cyBhcyBhcmVcbiAgICAgIC8vIG5vdyB1bmJsb2NrZWQuIFRoaXMgZmlyc3QgbWlnaHQgbm90IGFjdHVhbGx5IGJlIHVuYmxvY2tlZCB5ZXQuXG4gICAgICAvLyBXZSBjb3VsZCBjaGVjayBpdCBlYXJseSB0byBhdm9pZCBzY2hlZHVsaW5nIGFuIHVubmVjZXNzYXJ5IGNhbGxiYWNrLlxuXG4gICAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksIHJlcGxheVVuYmxvY2tlZEV2ZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7XG4gIC8vIE1hcmsgYW55dGhpbmcgdGhhdCB3YXMgYmxvY2tlZCBvbiB0aGlzIGFzIG5vIGxvbmdlciBibG9ja2VkXG4gIC8vIGFuZCBlbGlnaWJsZSBmb3IgYSByZXBsYXkuXG4gIGlmIChxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdLCB1bmJsb2NrZWQpOyAvLyBUaGlzIGlzIGEgZXhwb25lbnRpYWwgc2VhcmNoIGZvciBlYWNoIGJvdW5kYXJ5IHRoYXQgY29tbWl0cy4gSSB0aGluayBpdCdzXG4gICAgLy8gd29ydGggaXQgYmVjYXVzZSB3ZSBleHBlY3QgdmVyeSBmZXcgZGlzY3JldGUgZXZlbnRzIHRvIHF1ZXVlIHVwIGFuZCBvbmNlXG4gICAgLy8gd2UgYXJlIGFjdHVhbGx5IGZ1bGx5IHVuYmxvY2tlZCBpdCB3aWxsIGJlIGZhc3QgdG8gcmVwbGF5IHRoZW0uXG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWVkRXZlbnQgPSBxdWV1ZWREaXNjcmV0ZUV2ZW50c1tpXTtcblxuICAgICAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEZvY3VzLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRHJhZywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRNb3VzZSwgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIHZhciB1bmJsb2NrID0gZnVuY3Rpb24gKHF1ZXVlZEV2ZW50KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgfTtcblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaCh1bmJsb2NrKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBxdWV1ZWRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbX2ldO1xuXG4gICAgaWYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG5leHRFeHBsaWNpdFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1swXTtcblxuICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLlxuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChuZXh0RXhwbGljaXRUYXJnZXQpO1xuXG4gICAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBXZSdyZSB1bmJsb2NrZWQuXG4gICAgICAgIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcldyYXBwZXIuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICghX2VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSBuZWVkIHRvIGNsZWFyIG9ubHkgaWYgd2UgZGlkbid0IHF1ZXVlIGJlY2F1c2VcbiAgLy8gcXVldWVpbmcgaXMgYWNjdW11bGF0aXZlLlxuXG5cbiAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UgJiYgaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGRvbUV2ZW50TmFtZSkpIHtcbiAgICB3aGlsZSAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gYmxvY2tlZE9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgIH1cblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbnZhciByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7IC8vIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG4vLyBUaGUgcmV0dXJuX3RhcmdldEluc3QgZmllbGQgYWJvdmUgaXMgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZS5cblxuZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVE9ETzogV2FybiBpZiBfZW5hYmxlZCBpcyBmYWxzZS5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0cmVlIGhhcyBiZWVuIHVubW91bnRlZCBhbHJlYWR5LiBEaXNwYXRjaCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSBldmVudCB0byBiZSByZXBsYXllZCBsYXRlci4gQWJvcnQgZGlzcGF0Y2hpbmcgc2luY2Ugd2VcbiAgICAgICAgICAvLyBkb24ndCB3YW50IHRoaXMgZXZlbnQgZGlzcGF0Y2hlZCB0d2ljZSB0aHJvdWdoIHRoZSBldmVudCBzeXN0ZW0uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlzY3JldGUgZXZlbnQgaW4gdGhlIHF1ZXVlLiBTY2hlZHVsZSBhbiBpbmNyZWFzZWRcbiAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzb21ldGhpbmcgd2VudCB3cm9uZyBidXQgdG8gYXZvaWQgYmxvY2tpbmdcbiAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbSwgZGlzcGF0Y2ggdGhlIGV2ZW50IHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICAgIC8vIFRPRE86IFdhcm4uXG5cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucyBkdXJpbmcgYSByZXBsYXkgc29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIGl0IG1pZ2h0IGJsb2NrXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbS5cbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgYW4gZXZlbnQgKGV4OiBpbWcgb25sb2FkKSBiZWZvcmUgY29tbWl0dGluZyB0aGF0XG4gICAgICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgICAgIC8vIGV2ZW50IG9uIGEgbm9uLVJlYWN0IHRyZWUpLiBXZSBtaWdodCBhbHNvIGNvbnNpZGVyIHF1ZXVlaW5nIGV2ZW50cyBhbmRcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgdGhlbSBhZnRlciB0aGUgbW91bnQuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFVzZWQgYnkgU2ltcGxlRXZlbnRQbHVnaW46XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICBjYXNlICdjbGljayc6XG4gICAgY2FzZSAnY2xvc2UnOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ2ludmFsaWQnOlxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgY2FzZSAncGF1c2UnOlxuICAgIGNhc2UgJ3BsYXknOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgIGNhc2UgJ3JhdGVjaGFuZ2UnOlxuICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICBjYXNlICdyZXNpemUnOlxuICAgIGNhc2UgJ3NlZWtlZCc6XG4gICAgY2FzZSAnc3VibWl0JzpcbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgIGNhc2UgJ3ZvbHVtZWNoYW5nZSc6IC8vIFVzZWQgYnkgcG9seWZpbGxzOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnY2hhbmdlJzpcbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzogLy8gT25seSBlbmFibGVDcmVhdGVFdmVudEhhbmRsZUFQSTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVpbnB1dCc6XG4gICAgY2FzZSAnYmx1cic6XG4gICAgY2FzZSAnZnVsbHNjcmVlbmNoYW5nZSc6XG4gICAgY2FzZSAnZm9jdXMnOlxuICAgIGNhc2UgJ2hhc2hjaGFuZ2UnOlxuICAgIGNhc2UgJ3BvcHN0YXRlJzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICBjYXNlICd0b2dnbGUnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAnd2hlZWwnOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnbW91c2VlbnRlcic6XG4gICAgY2FzZSAnbW91c2VsZWF2ZSc6XG4gICAgY2FzZSAncG9pbnRlcmVudGVyJzpcbiAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluIHRoZSBTY2hlZHVsZXIgY2FsbGJhY2suXG4gICAgICAgIC8vIEV2ZW50dWFsbHkgdGhpcyBtZWNoYW5pc20gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNoZWNrXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHByaW9yaXR5IG9uIHRoZSBuYXRpdmUgc2NoZWR1bGVyLlxuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gICAgICAgIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTG93U2NoZWR1bGVyUHJpb3JpdHksIHNvbWVob3cuIE1heWJlIHRoZSBzYW1lIGxhbmUgYXMgaHlkcmF0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NpZ24oU3ludGhldGljQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUgIT09ICd1bmtub3duJykge1xuICAgICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgXCJNZW1iZXIgbm90IGZvdW5kXCIuICBBXG4gICAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdFxuICAgICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKi9cbiAgICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7Ly8gTW9kZXJuIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gIH0pO1xuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHZpZXc6IDAsXG4gIGRldGFpbDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVUlFdmVudEludGVyZmFjZSk7XG52YXIgbGFzdE1vdmVtZW50WDtcbnZhciBsYXN0TW92ZW1lbnRZO1xudmFyIGxhc3RNb3VzZUV2ZW50O1xuXG5mdW5jdGlvbiB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCkge1xuICBpZiAoZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGxhc3RNb3VzZUV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gZXZlbnQuc2NyZWVuWCAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblg7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gZXZlbnQuc2NyZWVuWSAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSAwO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IDA7XG4gICAgfVxuXG4gICAgbGFzdE1vdXNlRXZlbnQgPSBldmVudDtcbiAgfVxufVxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgc2NyZWVuWDogMCxcbiAgc2NyZWVuWTogMCxcbiAgY2xpZW50WDogMCxcbiAgY2xpZW50WTogMCxcbiAgcGFnZVg6IDAsXG4gIHBhZ2VZOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIGJ1dHRvbjogMCxcbiAgYnV0dG9uczogMCxcbiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC5zcmNFbGVtZW50ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KTtcbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WDtcbiAgfSxcbiAgbW92ZW1lbnRZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFk7XG4gICAgfSAvLyBEb24ndCBuZWVkIHRvIGNhbGwgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoKSBoZXJlXG4gICAgLy8gYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IHJ1biB3aGVuIG1vdmVtZW50WFxuICAgIC8vIHdhcyBjb3BpZWQuXG5cblxuICAgIHJldHVybiBsYXN0TW92ZW1lbnRZO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgcmVsYXRlZFRhcmdldDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRm9jdXNFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cblxudmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBhbmltYXRpb25OYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy9cbiAqL1xuXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xuLy8gSGFwcGVucyB0byBzaGFyZSB0aGUgc2FtZSBsaXN0IGZvciBub3cuXG5cbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDtcbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICBFc2M6ICdFc2NhcGUnLFxuICBTcGFjZWJhcjogJyAnLFxuICBMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgVXA6ICdBcnJvd1VwJyxcbiAgUmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgRG93bjogJ0Fycm93RG93bicsXG4gIERlbDogJ0RlbGV0ZScsXG4gIFdpbjogJ09TJyxcbiAgTWVudTogJ0NvbnRleHRNZW51JyxcbiAgQXBwczogJ0NvbnRleHRNZW51JyxcbiAgU2Nyb2xsOiAnU2Nyb2xsTG9jaycsXG4gIE1velByaW50YWJsZUtleTogJ1VuaWRlbnRpZmllZCdcbn07XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gICc4JzogJ0JhY2tzcGFjZScsXG4gICc5JzogJ1RhYicsXG4gICcxMic6ICdDbGVhcicsXG4gICcxMyc6ICdFbnRlcicsXG4gICcxNic6ICdTaGlmdCcsXG4gICcxNyc6ICdDb250cm9sJyxcbiAgJzE4JzogJ0FsdCcsXG4gICcxOSc6ICdQYXVzZScsXG4gICcyMCc6ICdDYXBzTG9jaycsXG4gICcyNyc6ICdFc2NhcGUnLFxuICAnMzInOiAnICcsXG4gICczMyc6ICdQYWdlVXAnLFxuICAnMzQnOiAnUGFnZURvd24nLFxuICAnMzUnOiAnRW5kJyxcbiAgJzM2JzogJ0hvbWUnLFxuICAnMzcnOiAnQXJyb3dMZWZ0JyxcbiAgJzM4JzogJ0Fycm93VXAnLFxuICAnMzknOiAnQXJyb3dSaWdodCcsXG4gICc0MCc6ICdBcnJvd0Rvd24nLFxuICAnNDUnOiAnSW5zZXJ0JyxcbiAgJzQ2JzogJ0RlbGV0ZScsXG4gICcxMTInOiAnRjEnLFxuICAnMTEzJzogJ0YyJyxcbiAgJzExNCc6ICdGMycsXG4gICcxMTUnOiAnRjQnLFxuICAnMTE2JzogJ0Y1JyxcbiAgJzExNyc6ICdGNicsXG4gICcxMTgnOiAnRjcnLFxuICAnMTE5JzogJ0Y4JyxcbiAgJzEyMCc6ICdGOScsXG4gICcxMjEnOiAnRjEwJyxcbiAgJzEyMic6ICdGMTEnLFxuICAnMTIzJzogJ0YxMicsXG4gICcxNDQnOiAnTnVtTG9jaycsXG4gICcxNDUnOiAnU2Nyb2xsTG9jaycsXG4gICcyMjQnOiAnTWV0YSdcbn07XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcblxuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfSAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG5cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgIHZhciBjaGFyQ29kZSA9IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpOyAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cblxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAvLyBXaGlsZSB1c2VyIGtleWJvYXJkIGxheW91dCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoXG4gICAgLy8gYGtleUNvZGVgIHZhbHVlLCBhbG1vc3QgYWxsIGZ1bmN0aW9uIGtleXMgaGF2ZSBhIHVuaXZlcnNhbCB2YWx1ZS5cbiAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07IC8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG5cbiAgdmFyIGtleVByb3AgPSBtb2RpZmllcktleVRvUHJvcFtrZXlBcmddO1xuICByZXR1cm4ga2V5UHJvcCA/ICEhbmF0aXZlRXZlbnRba2V5UHJvcF0gOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAga2V5OiBnZXRFdmVudEtleSxcbiAgY29kZTogMCxcbiAgbG9jYXRpb246IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIHJlcGVhdDogMCxcbiAgbG9jYWxlOiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIC8vIExlZ2FjeSBJbnRlcmZhY2VcbiAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5LlxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAgZGVwZW5kaW5nIG9uIHRoZVxuICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNLZXlib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cblxudmFyIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICB0b3VjaGVzOiAwLFxuICB0YXJnZXRUb3VjaGVzOiAwLFxuICBjaGFuZ2VkVG91Y2hlczogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxudmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb3VjaEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cblxudmFyIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgcHJvcGVydHlOYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgIWlzUmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhbiBvdmVyIGV2ZW50IHdpdGggYSB0YXJnZXQsIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBkaXNwYXRjaGVkXG4gICAgLy8gdGhlIGV2ZW50IGluIHRoZSBvdXQgZXZlbnQgb2YgdGhlIG90aGVyIHRhcmdldC4gSWYgdGhpcyBpcyByZXBsYXllZCxcbiAgICAvLyB0aGVuIGl0J3MgYmVjYXVzZSB3ZSBjb3VsZG4ndCBkaXNwYXRjaCBhZ2FpbnN0IHRoaXMgdGFyZ2V0IHByZXZpb3VzbHlcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IG5vdyBpbnN0ZWFkLlxuICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC5mcm9tRWxlbWVudDtcblxuICAgIGlmIChyZWxhdGVkKSB7XG4gICAgICAvLyBJZiB0aGUgcmVsYXRlZCBub2RlIGlzIG1hbmFnZWQgYnkgUmVhY3QsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBoYXZlXG4gICAgICAvLyBhbHJlYWR5IGRpc3BhdGNoZWQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGR1cmluZyBpdHMgbW91c2VvdXQuXG4gICAgICBpZiAoZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgfHwgaXNDb250YWluZXJNYXJrZWRBc1Jvb3QocmVsYXRlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNPdXRFdmVudCAmJiAhaXNPdmVyRXZlbnQpIHtcbiAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHdpbjsgLy8gVE9ETzogd2h5IGlzIHRoaXMgbnVsbGFibGUgaW4gdGhlIHR5cGVzIGJ1dCB3ZSByZWFkIGZyb20gaXQ/XG5cbiAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAoZG9jKSB7XG4gICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luID0gd2luZG93O1xuICAgIH1cbiAgfVxuXG4gIHZhciBmcm9tO1xuICB2YXIgdG87XG5cbiAgaWYgKGlzT3V0RXZlbnQpIHtcbiAgICB2YXIgX3JlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnRvRWxlbWVudDtcblxuICAgIGZyb20gPSB0YXJnZXRJbnN0O1xuICAgIHRvID0gX3JlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShfcmVsYXRlZCkgOiBudWxsO1xuXG4gICAgaWYgKHRvICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRvKTtcblxuICAgICAgaWYgKHRvICE9PSBuZWFyZXN0TW91bnRlZCB8fCB0by50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgdG8udGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgZnJvbSA9IG51bGw7XG4gICAgdG8gPSB0YXJnZXRJbnN0O1xuICB9XG5cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICB2YXIgbGVhdmVFdmVudFR5cGUgPSAnb25Nb3VzZUxlYXZlJztcbiAgdmFyIGVudGVyRXZlbnRUeXBlID0gJ29uTW91c2VFbnRlcic7XG4gIHZhciBldmVudFR5cGVQcmVmaXggPSAnbW91c2UnO1xuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3ZlcicpIHtcbiAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgbGVhdmVFdmVudFR5cGUgPSAnb25Qb2ludGVyTGVhdmUnO1xuICAgIGVudGVyRXZlbnRUeXBlID0gJ29uUG9pbnRlckVudGVyJztcbiAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gIH1cblxuICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKGZyb20pO1xuICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UodG8pO1xuICB2YXIgbGVhdmUgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGxlYXZlRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnbGVhdmUnLCBmcm9tLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgbGVhdmUucmVsYXRlZFRhcmdldCA9IHRvTm9kZTtcbiAgdmFyIGVudGVyID0gbnVsbDsgLy8gV2Ugc2hvdWxkIG9ubHkgcHJvY2VzcyB0aGlzIG5hdGl2ZUV2ZW50IGlmIHdlIGFyZSBwcm9jZXNzaW5nXG4gIC8vIHRoZSBmaXJzdCBhbmNlc3Rvci4gTmV4dCB0aW1lLCB3ZSB3aWxsIGlnbm9yZSB0aGUgZXZlbnQuXG5cbiAgdmFyIG5hdGl2ZVRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG5hdGl2ZVRhcmdldEluc3QgPT09IHRhcmdldEluc3QpIHtcbiAgICB2YXIgZW50ZXJFdmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoZW50ZXJFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdlbnRlcicsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyRXZlbnQudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyRXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGVudGVyID0gZW50ZXJFdmVudDtcbiAgfVxuXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmUsIGVudGVyLCBmcm9tLCB0byk7XG59XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVHJhY2sgdGhlIGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IHRhcmdldEluc3Q7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG5cbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAvL1xuICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG5cbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3BcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcbiAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lO1xuICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50TmFtZTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgdmVuZG9yUHJlZml4ZXMgPSB7XG4gIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25JdGVyYXRpb24nKSxcbiAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25TdGFydCcpLFxuICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKVxufTtcbi8qKlxuICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLlxuICovXG5cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbi8qKlxuICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uXG4gKi9cblxudmFyIHN0eWxlID0ge307XG4vKipcbiAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuXG4gKi9cblxuaWYgKGNhblVzZURPTSkge1xuICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlOyAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LFxuICAvLyB0aGUgdW4tcHJlZml4ZWQgXCJhbmltYXRpb25cIiBhbmQgXCJ0cmFuc2l0aW9uXCIgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGVcbiAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkXG4gIC8vIHRvIGNoZWNrIGlmIHRoZSB1bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzYWJsZSwgYW5kIGlmIG5vdCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAuXG5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjtcbiAgfSAvLyBTYW1lIGFzIGFib3ZlXG5cblxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuLyoqXG4gKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH0gZWxzZSBpZiAoIXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gZXZlbnROYW1lO1xuICB9XG5cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG5cbiAgZm9yICh2YXIgc3R5bGVQcm9wIGluIHByZWZpeE1hcCkge1xuICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudE5hbWU7XG59XG5cbnZhciBBTklNQVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpO1xudmFyIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJyk7XG52YXIgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0Jyk7XG52YXIgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpO1xuXG52YXIgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMgPSBuZXcgTWFwKCk7IC8vIE5PVEU6IENhcGl0YWxpemF0aW9uIGlzIGltcG9ydGFudCBpbiB0aGlzIGxpc3QhXG4vL1xuLy8gRS5nLiBpdCBuZWVkcyBcInBvaW50ZXJEb3duXCIsIG5vdCBcInBvaW50ZXJkb3duXCIuXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZGVyaXZlIGJvdGggUmVhY3QgbmFtZSAoXCJvblBvaW50ZXJEb3duXCIpXG4vLyBhbmQgRE9NIG5hbWUgKFwicG9pbnRlcmRvd25cIikgZnJvbSB0aGUgc2FtZSBsaXN0LlxuLy9cbi8vIEV4Y2VwdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGlzIGNvbnZlbnRpb24gYXJlIGxpc3RlZCBzZXBhcmF0ZWx5LlxuLy9cbi8vIHByZXR0aWVyLWlnbm9yZVxuXG52YXIgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMgPSBbJ2Fib3J0JywgJ2F1eENsaWNrJywgJ2NhbmNlbCcsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2Nsb3NlJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ2xvc3RQb2ludGVyQ2FwdHVyZScsICdtb3VzZURvd24nLCAnbW91c2VNb3ZlJywgJ21vdXNlT3V0JywgJ21vdXNlT3ZlcicsICdtb3VzZVVwJywgJ3Bhc3RlJywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwb2ludGVyQ2FuY2VsJywgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJPdXQnLCAncG9pbnRlck92ZXInLCAncG9pbnRlclVwJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZUNoYW5nZScsICdzY3JvbGwnLCAndG9nZ2xlJywgJ3RvdWNoTW92ZScsICd3YWl0aW5nJywgJ3doZWVsJ107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpIHtcbiAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW2RvbUV2ZW50TmFtZV0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50cygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXTtcbiAgICB2YXIgZG9tRXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudE5hbWVbMF0udG9VcHBlckNhc2UoKSArIGV2ZW50TmFtZS5zbGljZSgxKTtcbiAgICByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgJ29uJyArIGNhcGl0YWxpemVkRXZlbnQpO1xuICB9IC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgZXZlbnQgbmFtZXMgZG9uJ3QgbWF0Y2guXG5cblxuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9FTkQsICdvbkFuaW1hdGlvbkVuZCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9JVEVSQVRJT04sICdvbkFuaW1hdGlvbkl0ZXJhdGlvbicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9TVEFSVCwgJ29uQW5pbWF0aW9uU3RhcnQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZGJsY2xpY2snLCAnb25Eb3VibGVDbGljaycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c2luJywgJ29uRm9jdXMnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNvdXQnLCAnb25CbHVyJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9FTkQsICdvblRyYW5zaXRpb25FbmQnKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHJlYWN0TmFtZSA9IHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLmdldChkb21FdmVudE5hbWUpO1xuXG4gIGlmIChyZWFjdE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgdmFyIHJlYWN0RXZlbnRUeXBlID0gZG9tRXZlbnROYW1lO1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnZm9jdXMnO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnYmx1cic7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNldXAnOiAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEFOSU1BVElPTl9FTkQ6XG4gICAgY2FzZSBBTklNQVRJT05fSVRFUkFUSU9OOlxuICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVFJBTlNJVElPTl9FTkQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd3aGVlbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIHtcbiAgICAvLyBTb21lIGV2ZW50cyBkb24ndCBidWJibGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgLy8gSW4gdGhlIHBhc3QsIFJlYWN0IGhhcyBhbHdheXMgYnViYmxlZCB0aGVtLCBidXQgdGhpcyBjYW4gYmUgc3VycHJpc2luZy5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB0cnkgYWxpZ25pbmcgY2xvc2VyIHRvIHRoZSBicm93c2VyIGJlaGF2aW9yIGJ5IG5vdCBidWJibGluZ1xuICAgIC8vIHRoZW0gaW4gUmVhY3QgZWl0aGVyLiBXZSdsbCBzdGFydCBieSBub3QgYnViYmxpbmcgb25TY3JvbGwsIGFuZCB0aGVuIGV4cGFuZC5cbiAgICB2YXIgYWNjdW11bGF0ZVRhcmdldE9ubHkgPSAhaW5DYXB0dXJlUGhhc2UgJiYgLy8gVE9ETzogaWRlYWxseSwgd2UnZCBldmVudHVhbGx5IGFkZCBhbGwgZXZlbnRzIGZyb21cbiAgICAvLyBub25EZWxlZ2F0ZWRFdmVudHMgbGlzdCBpbiBET01QbHVnaW5FdmVudFN5c3RlbS5cbiAgICAvLyBUaGVuIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGxpc3QuXG4gICAgLy8gVGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSB0aGF0IGNhbiB3YWl0IHVudGlsIFJlYWN0IDE4LlxuICAgIGRvbUV2ZW50TmFtZSA9PT0gJ3Njcm9sbCc7XG5cbiAgICB2YXIgX2xpc3RlbmVycyA9IGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50LnR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSk7XG5cbiAgICBpZiAoX2xpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGNyZWF0ZSBldmVudCBsYXppbHkuXG4gICAgICB2YXIgX2V2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogX2V2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IF9saXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdG9wLWxldmVsIHNpZGUgZWZmZWN0LlxucmVnaXN0ZXJTaW1wbGVFdmVudHMoKTtcbnJlZ2lzdGVyRXZlbnRzJDIoKTtcbnJlZ2lzdGVyRXZlbnRzJDEoKTtcbnJlZ2lzdGVyRXZlbnRzJDMoKTtcbnJlZ2lzdGVyRXZlbnRzKCk7XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIC8vIFRPRE86IHdlIHNob3VsZCByZW1vdmUgdGhlIGNvbmNlcHQgb2YgYSBcIlNpbXBsZUV2ZW50UGx1Z2luXCIuXG4gIC8vIFRoaXMgaXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV2ZW50IHN5c3RlbS4gQWxsXG4gIC8vIHRoZSBvdGhlciBwbHVnaW5zIGFyZSBlc3NlbnRpYWxseSBwb2x5ZmlsbHMuIFNvIHRoZSBwbHVnaW5cbiAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGlubGluZWQgc29tZXdoZXJlIGFuZCBoYXZlIGl0cyBsb2dpY1xuICAvLyBiZSBjb3JlIHRoZSB0byBldmVudCBzeXN0ZW0uIFRoaXMgd291bGQgcG90ZW50aWFsbHkgYWxsb3dcbiAgLy8gdXMgdG8gc2hpcCBidWlsZHMgb2YgUmVhY3Qgd2l0aG91dCB0aGUgcG9seWZpbGxlZCBwbHVnaW5zIGJlbG93LlxuICBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICB2YXIgc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucyA9IChldmVudFN5c3RlbUZsYWdzICYgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMpID09PSAwOyAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZXNlIGV2ZW50cyB1bmxlc3Mgd2UgYXJlIGluIHRoZVxuICAvLyBldmVudCdzIG5hdGl2ZSBcImJ1YmJsZVwiIHBoYXNlLCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlXG4gIC8vIG5vdCBpbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCdzIGJlY2F1c2Ugd2UgZW11bGF0ZVxuICAvLyB0aGUgY2FwdHVyZSBwaGFzZSBoZXJlIHN0aWxsLiBUaGlzIGlzIGEgdHJhZGUtb2ZmLFxuICAvLyBiZWNhdXNlIGluIGFuIGlkZWFsIHdvcmxkIHdlIHdvdWxkIG5vdCBlbXVsYXRlIGFuZCB1c2VcbiAgLy8gdGhlIHBoYXNlcyBwcm9wZXJseSwgbGlrZSB3ZSBkbyB3aXRoIHRoZSBTaW1wbGVFdmVudFxuICAvLyBwbHVnaW4uIEhvd2V2ZXIsIHRoZSBwbHVnaW5zIGJlbG93IGVpdGhlciBleHBlY3RcbiAgLy8gZW11bGF0aW9uIChFbnRlckxlYXZlKSBvciB1c2Ugc3RhdGUgbG9jYWxpemVkIHRvIHRoYXRcbiAgLy8gcGx1Z2luIChCZWZvcmVJbnB1dCwgQ2hhbmdlLCBTZWxlY3QpLiBUaGUgc3RhdGUgaW5cbiAgLy8gdGhlc2UgbW9kdWxlcyBjb21wbGljYXRlcyB0aGluZ3MsIGFzIHlvdSdsbCBlc3NlbnRpYWxseVxuICAvLyBnZXQgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgcGhhc2UgZXZlbnQgbWlnaHQgY2hhbmdlXG4gIC8vIHN0YXRlLCBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGJ1YmJsZSBldmVudCB0byBjb21lIGluXG4gIC8vIGxhdGVyIGFuZCBub3QgdHJpZ2dlciBhbnl0aGluZyBhcyB0aGUgc3RhdGUgbm93XG4gIC8vIGludmFsaWRhdGVzIHRoZSBoZXVyaXN0aWNzIG9mIHRoZSBldmVudCBwbHVnaW4uIFdlXG4gIC8vIGNvdWxkIGFsdGVyIGFsbCB0aGVzZSBwbHVnaW5zIHRvIHdvcmsgaW4gc3VjaCB3YXlzLCBidXRcbiAgLy8gdGhhdCBtaWdodCBjYXVzZSBvdGhlciB1bmtub3duIHNpZGUtZWZmZWN0cyB0aGF0IHdlXG4gIC8vIGNhbid0IGZvcmVzZWUgcmlnaHQgbm93LlxuXG4gIGlmIChzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zKSB7XG4gICAgZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn0gLy8gTGlzdCBvZiBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGluZGl2aWR1YWxseSBhdHRhY2hlZCB0byBtZWRpYSBlbGVtZW50cy5cblxuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gWydhYm9ydCcsICdjYW5wbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2xvYWRlZGRhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwcm9ncmVzcycsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCB0YXJnZXQpIHtcbiAge1xuICAgIGlmIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgJiYgIWlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTmF0aXZlRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIgaW4gdGhlIGJ1YmJsZSBwaGFzZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gMDtcblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGV2ZW50U3lzdGVtRmxhZ3MgfD0gSVNfQ0FQVFVSRV9QSEFTRTtcbiAgfVxuXG4gIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbn0gLy8gVGhpcyBpcyBvbmx5IHVzZWQgYnkgY3JlYXRlRXZlbnRIYW5kbGUgd2hlbiB0aGVcbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgaWYgKCFyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkge1xuICAgICAgLy8gV2UgaGFuZGxlIHNlbGVjdGlvbmNoYW5nZSBzZXBhcmF0ZWx5IGJlY2F1c2UgaXRcbiAgICAgIC8vIGRvZXNuJ3QgYnViYmxlIGFuZCBuZWVkcyB0byBiZSBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoZG9tRXZlbnROYW1lICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xuICAgICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBmYWxzZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKG93bmVyRG9jdW1lbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQgYWxzbyBuZWVkcyBkZWR1cGxpY2F0aW9uXG4gICAgICAvLyBidXQgaXQgaXMgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKCFvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICAgICAgb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJywgZmFsc2UsIG93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgaXNEZWZlcnJlZExpc3RlbmVyRm9yTGVnYWN5RkJTdXBwb3J0KSB7XG4gIHZhciBsaXN0ZW5lciA9IGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKTsgLy8gSWYgcGFzc2l2ZSBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZVxuICAvLyBhY3RpdmUgYW5kIG5vdCBwYXNzaXZlLlxuXG4gIHZhciBpc1Bhc3NpdmVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBpZiAocGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQpIHtcbiAgICAvLyBCcm93c2VycyBpbnRyb2R1Y2VkIGFuIGludGVydmVudGlvbiwgbWFraW5nIHRoZXNlIGV2ZW50c1xuICAgIC8vIHBhc3NpdmUgYnkgZGVmYXVsdCBvbiBkb2N1bWVudC4gUmVhY3QgZG9lc24ndCBiaW5kIHRoZW1cbiAgICAvLyB0byBkb2N1bWVudCBhbnltb3JlLCBidXQgY2hhbmdpbmcgdGhpcyBub3cgd291bGQgdW5kb1xuICAgIC8vIHRoZSBwZXJmb3JtYW5jZSB3aW5zIGZyb20gdGhlIGNoYW5nZS4gU28gd2UgZW11bGF0ZVxuICAgIC8vIHRoZSBleGlzdGluZyBiZWhhdmlvciBtYW51YWxseSBvbiB0aGUgcm9vdHMgbm93LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTk2NTFcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAndG91Y2hzdGFydCcgfHwgZG9tRXZlbnROYW1lID09PSAndG91Y2htb3ZlJyB8fCBkb21FdmVudE5hbWUgPT09ICd3aGVlbCcpIHtcbiAgICAgIGlzUGFzc2l2ZUxpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0YXJnZXRDb250YWluZXIgPSAgdGFyZ2V0Q29udGFpbmVyO1xuICB2YXIgdW5zdWJzY3JpYmVMaXN0ZW5lcjsgLy8gV2hlbiBsZWdhY3lGQlN1cHBvcnQgaXMgZW5hYmxlZCwgaXQncyBmb3Igd2hlbiB3ZVxuXG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHJldHVybiBncmFuZENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyIHx8IGdyYW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgZ3JhbmRDb250YWluZXIucGFyZW50Tm9kZSA9PT0gdGFyZ2V0Q29udGFpbmVyO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBhbmNlc3Rvckluc3QgPSB0YXJnZXRJbnN0O1xuXG4gIGlmICgoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFKSA9PT0gMCAmJiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX05PTl9ERUxFR0FURUQpID09PSAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lck5vZGUgPSB0YXJnZXRDb250YWluZXI7IC8vIElmIHdlIGFyZSB1c2luZyB0aGUgbGVnYWN5IEZCIHN1cHBvcnQgZmxhZywgd2VcblxuICAgIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgYmVsb3cgbG9naWMgYXR0ZW1wdHMgdG8gd29yayBvdXQgaWYgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgIC8vIHRoZSB0YXJnZXQgZmliZXIgdG8gYSBkaWZmZXJlbnQgYW5jZXN0b3IuIFdlIGhhZCBzaW1pbGFyIGxvZ2ljXG4gICAgICAvLyBpbiB0aGUgbGVnYWN5IGV2ZW50IHN5c3RlbSwgZXhjZXB0IHRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICAvLyBzeXN0ZW1zIGlzIHRoYXQgdGhlIG1vZGVybiBldmVudCBzeXN0ZW0gbm93IGhhcyBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgLy8gYXR0YWNoZWQgdG8gZWFjaCBSZWFjdCBSb290IGFuZCBSZWFjdCBQb3J0YWwgUm9vdC4gVG9nZXRoZXIsXG4gICAgICAvLyB0aGUgRE9NIG5vZGVzIHJlcHJlc2VudGluZyB0aGVzZSByb290cyBhcmUgdGhlIFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gVG8gZmlndXJlIG91dCB3aGljaCBhbmNlc3RvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLCB3ZSB0cmF2ZXJzZVxuICAgICAgLy8gdXAgdGhlIGZpYmVyIHRyZWUgZnJvbSB0aGUgdGFyZ2V0IGluc3RhbmNlIGFuZCBhdHRlbXB0IHRvIGZpbmRcbiAgICAgIC8vIHJvb3QgYm91bmRhcmllcyB0aGF0IG1hdGNoIHRoYXQgb2Ygb3VyIGN1cnJlbnQgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoYXQgXCJyb290Q29udGFpbmVyXCIsIHdlIGZpbmQgdGhlIHBhcmVudCBmaWJlclxuICAgICAgLy8gc3ViLXRyZWUgZm9yIHRoYXQgcm9vdCBhbmQgbWFrZSB0aGF0IG91ciBhbmNlc3RvciBpbnN0YW5jZS5cbiAgICAgIHZhciBub2RlID0gdGFyZ2V0SW5zdDtcblxuICAgICAgbWFpbkxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5vZGVUYWcgPSBub2RlLnRhZztcblxuICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFJvb3QgfHwgbm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGEgcG9ydGFsLCBidXQgaXQncyBub3QgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBwb3J0YWxzIGhhbmRsZSB0aGVpciBvd24gZXZlbnRzIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBTbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdG9wIG5vdy4gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHBvcnRhbFxuICAgICAgICAgICAgLy8gd2FzIHBhcnQgb2YgKm91ciogcm9vdC5cbiAgICAgICAgICAgIHZhciBncmFuZE5vZGUgPSBub2RlLnJldHVybjtcblxuICAgICAgICAgICAgd2hpbGUgKGdyYW5kTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZ3JhbmRUYWcgPSBncmFuZE5vZGUudGFnO1xuXG4gICAgICAgICAgICAgIGlmIChncmFuZFRhZyA9PT0gSG9zdFJvb3QgfHwgZ3JhbmRUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhbmRDb250YWluZXIgPSBncmFuZE5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB3ZSBmb3VuZCBpdCBhc1xuICAgICAgICAgICAgICAgICAgLy8gYSBwYXJlbnQgb2YgdGhlIFBvcnRhbC4gVGhhdCBtZWFucyB3ZSBjYW4gaWdub3JlIGl0IGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBQb3J0YWwgd2lsbCBidWJibGUgdGhyb3VnaCB0byB1cy5cbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBncmFuZE5vZGUgPSBncmFuZE5vZGUucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gTm93IHdlIG5lZWQgdG8gZmluZCBpdCdzIGNvcnJlc3BvbmRpbmcgaG9zdCBmaWJlciBpbiB0aGUgb3RoZXJcbiAgICAgICAgICAvLyB0cmVlLiBUbyBkbyB0aGlzIHdlIGNhbiB1c2UgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsIGJ1dCB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmliZXIgaXMgYSBob3N0IGluc3RhbmNlLCBvdGhlcndpc2VcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHVwIHRocm91Z2ggdGhlIERPTSB0aWxsIHdlIGZpbmQgdGhlIGNvcnJlY3RcbiAgICAgICAgICAvLyBub2RlIHRoYXQgaXMgZnJvbSB0aGUgb3RoZXIgdHJlZS5cblxuXG4gICAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZztcblxuICAgICAgICAgICAgaWYgKHBhcmVudFRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBwYXJlbnRUYWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgICAgICAgIG5vZGUgPSBhbmNlc3Rvckluc3QgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICBjb250aW51ZSBtYWluTG9vcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHksIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSAhPT0gbnVsbCA/IHJlYWN0TmFtZSArICdDYXB0dXJlJyA6IG51bGw7XG4gIHZhciByZWFjdEV2ZW50TmFtZSA9IGluQ2FwdHVyZVBoYXNlID8gY2FwdHVyZU5hbWUgOiByZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7XG4gIHZhciBsYXN0SG9zdENvbXBvbmVudCA9IG51bGw7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMiA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMi50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBzdGF0ZU5vZGU7IC8vIGNyZWF0ZUV2ZW50SGFuZGxlIGxpc3RlbmVyc1xuXG5cbiAgICAgIGlmIChyZWFjdEV2ZW50TmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3RFdmVudE5hbWUpO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGxhc3RIb3N0Q29tcG9uZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIElmIHdlIGFyZSBvbmx5IGFjY3VtdWxhdGluZyBldmVudHMgZm9yIHRoZSB0YXJnZXQsIHRoZW4gd2UgZG9uJ3RcbiAgICAvLyBjb250aW51ZSB0byBwcm9wYWdhdGUgdGhyb3VnaCB0aGUgUmVhY3QgZmliZXIgdHJlZSB0byBmaW5kIG90aGVyXG4gICAgLy8gbGlzdGVuZXJzLlxuXG5cbiAgICBpZiAoYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIG9uQmVmb3JlQmx1ciBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIHRha2VcblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4vLyAtIENoYW5nZUV2ZW50UGx1Z2luXG4vLyAtIFNlbGVjdEV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoZXNlIHBsdWdpbnNcbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycyAodmlhIGVtdWxhdGlvbikuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArICdDYXB0dXJlJztcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UzID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UzLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcbiAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZU5hbWUpO1xuXG4gICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdE5hbWUpO1xuXG4gICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgaWYgKGluc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRvIHtcbiAgICBpbnN0ID0gaW5zdC5yZXR1cm47IC8vIFRPRE86IElmIHRoaXMgaXMgYSBIb3N0Um9vdCB3ZSBtaWdodCB3YW50IHRvIGJhaWwgb3V0LlxuICAgIC8vIFRoYXQgaXMgZGVwZW5kaW5nIG9uIGlmIHdlIHdhbnQgbmVzdGVkIHN1YnRyZWVzIChsYXllcnMpIHRvIGJ1YmJsZVxuICAgIC8vIGV2ZW50cyB0byB0aGVpciBwYXJlbnQuIFdlIGNvdWxkIGFsc28gZ28gdGhyb3VnaCBwYXJlbnROb2RlIG9uIHRoZVxuICAgIC8vIGhvc3Qgbm9kZSBidXQgdGhhdCB3b3VsZG4ndCB3b3JrIGZvciBSZWFjdCBOYXRpdmUgYW5kIGRvZXNuJ3QgbGV0IHVzXG4gICAgLy8gZG8gdGhlIHBvcnRhbCBmZWF0dXJlLlxuICB9IHdoaWxlIChpbnN0ICYmIGluc3QudGFnICE9PSBIb3N0Q29tcG9uZW50KTtcblxuICBpZiAoaW5zdCkge1xuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluXG4gKiBkaWZmZXJlbnQgdHJlZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgdmFyIG5vZGVBID0gaW5zdEE7XG4gIHZhciBub2RlQiA9IGluc3RCO1xuICB2YXIgZGVwdGhBID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQSA9IG5vZGVBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cblxuICB2YXIgZGVwdGhCID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQiA9IG5vZGVCOyB0ZW1wQjsgdGVtcEIgPSBnZXRQYXJlbnQodGVtcEIpKSB7XG4gICAgZGVwdGhCKys7XG4gIH0gLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgZGVwdGhBLS07XG4gIH0gLy8gSWYgQiBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gICAgZGVwdGhCLS07XG4gIH0gLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG5cblxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG5cbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAobm9kZUEgPT09IG5vZGVCIHx8IG5vZGVCICE9PSBudWxsICYmIG5vZGVBID09PSBub2RlQi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBub2RlQTtcbiAgICB9XG5cbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZXZlbnQsIHRhcmdldCwgY29tbW9uLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50Ll9yZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0O1xuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIGlmIChpbnN0YW5jZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgX2luc3RhbmNlNCA9IGluc3RhbmNlLFxuICAgICAgICBhbHRlcm5hdGUgPSBfaW5zdGFuY2U0LmFsdGVybmF0ZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTQudGFnO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggIT09IDApIHtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEVudGVyTGVhdmVFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGlzIHBsdWdpblxuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzLlxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZW50ZXJFdmVudCwgZnJvbSwgdG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuXG4gIGlmIChmcm9tICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBmcm9tLCBjb21tb24sIGZhbHNlKTtcbiAgfVxuXG4gIGlmICh0byAhPT0gbnVsbCAmJiBlbnRlckV2ZW50ICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBlbnRlckV2ZW50LCB0bywgY29tbW9uLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBjYXB0dXJlKSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgKyBcIl9fXCIgKyAoY2FwdHVyZSA/ICdjYXB0dXJlJyA6ICdidWJibGUnKTtcbn1cblxudmFyIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gZmFsc2U7XG52YXIgREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgPSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnO1xudmFyIFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyA9ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnO1xudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFID0gJ3N0eWxlJztcbnZhciBIVE1MJDEgPSAnX19odG1sJztcbnZhciB3YXJuZWRVbmtub3duVGFncztcbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50O1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZUhUTUw7XG5cbntcbiAgd2FybmVkVW5rbm93blRhZ3MgPSB7XG4gICAgLy8gVGhlcmUgYXJlIHdvcmtpbmcgcG9seWZpbGxzIGZvciA8ZGlhbG9nPi4gTGV0IHBlb3BsZSB1c2UgaXQuXG4gICAgZGlhbG9nOiB0cnVlLFxuICAgIC8vIEVsZWN0cm9uIHNoaXBzIGEgY3VzdG9tIDx3ZWJ2aWV3PiB0YWcgdG8gZGlzcGxheSBleHRlcm5hbCB3ZWIgY29udGVudCBpblxuICAgIC8vIGFuIGlzb2xhdGVkIGZyYW1lIGFuZCBwcm9jZXNzLlxuICAgIC8vIFRoaXMgdGFnIGlzIG5vdCBwcmVzZW50IGluIG5vbiBFbGVjdHJvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBKU0RvbSB3aGljaFxuICAgIC8vIGlzIG9mdGVuIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgLy8gQHNlZSBodHRwczovL2VsZWN0cm9uanMub3JnL2RvY3MvYXBpL3dlYnZpZXctdGFnXG4gICAgd2VidmlldzogdHJ1ZVxuICB9O1xuXG4gIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywge1xuICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczogcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICB9KTtcbiAgfTsgLy8gSUUgMTEgcGFyc2VzICYgbm9ybWFsaXplcyB0aGUgc3R5bGUgYXR0cmlidXRlIGFzIG9wcG9zZWQgdG8gb3RoZXJcbiAgLy8gYnJvd3NlcnMuIEl0IGFkZHMgc3BhY2VzIGFuZCBzb3J0cyB0aGUgcHJvcGVydGllcyBpbiBzb21lXG4gIC8vIG5vbi1hbHBoYWJldGljYWwgb3JkZXIuIEhhbmRsaW5nIHRoYXQgd291bGQgcmVxdWlyZSBzb3J0aW5nIENTU1xuICAvLyBwcm9wZXJ0aWVzIGluIHRoZSBjbGllbnQgJiBzZXJ2ZXIgdmVyc2lvbnMgb3IgYXBwbHlpbmdcbiAgLy8gYGV4cGVjdGVkU3R5bGVgIHRvIGEgdGVtcG9yYXJ5IERPTSBub2RlIHRvIHJlYWQgaXRzIGBzdHlsZWAgYXR0cmlidXRlXG4gIC8vIG5vcm1hbGl6ZWQuIFNpbmNlIGl0IG9ubHkgYWZmZWN0cyBJRSwgd2UncmUgc2tpcHBpbmcgc3R5bGUgd2FybmluZ3NcbiAgLy8gaW4gdGhhdCBicm93c2VyIGNvbXBsZXRlbHkgaW4gZmF2b3Igb2YgZG9pbmcgYWxsIHRoYXQgd29yay5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE4MDdcblxuXG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpO1xuICAgIHZhciBub3JtYWxpemVkU2VydmVyVmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9PT0gbm9ybWFsaXplZENsaWVudFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuXG4gICAgZXJyb3IoJ0V4dHJhIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyOiAlcycsIG5hbWVzKTtcbiAgfTtcblxuICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAocmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAobGlzdGVuZXIgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcik7XG4gICAgfVxuICB9OyAvLyBQYXJzZSB0aGUgSFRNTCBhbmQgcmVhZCBpdCBiYWNrIHRvIG5vcm1hbGl6ZSB0aGUgSFRNTCBzdHJpbmcgc28gdGhhdCBpdFxuICAvLyBjYW4gYmUgdXNlZCBmb3IgY29tcGFyaXNvbi5cblxuXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbVxuLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbi8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cblxuXG52YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZztcbnZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAge1xuICAgIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKG1hcmt1cCk7XG4gIH1cblxuICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgcmV0dXJuIG1hcmt1cFN0cmluZy5yZXBsYWNlKE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCwgJ1xcbicpLnJlcGxhY2UoTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclRleHQpO1xuXG4gIGlmIChub3JtYWxpemVkU2VydmVyVGV4dCA9PT0gbm9ybWFsaXplZENsaWVudFRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgIHtcbiAgICAgIGlmICghZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUZXh0IGNvbnRlbnQgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiBcIiVzXCIgQ2xpZW50OiBcIiVzXCInLCBub3JtYWxpemVkU2VydmVyVGV4dCwgbm9ybWFsaXplZENsaWVudFRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvbmN1cnJlbnRNb2RlICYmIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2gpIHtcbiAgICAvLyBJbiBjb25jdXJyZW50IHJvb3RzLCB3ZSB0aHJvdyB3aGVuIHRoZXJlJ3MgYSB0ZXh0IG1pc21hdGNoIGFuZCByZXZlcnQgdG9cbiAgICAvLyBjbGllbnQgcmVuZGVyaW5nLCB1cCB0byB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHQgY29udGVudCBkb2VzIG5vdCBtYXRjaCBzZXJ2ZXItcmVuZGVyZWQgSFRNTC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQobm9kZSkge1xuICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAvLyBub24taW50ZXJhY3RpdmUgZWxlbWVudHMsIHdoaWNoIG1lYW5zIGRlbGVnYXRlZCBjbGljayBsaXN0ZW5lcnMgZG8gbm90XG4gIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgLy8gSnVzdCBzZXQgaXQgdXNpbmcgdGhlIG9uY2xpY2sgcHJvcGVydHkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBhbnlcbiAgLy8gYm9va2tlZXBpbmcgZm9yIGl0LiBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGNsZWFyIGl0IHdoZW4gdGhlIGxpc3RlbmVyIGlzXG4gIC8vIHJlbW92ZWQuXG4gIC8vIFRPRE86IE9ubHkgZG8gdGhpcyBmb3IgdGhlIHJlbGV2YW50IFNhZmFyaXMgbWF5YmU/XG4gIG5vZGUub25jbGljayA9IG5vb3A7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIG5leHRQcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgZm9yICh2YXIgcHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cblxuXG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgaW5pdGlhbCB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSA8dGV4dGFyZWE+IHdpbGwgY2F1c2UgdGhlIHBsYWNlaG9sZGVyIHRvIG5vdFxuICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgPHRleHRhcmVhPiB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICB2YXIgY2FuU2V0VGV4dENvbnRlbnQgPSB0YWcgIT09ICd0ZXh0YXJlYScgfHwgbmV4dFByb3AgIT09ICcnO1xuXG4gICAgICAgIGlmIChjYW5TZXRUZXh0Q29udGVudCkge1xuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAvLyBUT0RPOiBIYW5kbGUgd2FzQ3VzdG9tQ29tcG9uZW50VGFnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdXBkYXRlUGF5bG9hZC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBwcm9wS2V5ID0gdXBkYXRlUGF5bG9hZFtpXTtcbiAgICB2YXIgcHJvcFZhbHVlID0gdXBkYXRlUGF5bG9hZFtpICsgMV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBwcm9wVmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7IC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuXG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgdmFyIGRvbUVsZW1lbnQ7XG4gIHZhciBuYW1lc3BhY2VVUkkgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICBuYW1lc3BhY2VVUkkgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9tRWxlbWVudCkgPT09ICdbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF0nICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFVua25vd25UYWdzLCB0eXBlKSkge1xuICAgICAgICB3YXJuZWRVbmtub3duVGFnc1t0eXBlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiAnICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBSZWFjdCBjb21wb25lbnQsIHN0YXJ0IGl0cyBuYW1lIHdpdGggJyArICdhbiB1cHBlcmNhc2UgbGV0dGVyLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgdmFyIHByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG4gIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCBmYWxzZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxufSAvLyBDYWxjdWxhdGUgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMuXG5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgdmFyIGxhc3RQcm9wcztcbiAgdmFyIG5leHRQcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGFzdFByb3BzLm9uQ2xpY2sgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG5leHRQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBuZXh0UHJvcHMpO1xuICB2YXIgcHJvcEtleTtcbiAgdmFyIHN0eWxlTmFtZTtcbiAgdmFyIHN0eWxlVXBkYXRlcyA9IG51bGw7XG5cbiAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB2YXIgbGFzdFN0eWxlID0gbGFzdFByb3BzW3Byb3BLZXldO1xuXG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MIHx8IHByb3BLZXkgPT09IENISUxEUkVOKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIGZpYmVyIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGRlbGV0ZWQgcHJvcGVydGllcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlLiBXZSB1c2VcbiAgICAgIC8vIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgaW4gdGhlIGNvbW1pdCBwaGFzZSBpbnN0ZWFkLlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYGxhc3RQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuXG5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZC5wdXNoKHByb3BLZXksIHN0eWxlVXBkYXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0bWwpIHtcbiAgICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dEh0bWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgLy8gV2UgZWFnZXJseSBsaXN0ZW4gdG8gdGhpcyBldmVuIHRob3VnaCB3ZSBoYXZlbid0IGNvbW1pdHRlZCB5ZXQuXG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkICYmIGxhc3RQcm9wICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBwcm9wcyBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXR0cmlidXRlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlc1tfaV0ubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gJycgKyBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgJycgKyBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFdhcm5EZXYgJiYgdHJ1ZSAmJiAvLyBDb252aW5jZSBGbG93IHdlJ3ZlIGNhbGN1bGF0ZWQgaXQgKGl0J3MgREVWLW9ubHkgaW4gdGhpcyBtZXRob2QuKVxuICAgIHR5cGVvZiBpc0N1c3RvbUNvbXBvbmVudFRhZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIGNvcnJlc3BvbmQgdG8gdGhlaXIgZXhwZWN0ZWQgdmFsdWVzLlxuICAgICAgdmFyIHNlcnZlclZhbHVlID0gdm9pZCAwO1xuICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPyBudWxsIDogZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuXG4gICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyB8fCAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgICB2YXIgc2VydmVySFRNTCA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRIVE1MID0gbm9ybWFsaXplSFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRIVE1MICE9PSBzZXJ2ZXJIVE1MKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVySFRNTCwgZXhwZWN0ZWRIVE1MKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkU3R5bGUgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIGV4cGVjdGVkU3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuXG4gICAgICAgIGlmIChuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2hvdWxkSWdub3JlQXR0cmlidXRlKHByb3BLZXksIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpICYmICFzaG91bGRSZW1vdmVBdHRyaWJ1dGUocHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgICAgIHZhciBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZG9udFdhcm5DdXN0b21FbGVtZW50ID0gZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCAgO1xuXG4gICAgICAgIGlmICghZG9udFdhcm5DdXN0b21FbGVtZW50ICYmIG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICAgIGlmICggLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5zaXplID4gMCAmJiByYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzKGV4dHJhQXR0cmlidXRlTmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgdHJ1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgLy8gRm9yIGlucHV0IGFuZCB0ZXh0YXJlYSB3ZSBjdXJyZW50IGFsd2F5cyBzZXQgdGhlIHZhbHVlIHByb3BlcnR5IGF0XG4gICAgICAvLyBwb3N0IG1vdW50IHRvIGZvcmNlIGl0IHRvIGRpdmVyZ2UgZnJvbSBhdHRyaWJ1dGVzLiBIb3dldmVyLCBmb3JcbiAgICAgIC8vIG9wdGlvbiBhbmQgc2VsZWN0IHdlIGRvbid0IHF1aXRlIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBzZWxlY3RcbiAgICAgIC8vIGlzIG5vdCByZXNpbGllbnQgdG8gdGhlIERPTSBzdGF0ZSBjaGFuZ2luZyBzbyB3ZSBkb24ndCBkbyB0aGF0IGhlcmUuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBub3QgZG9pbmcgdGhpcyBmb3IgaW5wdXQgYW5kIHRleHRhcmVhLlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufVxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcblxuICAgIHZhciBpbmZvID0ge1xuICAgICAgdGFnOiB0YWdcbiAgICB9O1xuXG4gICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9IC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2xpJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuXG4gICAgICBjYXNlICdvcHRncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD5cbiAgICAgIC8vIGJ1dFxuXG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHJcblxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuXG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcblxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZVxuXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG5cbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keScgfHwgdGFnID09PSAnZnJhbWVzZXQnO1xuXG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdmcmFtZSc7XG5cbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9IC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuJDEgPSB7fTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG5cbiAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHtcbiAgICAgIGlmIChjaGlsZFRhZyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwnKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRUYWcgPSAnI3RleHQnO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRhZykgPyBudWxsIDogcGFyZW50SW5mbztcbiAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxpZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pO1xuICAgIHZhciBpbnZhbGlkUGFyZW50T3JBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yO1xuXG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWc7XG5cbiAgICBpZiAoZGlkV2FybiQxW3dhcm5LZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybiQxW3dhcm5LZXldID0gdHJ1ZTtcbiAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZztcbiAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcblxuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHtcbiAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4sIDx0aGVhZD4gb3IgPHRmb290PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMlcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIGluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcpO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBTVVNQRU5TRV9TVEFSVF9EQVRBID0gJyQnO1xudmFyIFNVU1BFTlNFX0VORF9EQVRBID0gJy8kJztcbnZhciBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgPSAnJD8nO1xudmFyIFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgPSAnJCEnO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xudmFyIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGV4dChyb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgdmFyIHR5cGU7XG4gIHZhciBuYW1lc3BhY2U7XG4gIHZhciBub2RlVHlwZSA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyByb290Q29udGFpbmVySW5zdGFuY2UucGFyZW50Tm9kZSA6IHJvb3RDb250YWluZXJJbnN0YW5jZTtcbiAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkgfHwgbnVsbDtcbiAgICAgICAgdHlwZSA9IGNvbnRhaW5lci50YWdOYW1lO1xuICAgICAgICBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShvd25OYW1lc3BhY2UsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgdmFsaWRhdGVkVGFnID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0KHBhcmVudEhvc3RDb250ZXh0LCB0eXBlLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAge1xuICAgIHZhciBwYXJlbnRIb3N0Q29udGV4dERldiA9IHBhcmVudEhvc3RDb250ZXh0O1xuICAgIHZhciBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwcmVwYXJlRm9yQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgZXZlbnRzRW5hYmxlZCA9IGlzRW5hYmxlZCgpO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCk7XG4gIHZhciBhY3RpdmVJbnN0YW5jZSA9IG51bGw7XG5cbiAgc2V0RW5hYmxlZChmYWxzZSk7XG4gIHJldHVybiBhY3RpdmVJbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2V0RW5hYmxlZChldmVudHNFbmFibGVkKTtcbiAgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cblxuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfVxuXG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJldHVybiAhIXByb3BzLmF1dG9Gb2N1cztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcblxuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByb3BzKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dGFyZWEnIHx8IHR5cGUgPT09ICdub3NjcmlwdCcgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInIHx8IHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sICE9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRleHQsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gIH1cblxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCkge1xuICB2YXIgY3VycmVudEV2ZW50ID0gd2luZG93LmV2ZW50O1xuXG4gIGlmIChjdXJyZW50RXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBnZXRFdmVudFByaW9yaXR5KGN1cnJlbnRFdmVudC50eXBlKTtcbn1cbi8vIGlmIGEgY29tcG9uZW50IGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLlxuLy8gU29tZSBlbnZpcm9ubWVudHMgbWlnaHQgbm90IGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuXG5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgbG9jYWxQcm9taXNlID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgPyBQcm9taXNlIDogdW5kZWZpbmVkOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgc2NoZWR1bGVNaWNyb3Rhc2sgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBsb2NhbFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBsb2NhbFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNhbGxiYWNrKS5jYXRjaChoYW5kbGVFcnJvckluTmV4dFRpY2spO1xufSA6IHNjaGVkdWxlVGltZW91dDsgLy8gVE9ETzogRGV0ZXJtaW5lIHRoZSBiZXN0IGZhbGxiYWNrIGhlcmUuXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9ySW5OZXh0VGljayhlcnJvcikge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNvbW1pdE1vdW50KGRvbUVsZW1lbnQsIHR5cGUsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIERlc3BpdGUgdGhlIG5hbWluZyB0aGF0IG1pZ2h0IGltcGx5IG90aGVyd2lzZSwgdGhpcyBtZXRob2Qgb25seVxuICAvLyBmaXJlcyBpZiB0aGVyZSBpcyBhbiBgVXBkYXRlYCBlZmZlY3Qgc2NoZWR1bGVkIGR1cmluZyBtb3VudGluZy5cbiAgLy8gVGhpcyBoYXBwZW5zIGlmIGBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbmAgcmV0dXJucyBgdHJ1ZWAgKHdoaWNoIGl0XG4gIC8vIGRvZXMgdG8gaW1wbGVtZW50IHRoZSBgYXV0b0ZvY3VzYCBhdHRyaWJ1dGUgb24gdGhlIGNsaWVudCkuIEJ1dFxuICAvLyB0aGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVuIHRoaXMgbWlnaHQgaGFwcGVuIChzdWNoIGFzIHBhdGNoaW5nXG4gIC8vIHVwIHRleHQgY29udGVudCBkdXJpbmcgaHlkcmF0aW9uIG1pc21hdGNoKS4gU28gd2UnbGwgY2hlY2sgdGhpcyBhZ2Fpbi5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpZiAobmV3UHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLnNyYykge1xuICAgICAgICAgIGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBET00gbm9kZS5cbiAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpOyAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSBuZXdUZXh0O1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZTtcblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGNvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lcjtcbiAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSAvLyBUaGlzIGNvbnRhaW5lciBtaWdodCBiZSB1c2VkIGZvciBhIHBvcnRhbC5cbiAgLy8gSWYgc29tZXRoaW5nIGluc2lkZSBhIHBvcnRhbCBpcyBjbGlja2VkLCB0aGF0IGNsaWNrIHNob3VsZCBidWJibGVcbiAgLy8gdGhyb3VnaCB0aGUgUmVhY3QgdHJlZS4gSG93ZXZlciwgb24gTW9iaWxlIFNhZmFyaSB0aGUgY2xpY2sgd291bGRcbiAgLy8gbmV2ZXIgYnViYmxlIHRocm91Z2ggdGhlICpET00qIHRyZWUgdW5sZXNzIGFuIGFuY2VzdG9yIHdpdGggb25jbGlja1xuICAvLyBldmVudCBleGlzdHMuIFNvIHdlIHdvdWxkbid0IHNlZSBpdCBhbmQgZGlzcGF0Y2ggaXQuXG4gIC8vIFRoaXMgaXMgd2h5IHdlIGVuc3VyZSB0aGF0IG5vbiBSZWFjdCByb290IGNvbnRhaW5lcnMgaGF2ZSBpbmxpbmUgb25jbGlja1xuICAvLyBkZWZpbmVkLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExOTE4XG5cblxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgaWYgKChyZWFjdFJvb3RDb250YWluZXIgPT09IG51bGwgfHwgcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQpICYmIHBhcmVudE5vZGUub25jbGljayA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQocGFyZW50Tm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW5Db250YWluZXJCZWZvcmUoY29udGFpbmVyLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTsgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICBkbyB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChub2RlKTtcblxuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIucGFyZW50Tm9kZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGUgPSBpbnN0YW5jZS5zdHlsZTtcblxuICBpZiAodHlwZW9mIHN0eWxlLnNldFByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsICdpbXBvcnRhbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5mdW5jdGlvbiB1bmhpZGVJbnN0YW5jZShpbnN0YW5jZSwgcHJvcHMpIHtcbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlUHJvcCA9IHByb3BzW1NUWUxFJDFdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIHVuaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG59XG5mdW5jdGlvbiBjbGVhckNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgaWYgKGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KTtcbiAgICB9XG4gIH1cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY2FuSHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IEVMRU1FTlRfTk9ERSB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGFuIGVsZW1lbnQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSBzdXNwZW5zZSBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoaW5zdGFuY2UpIHtcbiAgdmFyIGRhdGFzZXQgPSBpbnN0YW5jZS5uZXh0U2libGluZyAmJiBpbnN0YW5jZS5uZXh0U2libGluZy5kYXRhc2V0O1xuICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjaztcblxuICBpZiAoZGF0YXNldCkge1xuICAgIGRpZ2VzdCA9IGRhdGFzZXQuZGdzdDtcblxuICAgIHtcbiAgICAgIG1lc3NhZ2UgPSBkYXRhc2V0Lm1zZztcbiAgICAgIHN0YWNrID0gZGF0YXNldC5zdGNrO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGRpZ2VzdDogZGlnZXN0LFxuICAgICAgc3RhY2s6IHN0YWNrXG4gICAgfTtcbiAgfSAvLyBsZXQgdmFsdWUgPSB7bWVzc2FnZTogdW5kZWZpbmVkLCBoYXNoOiB1bmRlZmluZWR9O1xuICAvLyBjb25zdCBuZXh0U2libGluZyA9IGluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAvLyBpZiAobmV4dFNpYmxpbmcpIHtcbiAgLy8gICBjb25zdCBkYXRhc2V0ID0gKChuZXh0U2libGluZzogYW55KTogSFRNTFRlbXBsYXRlRWxlbWVudCkuZGF0YXNldDtcbiAgLy8gICB2YWx1ZS5tZXNzYWdlID0gZGF0YXNldC5tc2c7XG4gIC8vICAgdmFsdWUuaGFzaCA9IGRhdGFzZXQuaGFzaDtcbiAgLy8gICBpZiAodHJ1ZSkge1xuICAvLyAgICAgdmFsdWUuc3RhY2sgPSBkYXRhc2V0LnN0YWNrO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvLyByZXR1cm4gdmFsdWU7XG5cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KGluc3RhbmNlLCBjYWxsYmFjaykge1xuICBpbnN0YW5jZS5fcmVhY3RSZXRyeSA9IGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZShub2RlKSB7XG4gIC8vIFNraXAgbm9uLWh5ZHJhdGFibGUgbm9kZXMuXG4gIGZvciAoOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlVHlwZTtcblxuICAgIGlmIChub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgbm9kZURhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChub2RlRGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBub2RlRGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBub2RlRGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKGluc3RhbmNlLm5leHRTaWJsaW5nKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKHBhcmVudEluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRJbnN0YW5jZS5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50Q29udGFpbmVyLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShwYXJlbnRJbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGluc3RhbmNlKTsgLy8gVE9ETzogUG9zc2libHkgZGVmZXIgdGhpcyB1bnRpbCB0aGUgY29tbWl0IHBoYXNlIHdoZXJlIGFsbCB0aGUgZXZlbnRzXG4gIC8vIGdldCBhdHRhY2hlZC5cblxuICB1cGRhdGVGaWJlclByb3BzKGluc3RhbmNlLCBwcm9wcyk7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfSAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuXG4gIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKGludGVybmFsSW5zdGFuY2VIYW5kbGUubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHRJbnN0YW5jZSk7IC8vIFRPRE86IFRlbXBvcmFyeSBoYWNrIHRvIGNoZWNrIGlmIHdlJ3JlIGluIGEgY29uY3VycmVudCByb290LiBXZSBjYW4gZGVsZXRlXG4gIC8vIHdoZW4gdGhlIGxlZ2FjeSByb290IEFQSSBpcyByZW1vdmVkLlxuXG4gIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKGludGVybmFsSW5zdGFuY2VIYW5kbGUubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZVN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2UubmV4dFNpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gIH0gLy8gVE9ETzogV2Fybiwgd2UgZGlkbid0IGZpbmQgdGhlIGVuZCBjb21tZW50IGJvdW5kYXJ5LlxuXG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIFJldHVybnMgdGhlIFN1c3BlbnNlSW5zdGFuY2UgaWYgdGhpcyBub2RlIGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbi8vIFN1c3BlbnNlSW5zdGFuY2UuIEkuZS4gaWYgaXRzIHByZXZpb3VzIHNpYmxpbmcgaXMgYSBDb21tZW50IHdpdGhcbi8vIFNVU1BFTlNFX3hfU1RBUlRfREFUQS4gT3RoZXJ3aXNlLCBudWxsLlxuXG5mdW5jdGlvbiBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldEluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gdGFyZ2V0SW5zdGFuY2UucHJldmlvdXNTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oY29udGFpbmVyKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVVuaHlkcmF0ZWRUYWlsSW5zdGFuY2VzKHBhcmVudFR5cGUpIHtcbiAgcmV0dXJuIHBhcmVudFR5cGUgIT09ICdoZWFkJyAmJiBwYXJlbnRUeXBlICE9PSAnYm9keSc7XG59XG5mdW5jdGlvbiBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTtcbiAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHRleHRJbnN0YW5jZS5ub2RlVmFsdWUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICBpZiAocGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHRleHRJbnN0YW5jZS5ub2RlVmFsdWUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSkge1xuICB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnRDb250YWluZXIsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy5cbiAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7XG5cbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnROb2RlLCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0eXBlLCBwcm9wcykge1xuICB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudENvbnRhaW5lciwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlICE9PSBudWxsKSB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0eXBlLCBwcm9wcywgaXNDb25jdXJyZW50TW9kZSkge1xuICB7XG4gICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHtcbiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50SW5zdGFuY2UsIHRleHQpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3JIeWRyYXRpbmdDb250YWluZXIocGFyZW50Q29udGFpbmVyKSB7XG4gIHtcbiAgICAvLyBUT0RPOiBUaGlzIGdldHMgbG9nZ2VkIGJ5IG9uUmVjb3ZlcmFibGVFcnJvciwgdG9vLCBzbyB3ZSBzaG91bGQgYmVcbiAgICAvLyBhYmxlIHRvIHJlbW92ZSBpdC5cbiAgICBlcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVGhlIHNlcnZlciBIVE1MIHdhcyByZXBsYWNlZCB3aXRoIGNsaWVudCBjb250ZW50IGluIDwlcz4uJywgcGFyZW50Q29udGFpbmVyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocG9ydGFsSW5zdGFuY2UpO1xufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXkgPSAnX19yZWFjdExpc3RlbmVycyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVzU2V0S2V5ID0gJ19fcmVhY3RIYW5kbGVzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBkZXRhY2hEZWxldGVkSW5zdGFuY2Uobm9kZSkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uIGhvc3QgY29tcG9uZW50cy4gSSBkb24ndCB0aGluayBhbGwgb2ZcbiAgLy8gdGhlc2UgZmllbGRzIGFyZSByZWxldmFudC5cbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsUHJvcHNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlckxpc3RlbmVyc0tleV07XG4gIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVzU2V0S2V5XTtcbn1cbmZ1bmN0aW9uIHByZWNhY2hlRmliZXJOb2RlKGhvc3RJbnN0LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBob3N0SW5zdDtcbn1cbmZ1bmN0aW9uIG1hcmtDb250YWluZXJBc1Jvb3QoaG9zdFJvb3QsIG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IGhvc3RSb290O1xufVxuZnVuY3Rpb24gdW5tYXJrQ29udGFpbmVyQXNSb290KG5vZGUpIHtcbiAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IG51bGw7XG59XG5mdW5jdGlvbiBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChub2RlKSB7XG4gIHJldHVybiAhIW5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG59IC8vIEdpdmVuIGEgRE9NIG5vZGUsIHJldHVybiB0aGUgY2xvc2VzdCBIb3N0Q29tcG9uZW50IG9yIEhvc3RUZXh0IGZpYmVyIGFuY2VzdG9yLlxuLy8gSWYgdGhlIHRhcmdldCBub2RlIGlzIHBhcnQgb2YgYSBoeWRyYXRlZCBvciBub3QgeWV0IHJlbmRlcmVkIHN1YnRyZWUsIHRoZW5cbi8vIHRoaXMgbWF5IGFsc28gcmV0dXJuIGEgU3VzcGVuc2VDb21wb25lbnQgb3IgSG9zdFJvb3QgdG8gaW5kaWNhdGUgdGhhdC5cbi8vIENvbmNlcHR1YWxseSB0aGUgSG9zdFJvb3QgZmliZXIgaXMgYSBjaGlsZCBvZiB0aGUgQ29udGFpbmVyIG5vZGUuIFNvIGlmIHlvdVxuLy8gcGFzcyB0aGUgQ29udGFpbmVyIG5vZGUgYXMgdGhlIHRhcmdldE5vZGUsIHlvdSB3aWxsIG5vdCBhY3R1YWxseSBnZXQgdGhlXG4vLyBIb3N0Um9vdCBiYWNrLiBUbyBnZXQgdG8gdGhlIEhvc3RSb290LCB5b3UgbmVlZCB0byBwYXNzIGEgY2hpbGQgb2YgaXQuXG4vLyBUaGUgc2FtZSB0aGluZyBhcHBsaWVzIHRvIFN1c3BlbnNlIGJvdW5kYXJpZXMuXG5cbmZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHRhcmdldE5vZGUpIHtcbiAgdmFyIHRhcmdldEluc3QgPSB0YXJnZXROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuXG4gIGlmICh0YXJnZXRJbnN0KSB7XG4gICAgLy8gRG9uJ3QgcmV0dXJuIEhvc3RSb290IG9yIFN1c3BlbnNlQ29tcG9uZW50IGhlcmUuXG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH0gLy8gSWYgdGhlIGRpcmVjdCBldmVudCB0YXJnZXQgaXNuJ3QgYSBSZWFjdCBvd25lZCBET00gbm9kZSwgd2UgbmVlZCB0byBsb29rXG4gIC8vIHRvIHNlZSBpZiBvbmUgb2YgaXRzIHBhcmVudHMgaXMgYSBSZWFjdCBvd25lZCBET00gbm9kZS5cblxuXG4gIHZhciBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuXG4gIHdoaWxlIChwYXJlbnROb2RlKSB7XG4gICAgLy8gV2UnbGwgY2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRhaW5lciByb290IHRoYXQgY291bGQgaW5jbHVkZVxuICAgIC8vIFJlYWN0IG5vZGVzIGluIHRoZSBmdXR1cmUuIFdlIG5lZWQgdG8gY2hlY2sgdGhpcyBmaXJzdCBiZWNhdXNlXG4gICAgLy8gaWYgd2UncmUgYSBjaGlsZCBvZiBhIGRlaHlkcmF0ZWQgY29udGFpbmVyLCB3ZSBuZWVkIHRvIGZpcnN0XG4gICAgLy8gZmluZCB0aGF0IGlubmVyIGNvbnRhaW5lciBiZWZvcmUgbW92aW5nIG9uIHRvIGZpbmRpbmcgdGhlIHBhcmVudFxuICAgIC8vIGluc3RhbmNlLiBOb3RlIHRoYXQgd2UgZG9uJ3QgY2hlY2sgdGhpcyBmaWVsZCBvbiAgdGhlIHRhcmdldE5vZGVcbiAgICAvLyBpdHNlbGYgYmVjYXVzZSB0aGUgZmliZXJzIGFyZSBjb25jZXB0dWFsbHkgYmV0d2VlbiB0aGUgY29udGFpbmVyXG4gICAgLy8gbm9kZSBhbmQgdGhlIGZpcnN0IGNoaWxkLiBJdCBpc24ndCBzdXJyb3VuZGluZyB0aGUgY29udGFpbmVyIG5vZGUuXG4gICAgLy8gSWYgaXQncyBub3QgYSBjb250YWluZXIsIHdlIGNoZWNrIGlmIGl0J3MgYW4gaW5zdGFuY2UuXG4gICAgdGFyZ2V0SW5zdCA9IHBhcmVudE5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gfHwgcGFyZW50Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICAgIGlmICh0YXJnZXRJbnN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIHdhc24ndCB0aGUgZGlyZWN0IHRhcmdldCBvZiB0aGUgZXZlbnQsIHdlIG1pZ2h0IGhhdmVcbiAgICAgIC8vIHN0ZXBwZWQgcGFzdCBkZWh5ZHJhdGVkIERPTSBub2RlcyB0byBnZXQgaGVyZS4gSG93ZXZlciB0aGV5IGNvdWxkXG4gICAgICAvLyBhbHNvIGhhdmUgYmVlbiBub24tUmVhY3Qgbm9kZXMuIFdlIG5lZWQgdG8gYW5zd2VyIHdoaWNoIG9uZS5cbiAgICAgIC8vIElmIHdlIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuLCB0aGVuIHRoZXJlIGNhbid0IGJlXG4gICAgICAvLyBhIG5lc3RlZCBzdXNwZW5zZSBib3VuZGFyeSB3aXRoaW4gaXQuIFNvIHdlIGNhbiB1c2UgdGhpcyBhcyBhIGZhc3RcbiAgICAgIC8vIGJhaWxvdXQuIE1vc3Qgb2YgdGhlIHRpbWUsIHdoZW4gcGVvcGxlIGFkZCBub24tUmVhY3QgY2hpbGRyZW4gdG9cbiAgICAgIC8vIHRoZSB0cmVlLCBpdCBpcyB1c2luZyBhIHJlZiB0byBhIGNoaWxkLWxlc3MgRE9NIG5vZGUuXG4gICAgICAvLyBOb3JtYWxseSB3ZSdkIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgb2YgdGhlIGZpYmVycyBiZWNhdXNlIGlmIGl0XG4gICAgICAvLyBoYXMgZXZlciBnb25lIGZyb20gaGF2aW5nIGNoaWxkcmVuIHRvIGRlbGV0aW5nIHRoZW0gb3IgdmljZSB2ZXJzYVxuICAgICAgLy8gaXQgd291bGQgaGF2ZSBkZWxldGVkIHRoZSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IG5lc3RlZCBpbnNpZGUgYWxyZWFkeS5cbiAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoZSBIb3N0Um9vdCBzdGFydHMgb3V0IHdpdGggYW4gYWx0ZXJuYXRlIGl0IG1pZ2h0XG4gICAgICAvLyBoYXZlIG9uZSBvbiB0aGUgYWx0ZXJuYXRlIHNvIHdlIG5lZWQgdG8gY2hlY2sgaW4gY2FzZSB0aGlzIHdhcyBhXG4gICAgICAvLyByb290LlxuICAgICAgdmFyIGFsdGVybmF0ZSA9IHRhcmdldEluc3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAodGFyZ2V0SW5zdC5jaGlsZCAhPT0gbnVsbCB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgYWx0ZXJuYXRlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE5leHQgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBub2RlIHRoYXQgc2tpcHBlZCBwYXN0IGlzXG4gICAgICAgIC8vIG5lc3RlZCB3aXRoaW4gYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFuZCBpZiBzbywgd2hpY2ggb25lLlxuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0Tm9kZSk7XG5cbiAgICAgICAgd2hpbGUgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBmb3VuZCBhIHN1c3BlbnNlIGluc3RhbmNlLiBUaGF0IG1lYW5zIHRoYXQgd2UgaGF2ZW4ndFxuICAgICAgICAgIC8vIGh5ZHJhdGVkIGl0IHlldC4gRXZlbiB0aG91Z2ggd2UgbGVhdmUgdGhlIGNvbW1lbnRzIGluIHRoZVxuICAgICAgICAgIC8vIERPTSBhZnRlciBoeWRyYXRpbmcsIGFuZCB0aGVyZSBhcmUgYm91bmRhcmllcyBpbiB0aGUgRE9NXG4gICAgICAgICAgLy8gdGhhdCBjb3VsZCBhbHJlYWR5IGJlIGh5ZHJhdGVkLCB3ZSB3b3VsZG4ndCBoYXZlIGZvdW5kIHRoZW1cbiAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgcGFzcyBzaW5jZSBpZiB0aGUgdGFyZ2V0IGlzIGh5ZHJhdGVkIGl0IHdvdWxkXG4gICAgICAgICAgLy8gaGF2ZSBoYWQgYW4gaW50ZXJuYWxJbnN0YW5jZUtleSBvbiBpdC5cbiAgICAgICAgICAvLyBMZXQncyBnZXQgdGhlIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgU3VzcGVuc2VDb21wb25lbnRcbiAgICAgICAgICAvLyBhcyB0aGUgZGVlcGVzdCBpbnN0YW5jZS5cbiAgICAgICAgICB2YXIgdGFyZ2V0U3VzcGVuc2VJbnN0ID0gc3VzcGVuc2VJbnN0YW5jZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICAgICAgICAgIGlmICh0YXJnZXRTdXNwZW5zZUluc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRTdXNwZW5zZUluc3Q7XG4gICAgICAgICAgfSAvLyBJZiB3ZSBkb24ndCBmaW5kIGEgRmliZXIgb24gdGhlIGNvbW1lbnQsIGl0IG1pZ2h0IGJlIGJlY2F1c2VcbiAgICAgICAgICAvLyB3ZSBoYXZlbid0IGdvdHRlbiB0byBoeWRyYXRlIGl0IHlldC4gVGhlcmUgbWlnaHQgc3RpbGwgYmUgYVxuICAgICAgICAgIC8vIHBhcmVudCBib3VuZGFyeSB0aGF0IGhhc24ndCBhYm92ZSB0aGlzIG9uZSBzbyB3ZSBuZWVkIHRvIGZpbmRcbiAgICAgICAgICAvLyB0aGUgb3V0ZXIgbW9zdCB0aGF0IGlzIGtub3duLlxuXG5cbiAgICAgICAgICBzdXNwZW5zZUluc3RhbmNlID0gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTsgLy8gSWYgd2UgZG9uJ3QgZmluZCBvbmUsIHRoZW4gdGhhdCBzaG91bGQgbWVhbiB0aGF0IHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBob3N0IGNvbXBvbmVudCBhbHNvIGhhc24ndCBoeWRyYXRlZCB5ZXQuIFdlIGNhbiByZXR1cm4gaXRcbiAgICAgICAgICAvLyBiZWxvdyBzaW5jZSBpdCB3aWxsIGJhaWwgb3V0IG9uIHRoZSBpc01vdW50ZWQgY2hlY2sgbGF0ZXIuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gICAgfVxuXG4gICAgdGFyZ2V0Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIG5vZGUgd2FzIG5vdCByZW5kZXJlZCBieSB0aGlzIFJlYWN0LlxuICovXG5cbmZ1bmN0aW9uIGdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICB2YXIgaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gfHwgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTtcblxuICBpZiAoaW5zdCkge1xuICAgIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQgfHwgaW5zdC50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgcmV0dXJuIGluc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBHaXZlbiBhIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBET00gbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHtcbiAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCkge1xuICAgIC8vIEluIEZpYmVyIHRoaXMsIGlzIGp1c3QgdGhlIHN0YXRlIG5vZGUgcmlnaHQgbm93LiBXZSBhc3N1bWUgaXQgd2lsbCBiZVxuICAgIC8vIGEgaG9zdCBjb21wb25lbnQgb3IgaG9zdCB0ZXh0LlxuICAgIHJldHVybiBpbnN0LnN0YXRlTm9kZTtcbiAgfSAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJyk7XG59XG5mdW5jdGlvbiBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUZpYmVyUHJvcHMobm9kZSwgcHJvcHMpIHtcbiAgbm9kZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRMaXN0ZW5lclNldChub2RlKSB7XG4gIHZhciBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV07XG5cbiAgaWYgKGVsZW1lbnRMaXN0ZW5lclNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldID0gbmV3IFNldCgpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRMaXN0ZW5lclNldDtcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY29udGV4dFR5cGVzLCBjb250ZXh0LCAnY29udGV4dCcsIG5hbWUpO1xuICAgIH0gLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAgIC8vIENvbnRleHQgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNsYXNzIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgc28gY2hlY2sgZm9yIGluc3RhbmNlLlxuXG5cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDb250ZXh0Q2hhbmdlZCgpIHtcbiAge1xuICAgIHJldHVybiBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIodHlwZSkge1xuICB7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlcztcbiAgICByZXR1cm4gY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BDb250ZXh0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3QoZmliZXIsIGNvbnRleHQsIGRpZENoYW5nZSkge1xuICB7XG4gICAgaWYgKGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBjb250ZXh0IGZvdW5kIG9uIHN0YWNrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIGNvbnRleHQsIGZpYmVyKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NDaGlsZENvbnRleHQoZmliZXIsIHR5cGUsIHBhcmVudENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzOyAvLyBUT0RPIChidmF1Z2huKSBSZXBsYWNlIHRoaXMgYmVoYXZpb3Igd2l0aCBhbiBpbnZhcmlhbnQoKSBpbiB0aGUgZnV0dXJlLlxuICAgIC8vIEl0IGhhcyBvbmx5IGJlZW4gYWRkZWQgaW4gRmliZXIgdG8gbWF0Y2ggdGhlICh1bmludGVudGlvbmFsKSBiZWhhdmlvciBpbiBTdGFjay5cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuXG4gICAgICAgIGlmICghd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCclcy5jaGlsZENvbnRleHRUeXBlcyBpcyBzcGVjaWZpZWQgYnV0IHRoZXJlIGlzIG5vIGdldENoaWxkQ29udGV4dCgpIG1ldGhvZCAnICsgJ29uIHRoZSBpbnN0YW5jZS4gWW91IGNhbiBlaXRoZXIgZGVmaW5lIGdldENoaWxkQ29udGV4dCgpIG9uICVzIG9yIHJlbW92ZSAnICsgJ2NoaWxkQ29udGV4dFR5cGVzIGZyb20gaXQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmVudENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkQ29udGV4dCA9IGluc3RhbmNlLmdldENoaWxkQ29udGV4dCgpO1xuXG4gICAgZm9yICh2YXIgY29udGV4dEtleSBpbiBjaGlsZENvbnRleHQpIHtcbiAgICAgIGlmICghKGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0VHlwZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKSArIFwiLmdldENoaWxkQ29udGV4dCgpOiBrZXkgXFxcIlwiICsgY29udGV4dEtleSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy5cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3NpZ24oe30sIHBhcmVudENvbnRleHQsIGNoaWxkQ29udGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcykge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBXZSBwdXNoIHRoZSBjb250ZXh0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGVuc3VyZSBzdGFjayBpbnRlZ3JpdHkuXG4gICAgLy8gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90IGV4aXN0IHlldCwgd2Ugd2lsbCBwdXNoIG51bGwgYXQgZmlyc3QsXG4gICAgLy8gYW5kIHJlcGxhY2UgaXQgb24gdGhlIHN0YWNrIGxhdGVyIHdoZW4gaW52YWxpZGF0aW5nIHRoZSBjb250ZXh0LlxuXG4gICAgdmFyIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgfHwgZW1wdHlDb250ZXh0T2JqZWN0OyAvLyBSZW1lbWJlciB0aGUgcGFyZW50IGNvbnRleHQgc28gd2UgY2FuIG1lcmdlIHdpdGggaXQgbGF0ZXIuXG4gICAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGlkLXBlcmZvcm0td29yayB2YWx1ZSB0byBhdm9pZCBpbmFkdmVydGVudGx5IGJsb2NraW5nIHVwZGF0ZXMuXG5cbiAgICBwcmV2aW91c0NvbnRleHQgPSBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIHR5cGUsIGRpZENoYW5nZSkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGFuIGluc3RhbmNlIGJ5IHRoaXMgcG9pbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoZGlkQ2hhbmdlKSB7XG4gICAgICAvLyBNZXJnZSBwYXJlbnQgYW5kIG93biBjb250ZXh0LlxuICAgICAgLy8gU2tpcCB0aGlzIGlmIHdlJ3JlIG5vdCB1cGRhdGluZyBkdWUgdG8gc0NVLlxuICAgICAgLy8gVGhpcyBhdm9pZHMgdW5uZWNlc3NhcmlseSByZWNvbXB1dGluZyBtZW1vaXplZCB2YWx1ZXMuXG4gICAgICB2YXIgbWVyZ2VkQ29udGV4dCA9IHByb2Nlc3NDaGlsZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHR5cGUsIHByZXZpb3VzQ29udGV4dCk7XG4gICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IG1lcmdlZENvbnRleHQ7IC8vIFJlcGxhY2UgdGhlIG9sZCAob3IgZW1wdHkpIGNvbnRleHQgd2l0aCB0aGUgbmV3IG9uZS5cbiAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byB1bndpbmQgdGhlIGNvbnRleHQgaW4gdGhlIHJldmVyc2Ugb3JkZXIuXG5cbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7IC8vIE5vdyBwdXNoIHRoZSBuZXcgY29udGV4dCBhbmQgbWFyayB0aGF0IGl0IGhhcyBjaGFuZ2VkLlxuXG4gICAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbWVyZ2VkQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgd2l0aCByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjsgbm90IHN1cmUgaWYgaXRcbiAgICAvLyBtYWtlcyBzZW5zZSBlbHNld2hlcmVcbiAgICBpZiAoIWlzRmliZXJNb3VudGVkKGZpYmVyKSB8fCBmaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbnZhciBMZWdhY3lSb290ID0gMDtcbnZhciBDb25jdXJyZW50Um9vdCA9IDE7XG5cbnZhciBzeW5jUXVldWUgPSBudWxsO1xudmFyIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlO1xudmFyIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbmZ1bmN0aW9uIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIC8vIFB1c2ggdGhpcyBjYWxsYmFjayBpbnRvIGFuIGludGVybmFsIHF1ZXVlLiBXZSdsbCBmbHVzaCB0aGVzZSBlaXRoZXIgaW5cbiAgLy8gdGhlIG5leHQgdGljaywgb3IgZWFybGllciBpZiBzb21ldGhpbmcgY2FsbHMgYGZsdXNoU3luY0NhbGxiYWNrUXVldWVgLlxuICBpZiAoc3luY1F1ZXVlID09PSBudWxsKSB7XG4gICAgc3luY1F1ZXVlID0gW2NhbGxiYWNrXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG59XG5mdW5jdGlvbiBzY2hlZHVsZUxlZ2FjeVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSB0cnVlO1xuICBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjayk7XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCkge1xuICAvLyBPbmx5IGZsdXNoZXMgdGhlIHF1ZXVlIGlmIHRoZXJlJ3MgYSBsZWdhY3kgc3luYyBjYWxsYmFjayBzY2hlZHVsZWQuXG4gIC8vIFRPRE86IFRoZXJlJ3Mgb25seSBhIHNpbmdsZSB0eXBlIG9mIGNhbGxiYWNrOiBwZXJmb3JtU3luY09uV29ya09uUm9vdC4gU29cbiAgLy8gaXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIGZvciB0aGUgcXVldWUgdG8gYmUgYSBsaXN0IG9mIHJvb3RzIGluc3RlYWQgb2YgYVxuICAvLyBsaXN0IG9mIGdlbmVyaWMgY2FsbGJhY2tzLiBUaGVuIHdlIGNhbiBoYXZlIHR3bzogb25lIGZvciBsZWdhY3kgcm9vdHMsIG9uZVxuICAvLyBmb3IgY29uY3VycmVudCByb290cy4gQW5kIHRoaXMgbWV0aG9kIHdvdWxkIG9ubHkgZmx1c2ggdGhlIGxlZ2FjeSBvbmVzLlxuICBpZiAoaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzKSB7XG4gICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luY0NhbGxiYWNrcygpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY2UuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBwcmV2aW91c1VwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIGlzU3luYyA9IHRydWU7XG4gICAgICB2YXIgcXVldWUgPSBzeW5jUXVldWU7IC8vIFRPRE86IElzIHRoaXMgbmVjZXNzYXJ5IGFueW1vcmU/IFRoZSBvbmx5IHVzZXIgY29kZSB0aGF0IHJ1bnMgaW4gdGhpc1xuICAgICAgLy8gcXVldWUgaXMgaW4gdGhlIHJlbmRlciBvciBjb21taXQgcGhhc2VzLlxuXG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcblxuICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBxdWV1ZVtpXTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhpc1N5bmMpO1xuICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHN5bmNRdWV1ZSA9IG51bGw7XG4gICAgICBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgc29tZXRoaW5nIHRocm93cywgbGVhdmUgdGhlIHJlbWFpbmluZyBjYWxsYmFja3Mgb24gdGhlIHF1ZXVlLlxuICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBzeW5jUXVldWUgPSBzeW5jUXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgfSAvLyBSZXN1bWUgZmx1c2hpbmcgaW4gdGhlIG5leHQgdGlja1xuXG5cbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlUHJpb3JpdHkpO1xuICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUT0RPOiBVc2UgdGhlIHVuaWZpZWQgZmliZXIgc3RhY2sgbW9kdWxlIGluc3RlYWQgb2YgdGhpcyBsb2NhbCBvbmU/XG4vLyBJbnRlbnRpb25hbGx5IG5vdCB1c2luZyBpdCB5ZXQgdG8gZGVyaXNrIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlXG4vLyB0aGUgd2F5IHdlIHB1c2gvcG9wIHRoZXNlIHZhbHVlcyBpcyBhIGJpdCB1bnVzdWFsLiBJZiB0aGVyZSdzIGEgbWlzdGFrZSwgSSdkXG4vLyByYXRoZXIgdGhlIGlkcyBiZSB3cm9uZyB0aGFuIGNyYXNoIHRoZSB3aG9sZSByZWNvbmNpbGVyLlxudmFyIGZvcmtTdGFjayA9IFtdO1xudmFyIGZvcmtTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlRm9ya1Byb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlRm9ya0NvdW50ID0gMDtcbnZhciBpZFN0YWNrID0gW107XG52YXIgaWRTdGFja0luZGV4ID0gMDtcbnZhciB0cmVlQ29udGV4dFByb3ZpZGVyID0gbnVsbDtcbnZhciB0cmVlQ29udGV4dElkID0gMTtcbnZhciB0cmVlQ29udGV4dE92ZXJmbG93ID0gJyc7XG5mdW5jdGlvbiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9ya2VkKSAhPT0gTm9GbGFncztcbn1cbmZ1bmN0aW9uIGdldEZvcmtzQXRMZXZlbCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgcmV0dXJuIHRyZWVGb3JrQ291bnQ7XG59XG5mdW5jdGlvbiBnZXRUcmVlSWQoKSB7XG4gIHZhciBvdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIHZhciBpZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGlkID0gaWRXaXRoTGVhZGluZ0JpdCAmIH5nZXRMZWFkaW5nQml0KGlkV2l0aExlYWRpbmdCaXQpO1xuICByZXR1cm4gaWQudG9TdHJpbmcoMzIpICsgb3ZlcmZsb3c7XG59XG5mdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgd2UgcmVjb25jaWxlIGFuIGFycmF5IChvciBpdGVyYXRvcikgb2YgY2hpbGRcbiAgLy8gZmliZXJzLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBrbm93IGhvdyBtYW55IGNoaWxkcmVuIGluXG4gIC8vIHRoZSB3aG9sZSBzZXQgd2l0aG91dCBkb2luZyBleHRyYSB3b3JrIGxhdGVyLCBvciBzdG9yaW5nIGFkZHRpb25hbFxuICAvLyBpbmZvcm1hdGlvbiBvbiB0aGUgZmliZXIuXG4gIC8vXG4gIC8vIFRoYXQncyB3aHkgdGhpcyBmdW5jdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIHB1c2hUcmVlSWQgXHUyMDE0IGl0J3MgY2FsbGVkIGR1cmluZ1xuICAvLyB0aGUgcmVuZGVyIHBoYXNlIG9mIHRoZSBmb3JrIHBhcmVudCwgbm90IHRoZSBjaGlsZCwgd2hpY2ggaXMgd2hlcmUgd2UgcHVzaFxuICAvLyB0aGUgb3RoZXIgY29udGV4dCB2YWx1ZXMuXG4gIC8vXG4gIC8vIEluIHRoZSBGaXp6IGltcGxlbWVudGF0aW9uIHRoaXMgaXMgbXVjaCBzaW1wbGVyIGJlY2F1c2UgdGhlIGNoaWxkIGlzXG4gIC8vIHJlbmRlcmVkIGluIHRoZSBzYW1lIGNhbGxzdGFjayBhcyB0aGUgcGFyZW50LlxuICAvL1xuICAvLyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8ganVzdCBhZGQgYSBgZm9ya3NgIGZpZWxkIHRvIHRoZSBGaWJlciB0eXBlLiBJdCB3b3VsZFxuICAvLyBtYWtlIHRoaXMgbW9kdWxlIHNpbXBsZXIuXG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya0NvdW50O1xuICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya1Byb3ZpZGVyO1xuICB0cmVlRm9ya1Byb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIHRyZWVGb3JrQ291bnQgPSB0b3RhbENoaWxkcmVuO1xufVxuZnVuY3Rpb24gcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbiwgaW5kZXgpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgdmFyIGJhc2VPdmVyZmxvdyA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7IC8vIFRoZSBsZWZ0bW9zdCAxIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLCBub24taW5jbHVzaXZlLiBJdCdzIG5vdCBwYXJ0XG4gIC8vIG9mIHRoZSBpZDsgd2UgdXNlIGl0IHRvIGFjY291bnQgZm9yIGxlYWRpbmcgMHMuXG5cbiAgdmFyIGJhc2VMZW5ndGggPSBnZXRCaXRMZW5ndGgoYmFzZUlkV2l0aExlYWRpbmdCaXQpIC0gMTtcbiAgdmFyIGJhc2VJZCA9IGJhc2VJZFdpdGhMZWFkaW5nQml0ICYgfigxIDw8IGJhc2VMZW5ndGgpO1xuICB2YXIgc2xvdCA9IGluZGV4ICsgMTtcbiAgdmFyIGxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIGJhc2VMZW5ndGg7IC8vIDMwIGlzIHRoZSBtYXggbGVuZ3RoIHdlIGNhbiBzdG9yZSB3aXRob3V0IG92ZXJmbG93aW5nLCB0YWtpbmcgaW50b1xuICAvLyBjb25zaWRlcmF0aW9uIHRoZSBsZWFkaW5nIDEgd2UgdXNlIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuXG5cbiAgaWYgKGxlbmd0aCA+IDMwKSB7XG4gICAgLy8gV2Ugb3ZlcmZsb3dlZCB0aGUgYml0d2lzZS1zYWZlIHJhbmdlLiBGYWxsIGJhY2sgdG8gc2xvd2VyIGFsZ29yaXRobS5cbiAgICAvLyBUaGlzIGJyYW5jaCBhc3N1bWVzIHRoZSBsZW5ndGggb2YgdGhlIGJhc2UgaWQgaXMgZ3JlYXRlciB0aGFuIDU7IGl0IHdvbid0XG4gICAgLy8gd29yayBmb3Igc21hbGxlciBpZHMsIGJlY2F1c2UgeW91IG5lZWQgNSBiaXRzIHBlciBjaGFyYWN0ZXIuXG4gICAgLy9cbiAgICAvLyBXZSBlbmNvZGUgdGhlIGlkIGluIG11bHRpcGxlIHN0ZXBzOiBmaXJzdCB0aGUgYmFzZSBpZCwgdGhlbiB0aGVcbiAgICAvLyByZW1haW5pbmcgZGlnaXRzLlxuICAgIC8vXG4gICAgLy8gRWFjaCA1IGJpdCBzZXF1ZW5jZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiYXNlIDMyIGNoYXJhY3Rlci4gU28gZm9yXG4gICAgLy8gZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgaWQgaXMgMjMgYml0cyBsb25nLCB3ZSBjYW4gY29udmVydCAyMCBvZiB0aG9zZVxuICAgIC8vIGJpdHMgaW50byBhIHN0cmluZyBvZiA0IGNoYXJhY3RlcnMsIHdpdGggMyBiaXRzIGxlZnQgb3Zlci5cbiAgICAvL1xuICAgIC8vIEZpcnN0IGNhbGN1bGF0ZSBob3cgbWFueSBiaXRzIGluIHRoZSBiYXNlIGlkIHJlcHJlc2VudCBhIGNvbXBsZXRlXG4gICAgLy8gc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy5cbiAgICB2YXIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gYmFzZUxlbmd0aCAlIDU7IC8vIFRoZW4gY3JlYXRlIGEgYml0bWFzayB0aGF0IHNlbGVjdHMgb25seSB0aG9zZSBiaXRzLlxuXG4gICAgdmFyIG5ld092ZXJmbG93Qml0cyA9ICgxIDw8IG51bWJlck9mT3ZlcmZsb3dCaXRzKSAtIDE7IC8vIFNlbGVjdCB0aGUgYml0cywgYW5kIGNvbnZlcnQgdGhlbSB0byBhIGJhc2UgMzIgc3RyaW5nLlxuXG4gICAgdmFyIG5ld092ZXJmbG93ID0gKGJhc2VJZCAmIG5ld092ZXJmbG93Qml0cykudG9TdHJpbmcoMzIpOyAvLyBOb3cgd2UgY2FuIHJlbW92ZSB0aG9zZSBiaXRzIGZyb20gdGhlIGJhc2UgaWQuXG5cbiAgICB2YXIgcmVzdE9mQmFzZUlkID0gYmFzZUlkID4+IG51bWJlck9mT3ZlcmZsb3dCaXRzO1xuICAgIHZhciByZXN0T2ZCYXNlTGVuZ3RoID0gYmFzZUxlbmd0aCAtIG51bWJlck9mT3ZlcmZsb3dCaXRzOyAvLyBGaW5hbGx5LCBlbmNvZGUgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgdXNpbmcgdGhlIG5vcm1hbCBhbGdvcml0aG0uIEJlY2F1c2VcbiAgICAvLyB3ZSBtYWRlIG1vcmUgcm9vbSwgdGhpcyB0aW1lIGl0IHdvbid0IG92ZXJmbG93LlxuXG4gICAgdmFyIHJlc3RPZkxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIHJlc3RPZk5ld0JpdHMgPSBzbG90IDw8IHJlc3RPZkJhc2VMZW5ndGg7XG4gICAgdmFyIGlkID0gcmVzdE9mTmV3Qml0cyB8IHJlc3RPZkJhc2VJZDtcbiAgICB2YXIgb3ZlcmZsb3cgPSBuZXdPdmVyZmxvdyArIGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCByZXN0T2ZMZW5ndGggfCBpZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gIH0gZWxzZSB7XG4gICAgLy8gTm9ybWFsIHBhdGhcbiAgICB2YXIgbmV3Qml0cyA9IHNsb3QgPDwgYmFzZUxlbmd0aDtcblxuICAgIHZhciBfaWQgPSBuZXdCaXRzIHwgYmFzZUlkO1xuXG4gICAgdmFyIF9vdmVyZmxvdyA9IGJhc2VPdmVyZmxvdztcbiAgICB0cmVlQ29udGV4dElkID0gMSA8PCBsZW5ndGggfCBfaWQ7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IF9vdmVyZmxvdztcbiAgfVxufVxuZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsgLy8gVGhpcyBjb21wb25lbnQgbWF0ZXJpYWxpemVkIGFuIGlkLiBUaGlzIHdpbGwgYWZmZWN0IGFueSBpZHMgdGhhdCBhcHBlYXJcbiAgLy8gaW4gaXRzIGNoaWxkcmVuLlxuXG4gIHZhciByZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IDE7XG4gICAgdmFyIHNsb3RJbmRleCA9IDA7XG4gICAgcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzKTtcbiAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJpdExlbmd0aChudW1iZXIpIHtcbiAgcmV0dXJuIDMyIC0gY2x6MzIobnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVhZGluZ0JpdChpZCkge1xuICByZXR1cm4gMSA8PCBnZXRCaXRMZW5ndGgoaWQpIC0gMTtcbn1cblxuZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgdmFsdWVzLlxuICAvLyBUaGlzIGlzIGEgYml0IG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBvdGhlciBjb250ZXh0LWxpa2UgbW9kdWxlcyBpbiBGaWJlclxuICAvLyBiZWNhdXNlIHRoZSBzYW1lIEZpYmVyIG1heSBhcHBlYXIgb24gdGhlIHN0YWNrIG11bHRpcGxlIHRpbWVzIGFuZCBmb3JcbiAgLy8gZGlmZmVyZW50IHJlYXNvbnMuIFdlIGhhdmUgdG8ga2VlcCBwb3BwaW5nIHVudGlsIHRoZSB3b3JrLWluLXByb2dyZXNzIGlzXG4gIC8vIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlRm9ya1Byb3ZpZGVyKSB7XG4gICAgdHJlZUZvcmtQcm92aWRlciA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XTtcbiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlRm9ya0NvdW50ID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICB9XG5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgdHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gICAgdHJlZUNvbnRleHRJZCA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdO1xuICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcblxuICBpZiAodHJlZUNvbnRleHRQcm92aWRlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdHJlZUNvbnRleHRJZCxcbiAgICAgIG92ZXJmbG93OiB0cmVlQ29udGV4dE92ZXJmbG93XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5kZWRDb250ZXh0KSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICB0cmVlQ29udGV4dElkID0gc3VzcGVuZGVkQ29udGV4dC5pZDtcbiAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IHN1c3BlbmRlZENvbnRleHQub3ZlcmZsb3c7XG4gIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gd2FybklmTm90SHlkcmF0aW5nKCkge1xuICB7XG4gICAgaWYgKCFnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gYmUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSAnICsgJ2FuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIG1heSBoYXZlIGJlZW4gYW4gaW5zZXJ0aW9uIG9yIGEgaHlkcmF0aW9uLlxuXG52YXIgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsO1xudmFyIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzSHlkcmF0aW5nID0gZmFsc2U7IC8vIFRoaXMgZmxhZyBhbGxvd3MgZm9yIHdhcm5pbmcgc3VwcmVzc2lvbiB3aGVuIHdlIGV4cGVjdCB0aGVyZSB0byBiZSBtaXNtYXRjaGVzXG4vLyBkdWUgdG8gZWFybGllciBtaXNtYXRjaGVzIG9yIGEgc3VzcGVuZGVkIGZpYmVyLlxuXG52YXIgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTsgLy8gSHlkcmF0aW9uIGVycm9ycyB0aGF0IHdlcmUgdGhyb3duIGluc2lkZSB0aGlzIGJvdW5kYXJ5XG5cbnZhciBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuXG5mdW5jdGlvbiB3YXJuSWZIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgIGVycm9yKCdXZSBzaG91bGQgbm90IGJlIGh5ZHJhdGluZyBoZXJlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhIGJ1Zy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IHRydWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZFN1c3BlbmRPckVycm9yV2hpbGVIeWRyYXRpbmdERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIsIHN1c3BlbnNlSW5zdGFuY2UsIHRyZWVDb250ZXh0KSB7XG5cbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTtcbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xuXG4gIGlmICh0cmVlQ29udGV4dCAhPT0gbnVsbCkge1xuICAgIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dChmaWJlciwgdHJlZUNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihyZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbywgaW5zdGFuY2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICBkaWROb3RIeWRyYXRlSW5zdGFuY2UocmV0dXJuRmliZXIudHlwZSwgcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcywgcmV0dXJuRmliZXIuc3RhdGVOb2RlLCBpbnN0YW5jZSwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkge1xuICB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSk7XG4gIHZhciBjaGlsZFRvRGVsZXRlID0gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKTtcbiAgY2hpbGRUb0RlbGV0ZS5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgY2hpbGRUb0RlbGV0ZS5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7XG4gICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JERVYpIHtcbiAgICAgIC8vIEluc2lkZSBhIGJvdW5kYXJ5IHRoYXQgYWxyZWFkeSBzdXNwZW5kZWQuIFdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgdGhlXG4gICAgICAvLyBzaWJsaW5ncyBvZiBhIHN1c3BlbmRlZCBub2RlLiBUaGUgbWlzbWF0Y2ggbWF5IGJlIGR1ZSB0byB0aGUgbWlzc2luZ1xuICAgICAgLy8gZGF0YSwgc28gaXQncyBwcm9iYWJseSBhIGZhbHNlIHBvc2l0aXZlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCB0eXBlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF90eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgX3Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3R5cGUsIF9wcm9wcywgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFyIF90ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcblxuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgX3BhcmVudEluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgICAgICAgIGlmIChfcGFyZW50SW5zdGFuY2UgIT09IG51bGwpIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZTIgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICB2YXIgX3Byb3BzMiA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdHlwZTIpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIF90ZXh0MiA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3RleHQyKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAgZmliZXIuZmxhZ3MgPSBmaWJlci5mbGFncyAmIH5IeWRyYXRpbmcgfCBQbGFjZW1lbnQ7XG4gIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICB2YXIgcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGNhbkh5ZHJhdGVJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHR5cGUpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKGluc3RhbmNlKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsgLy8gVGV4dCBJbnN0YW5jZXMgZG9uJ3QgaGF2ZSBjaGlsZHJlbiBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gaHlkcmF0ZS5cblxuICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShuZXh0SW5zdGFuY2UpO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB7XG4gICAgICAgICAgICBkZWh5ZHJhdGVkOiBzdXNwZW5zZUluc3RhbmNlLFxuICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICByZXRyeUxhbmU6IE9mZnNjcmVlbkxhbmVcbiAgICAgICAgICB9O1xuICAgICAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBzdXNwZW5zZVN0YXRlOyAvLyBTdG9yZSB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudCBhcyBhIGNoaWxkIGZpYmVyLlxuICAgICAgICAgIC8vIFRoaXMgc2ltcGxpZmllcyB0aGUgY29kZSBmb3IgZ2V0SG9zdFNpYmxpbmcgYW5kIGRlbGV0aW5nIG5vZGVzLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSB0byBjb25zaWRlciBhbGwgU3VzcGVuc2UgYm91bmRhcmllcyBhbmRcbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGV5J3JlIGRlaHlkcmF0ZWQgb25lcyBvciBub3QuXG5cbiAgICAgICAgICB2YXIgZGVoeWRyYXRlZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICAgIGRlaHlkcmF0ZWRGcmFnbWVudC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgICAgICBmaWJlci5jaGlsZCA9IGRlaHlkcmF0ZWRGcmFnbWVudDtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBXaGlsZSBhIFN1c3BlbnNlIEluc3RhbmNlIGRvZXMgaGF2ZSBjaGlsZHJlbiwgd2Ugd29uJ3Qgc3RlcCBpbnRvXG4gICAgICAgICAgLy8gaXQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJbnN0ZWFkLCB3ZSdsbCByZWVudGVyIGl0IGxhdGVyLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpIHtcbiAgcmV0dXJuIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKGZpYmVyLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3M7XG59XG5cbmZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0h5ZHJhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgaW5pdGlhbCBVSSBkb2VzIG5vdCBtYXRjaCB3aGF0IHdhcyAnICsgJ3JlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIuJyk7XG59XG5cbmZ1bmN0aW9uIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyKSB7XG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICBpZiAoIW5leHRJbnN0YW5jZSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cblxuXG4gICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTtcblxuICBpZiAoIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICB9IC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG5cblxuICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgICB2YXIgcHJldkh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAoIW5leHRJbnN0YW5jZSB8fCAhdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICAgIGluc2VydE5vbkh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhc1xuICAgIC8vIHN1cGVyZmx1b3VzIGFuZCB3ZSdsbCBkZWxldGUgaXQuIFNpbmNlIHdlIGNhbid0IGVhZ2VybHkgZGVsZXRlIGl0XG4gICAgLy8gd2UnbGwgaGF2ZSB0byBzY2hlZHVsZSBhIGRlbGV0aW9uLiBUbyBkbyB0aGF0LCB0aGlzIG5vZGUgbmVlZHMgYSBkdW1teVxuICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKHByZXZIeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFdhcm5JZk1pc21hdGNoRGV2ID0gIWRpZFN1c3BlbmRPckVycm9yREVWO1xuICB2YXIgdXBkYXRlUGF5bG9hZCA9IGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgZmliZXIsIHNob3VsZFdhcm5JZk1pc21hdGNoRGV2KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgLy8gaHlkcmF0aW9uIHBhcmVudCBpcyB0aGUgcGFyZW50IGhvc3QgY29tcG9uZW50IG9mIHRoaXMgaG9zdCB0ZXh0LlxuICAgIHZhciByZXR1cm5GaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuXG4gICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIHZhciBfaXNDb25jdXJyZW50TW9kZTIgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgIF9pc0NvbmN1cnJlbnRNb2RlMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKGZpYmVyKSB7XG5cbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsO1xuXG4gIGlmICghc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCAmJiBwYXJlbnQudGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHBhcmVudC50YWcgIT09IEhvc3RSb290ICYmIHBhcmVudC50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gcGFyZW50O1xufVxuXG5mdW5jdGlvbiBwb3BIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIGlmIChmaWJlciAhPT0gaHlkcmF0aW9uUGFyZW50RmliZXIpIHtcbiAgICAvLyBXZSdyZSBkZWVwZXIgdGhhbiB0aGUgY3VycmVudCBoeWRyYXRpb24gY29udGV4dCwgaW5zaWRlIGFuIGluc2VydGVkXG4gICAgLy8gdHJlZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgLy8gSWYgd2UncmUgbm90IGN1cnJlbnRseSBoeWRyYXRpbmcgYnV0IHdlJ3JlIGluIGEgaHlkcmF0aW9uIGNvbnRleHQsIHRoZW5cbiAgICAvLyB3ZSB3ZXJlIGFuIGluc2VydGlvbiBhbmQgbm93IG5lZWQgdG8gcG9wIHVwIHJlZW50ZXIgaHlkcmF0aW9uIG9mIG91clxuICAgIC8vIHNpYmxpbmdzLlxuICAgIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS4gV2UgYWxzbyBkb24ndCBkZWxldGUgYW55dGhpbmcgaW5zaWRlIHRoZSByb290IGNvbnRhaW5lci5cblxuXG4gIGlmIChmaWJlci50YWcgIT09IEhvc3RSb290ICYmIChmaWJlci50YWcgIT09IEhvc3RDb21wb25lbnQgfHwgc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMoZmliZXIudHlwZSkgJiYgIXNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSkge1xuICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gICAgaWYgKG5leHRJbnN0YW5jZSkge1xuICAgICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpO1xuICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHtcbiAgICAgICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICAgICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nICYmIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpIHtcbiAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5leHRJbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpIHtcbiAgaWYgKGh5ZHJhdGlvbkVycm9ycyAhPT0gbnVsbCkge1xuICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSBmb3JjZWQgY2xpZW50IHJlbmRlci4gVGhlIGVycm9ycyB0aGF0IG9jY3VycmVkXG4gICAgLy8gZHVyaW5nIHRoZSBoeWRyYXRpb24gYXR0ZW1wdCBhcmUgbm93IHJlY292ZXJlZC4gV2Ugd2lsbCBsb2cgdGhlbSBpblxuICAgIC8vIGNvbW1pdCBwaGFzZSwgb25jZSB0aGUgZW50aXJlIHRyZWUgaGFzIGZpbmlzaGVkLlxuICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoaHlkcmF0aW9uRXJyb3JzKTtcbiAgICBoeWRyYXRpb25FcnJvcnMgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElzSHlkcmF0aW5nKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmc7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZXJyb3IpIHtcbiAgaWYgKGh5ZHJhdGlvbkVycm9ycyA9PT0gbnVsbCkge1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IFtlcnJvcl07XG4gIH0gZWxzZSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgTm9UcmFuc2l0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpIHtcbiAgcmV0dXJuIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbn1cblxudmFyIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzID0ge1xuICByZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5nczogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fSxcbiAgcmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LFxuICBmbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nOiBmdW5jdGlvbiAoKSB7fSxcbiAgZGlzY2FyZFBlbmRpbmdXYXJuaW5nczogZnVuY3Rpb24gKCkge31cbn07XG5cbntcbiAgdmFyIGZpbmRTdHJpY3RSb290ID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgdmFyIG1heWJlU3RyaWN0Um9vdCA9IG51bGw7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBtYXliZVN0cmljdFJvb3QgPSBub2RlO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heWJlU3RyaWN0Um9vdDtcbiAgfTtcblxuICB2YXIgc2V0VG9Tb3J0ZWRTdHJpbmcgPSBmdW5jdGlvbiAoc2V0KSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBhcnJheS5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYXJyYXkuc29ydCgpLmpvaW4oJywgJyk7XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgdmFyIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgLy8gRGVkdXBlIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAgICBpZiAoZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBEb24ndCB3YXJuIGFib3V0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cy5cbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIGRvIGFuIGluaXRpYWwgcGFzcyB0byBnYXRoZXIgY29tcG9uZW50IG5hbWVzXG4gICAgdmFyIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9IC8vIEZpbmFsbHksIHdlIGZsdXNoIGFsbCB0aGUgd2FybmluZ3NcbiAgICAvLyBVTlNBRkVfIG9uZXMgYmVmb3JlIHRoZSBkZXByZWNhdGVkIG9uZXMsIHNpbmNlIHRoZXknbGwgYmUgJ2xvdWRlcidcblxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIHNvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIFwiICsgJ3JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMyID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMik7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMyA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbE1vdW50IGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbE1vdW50IHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczMpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM0ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyIFwiICsgJ2NvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM0KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNSA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxVcGRhdGUgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFVwZGF0ZSB0byBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7IC8vIFRyYWNrcyBjb21wb25lbnRzIHdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQuXG5cbiAgdmFyIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQgPSBuZXcgU2V0KCk7XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7XG4gICAgdmFyIHN0cmljdFJvb3QgPSBmaW5kU3RyaWN0Um9vdChmaWJlcik7XG5cbiAgICBpZiAoc3RyaWN0Um9vdCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBTdHJpY3RNb2RlIGNvbXBvbmVudCBpbiBhIHN0cmljdCBtb2RlIHRyZWUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRGVkdXAgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuXG5cbiAgICBpZiAoZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5oYXMoZmliZXIudHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2FybmluZ3NGb3JSb290ID0gcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmdldChzdHJpY3RSb290KTtcblxuICAgIGlmIChmaWJlci50eXBlLmNvbnRleHRUeXBlcyAhPSBudWxsIHx8IGZpYmVyLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAod2FybmluZ3NGb3JSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2FybmluZ3NGb3JSb290ID0gW107XG4gICAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5zZXQoc3RyaWN0Um9vdCwgd2FybmluZ3NGb3JSb290KTtcbiAgICAgIH1cblxuICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7XG4gICAgICBpZiAoZmliZXJBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF07XG4gICAgICB2YXIgdW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzO1xudmFyIGRpZFdhcm5BYm91dEdlbmVyYXRvcnM7XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmc7XG52YXIgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nO1xuXG52YXIgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7fTtcblxue1xuICBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xuICAvKipcbiAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICAgKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAgICogdXBkYXRlcy5cbiAgICovXG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZyA9IHt9O1xuXG4gIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge1xuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZC5fc3RvcmUgfHwgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCB8fCBjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2hpbGQuX3N0b3JlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBDb21wb25lbnQgaW4gd2FybkZvck1pc3NpbmdLZXkgc2hvdWxkIGhhdmUgYSBfc3RvcmUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjaGlsZC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3RDbGFzcyh0eXBlKSB7XG4gIHJldHVybiB0eXBlLnByb3RvdHlwZSAmJiB0eXBlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikgJiYgLy8gV2lsbCBhbHJlYWR5IHRocm93IHdpdGggXCJGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzXCJcbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkgJiYgLy8gV2lsbCBhbHJlYWR5IHdhcm4gd2l0aCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnNcIlxuICAgICAgISh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnZnVuY3Rpb24nICYmICFpc1JlYWN0Q2xhc3MoZWxlbWVudC50eXBlKSkgJiYgLy8gV2lsbCBhbHJlYWR5IHRocm93IHdpdGggXCJFbGVtZW50IHJlZiB3YXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChzb21lU3RyaW5nUmVmKSBidXQgbm8gb3duZXIgd2FzIHNldFwiXG4gICAgICBlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgJyArICd3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gV2UgcmVjb21tZW5kIHVzaW5nICcgKyAndXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBtaXhlZFJlZik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIGluc3Q7XG5cbiAgICAgIGlmIChvd25lcikge1xuICAgICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuXG4gICAgICAgIGlmIChvd25lckZpYmVyLnRhZyAhPT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG93bmVyIGZvciBzdHJpbmcgcmVmIFwiICsgbWl4ZWRSZWYgKyBcIi4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgXCIgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH0gLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdCBzbyBGbG93IGtub3dzIGl0IHdvbid0IGNoYW5nZSBpbiB0aGUgY2xvc3VyZVxuXG5cbiAgICAgIHZhciByZXNvbHZlZEluc3QgPSBpbnN0O1xuXG4gICAgICB7XG4gICAgICAgIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKG1peGVkUmVmLCAncmVmJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdHJpbmdSZWYgPSAnJyArIG1peGVkUmVmOyAvLyBDaGVjayBpZiBwcmV2aW91cyBzdHJpbmcgcmVmIG1hdGNoZXMgbmV3IHN0cmluZyByZWZcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IG51bGwgJiYgdHlwZW9mIGN1cnJlbnQucmVmID09PSAnZnVuY3Rpb24nICYmIGN1cnJlbnQucmVmLl9zdHJpbmdSZWYgPT09IHN0cmluZ1JlZikge1xuICAgICAgICByZXR1cm4gY3VycmVudC5yZWY7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWYgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlZnMgPSByZXNvbHZlZEluc3QucmVmcztcblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgcmVmc1tzdHJpbmdSZWZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZWYuX3N0cmluZ1JlZiA9IHN0cmluZ1JlZjtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4ZWRSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZlwiICsgJyB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbicgKyBcIjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIHJlbmRlciBtZXRob2RcXG5cIiArICczLiBZb3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlZnMtbXVzdC1oYXZlLW93bmVyIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZFN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eShsYXp5VHlwZSkge1xuICB2YXIgcGF5bG9hZCA9IGxhenlUeXBlLl9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0O1xuICByZXR1cm4gaW5pdChwYXlsb2FkKTtcbn0gLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cblxuXG5mdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICBmdW5jdGlvbiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIHVzZUlkIGFsZ29yaXRobSBuZWVkcyB0byBrbm93IHdoaWNoIGZpYmVycyBhcmVcbiAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBGb3JrZWQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRJbmRleCA9IGN1cnJlbnQuaW5kZXg7XG5cbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGaWJlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50LCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkge1xuICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4XG4gICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpO1xuICAgICAgICBleGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICB9XG4gICAgfSAvLyBJbnNlcnRcblxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBmcmFnbWVudCwgbGFuZXMsIGtleSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZyYWdtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX2NyZWF0ZWQzID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBudWxsKTtcblxuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGZpYmVyIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLCBzbyB3ZSBuZWl0aGVyIGhhdmUgdG8gY2hlY2sgdGhlIG9sZCBub3JcbiAgICAgIC8vIG5ldyBub2RlIGZvciB0aGUga2V5LiBJZiBib3RoIGFyZSB0ZXh0IG5vZGVzLCB0aGV5IG1hdGNoLlxuICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgbWF0Y2hlZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGNoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHdhcm5Gb3JNaXNzaW5nS2V5KGNoaWxkLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcblxuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtub3duS2V5cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAga25vd25LZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCBcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gY2hpbGQuX2luaXQ7XG4gICAgICAgICAgd2Fybk9uSW52YWxpZEtleShpbml0KHBheWxvYWQpLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga25vd25LZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykge1xuICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNhbid0IG9wdGltaXplIGJ5IHNlYXJjaGluZyBmcm9tIGJvdGggZW5kcyBzaW5jZSB3ZVxuICAgIC8vIGRvbid0IGhhdmUgYmFja3BvaW50ZXJzIG9uIGZpYmVycy4gSSdtIHRyeWluZyB0byBzZWUgaG93IGZhciB3ZSBjYW4gZ2V0XG4gICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW5cbiAgICAvLyBhZGQgaXQgbGF0ZXIuXG4gICAgLy8gRXZlbiB3aXRoIGEgdHdvIGVuZGVkIG9wdGltaXphdGlvbiwgd2UnZCB3YW50IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZVxuICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZlxuICAgIC8vIGdvaW5nIGZvciB0aGUgTWFwLiBJdCdkIGxpa2UgdG8gZXhwbG9yZSBoaXR0aW5nIHRoYXQgcGF0aCBmaXJzdCBpblxuICAgIC8vIGZvcndhcmQtb25seSBtb2RlIGFuZCBvbmx5IGdvIGZvciB0aGUgTWFwIG9uY2Ugd2Ugbm90aWNlIHRoYXQgd2UgbmVlZFxuICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZFxuICAgIC8vIHNlYXJjaCBidXQgdGhhdCdzIHVudXN1YWwuIEJlc2lkZXMsIGZvciB0aGUgdHdvIGVuZGVkIG9wdGltaXphdGlvbiB0b1xuICAgIC8vIHdvcmsgb24gSXRlcmFibGVzLCB3ZSdkIG5lZWQgdG8gY29weSB0aGUgd2hvbGUgc2V0LlxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlLCBhbHNvIHVwZGF0ZSByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKCkgd2hpY2hcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS5cbiAgICB7XG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgICB2YXIgX25ld0ZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgdmFyIF9uZXdGaWJlcjIgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyMi5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyByZWNvbmNpbGVDaGlsZHJlbkFycmF5KCksXG4gICAgLy8gYnV0IHVzaW5nIHRoZSBpdGVyYXRvciBpbnN0ZWFkLlxuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IHRvU3RyaW5nVGFnXG4gICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0R2VuZXJhdG9ycykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBHZW5lcmF0b3JzIGFzIGNoaWxkcmVuIGlzIHVuc3VwcG9ydGVkIGFuZCB3aWxsIGxpa2VseSB5aWVsZCAnICsgJ3VuZXhwZWN0ZWQgcmVzdWx0cyBiZWNhdXNlIGVudW1lcmF0aW5nIGEgZ2VuZXJhdG9yIG11dGF0ZXMgaXQuICcgKyAnWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlICcgKyAnYFsuLi5zcHJlYWRdYCBvcGVyYXRvciBiZWZvcmUgcmVuZGVyaW5nLiBLZWVwIGluIG1pbmQgJyArICd5b3UgbWlnaHQgbmVlZCB0byBwb2x5ZmlsbCB0aGVzZSBmZWF0dXJlcyBmb3Igb2xkZXIgYnJvd3NlcnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTtcbiAgICAgIH0gLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG5cblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgIH0gLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICAvLyBXZSdsbCBnZXQgYSBkaWZmZXJlbnQgaXRlcmF0b3IgbGF0ZXIgZm9yIHRoZSBtYWluIHBhc3MuXG5cblxuICAgICAgdmFyIF9uZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgICAgaWYgKF9uZXdDaGlsZHJlbikge1xuICAgICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgICAgIGZvciAoOyAhX3N0ZXAuZG9uZTsgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczMgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIHZhciBfbmV3RmliZXI0ID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjQuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3M0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBrZXlzIG9uIHRleHQgbm9kZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gd2F5IHRvIGRlZmluZSB0aGVtLlxuICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSBzbyBsZXQncyBqdXN0IHVwZGF0ZSBpdCBhbmQgZGVsZXRlXG4gICAgICAvLyB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9IC8vIFRoZSBleGlzdGluZyBmaXJzdCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGUgc28gd2UgbmVlZCB0byBjcmVhdGUgb25lXG4gICAgLy8gYW5kIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lcy5cblxuXG4gICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7XG5cbiAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIF9leGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBub24tcmVjdXJzaXZlLlxuXG4gICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gICAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhjaGlsZCwgbGFuZXMpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG52YXIgcmVuZGVyZXJTaWdpbDtcblxue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbnZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG5mdW5jdGlvbiByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuXG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUHJvdmlkZXIocHJvdmlkZXJGaWJlciwgY29udGV4dCwgbmV4dFZhbHVlKSB7XG4gIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSByZW5kZXJlclNpZ2lsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikge1xuICB2YXIgY3VycmVudFZhbHVlID0gdmFsdWVDdXJzb3IuY3VycmVudDtcbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSAgY29udGV4dC5fY3VycmVudFZhbHVlIDtcblxuICBpZiAobGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID09PSBjb250ZXh0KSA7IGVsc2Uge1xuICAgIHZhciBjb250ZXh0SXRlbSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBtZW1vaXplZFZhbHVlOiB2YWx1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC5cblxuXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjb250ZXh0SXRlbTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGZpcnN0Q29udGV4dDogY29udGV4dEl0ZW1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzXG4vLyBpbnRlcnJ1cHRlZCwgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBvbnRvIHRoZSBtYWluIHBhcnRcbi8vIG9mIHRoZSBxdWV1ZS5cblxudmFyIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuZnVuY3Rpb24gcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSkge1xuICBpZiAoY29uY3VycmVudFF1ZXVlcyA9PT0gbnVsbCkge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBbcXVldWVdO1xuICB9IGVsc2Uge1xuICAgIGNvbmN1cnJlbnRRdWV1ZXMucHVzaChxdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKSB7XG4gIC8vIFRyYW5zZmVyIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIG9udG8gdGhlIG1haW4gcXVldWUuIEVhY2ggcXVldWUgaGFzIGFcbiAgLy8gYHBlbmRpbmdgIGZpZWxkIGFuZCBhbiBgaW50ZXJsZWF2ZWRgIGZpZWxkLiBXaGVuIHRoZXkgYXJlIG5vdCBudWxsLCB0aGV5XG4gIC8vIHBvaW50IHRvIHRoZSBsYXN0IG5vZGUgaW4gYSBjaXJjdWxhciBsaW5rZWQgbGlzdC4gV2UgbmVlZCB0byBhcHBlbmQgdGhlXG4gIC8vIGludGVybGVhdmVkIGxpc3QgdG8gdGhlIGVuZCBvZiB0aGUgcGVuZGluZyBsaXN0IGJ5IGpvaW5pbmcgdGhlbSBpbnRvIGFcbiAgLy8gc2luZ2xlLCBjaXJjdWxhciBsaXN0LlxuICBpZiAoY29uY3VycmVudFF1ZXVlcyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uY3VycmVudFF1ZXVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlID0gY29uY3VycmVudFF1ZXVlc1tpXTtcbiAgICAgIHZhciBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICAgICAgaWYgKGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5pbnRlcmxlYXZlZCA9IG51bGw7XG4gICAgICAgIHZhciBmaXJzdEludGVybGVhdmVkVXBkYXRlID0gbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQ7XG4gICAgICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKGxhc3RQZW5kaW5nVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICAgICAgbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbGFzdEludGVybGVhdmVkVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmN1cnJlbnRRdWV1ZXMgPSBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlOyAvLyBBdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJlbmRlciwgdGhpcyBxdWV1ZSdzIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbFxuICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlLm5leHQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudENsYXNzVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciBpbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgIHB1c2hDb25jdXJyZW50VXBkYXRlUXVldWUocXVldWUpO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICB9XG5cbiAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpIHtcbiAgcmV0dXJuIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcbn0gLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYmFja3dhcmRzXG4vLyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYWx3YXlzIGJlIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZy5cblxudmFyIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290O1xuXG5mdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgbGFuZSkge1xuICAvLyBVcGRhdGUgdGhlIHNvdXJjZSBmaWJlcidzIGxhbmVzXG4gIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgbGFuZSk7XG4gIHZhciBhbHRlcm5hdGUgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCBsYW5lKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsICYmIChzb3VyY2VGaWJlci5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgfVxuICB9IC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGxhbmVzLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudmFyIFVwZGF0ZVN0YXRlID0gMDtcbnZhciBSZXBsYWNlU3RhdGUgPSAxO1xudmFyIEZvcmNlVXBkYXRlID0gMjtcbnZhciBDYXB0dXJlVXBkYXRlID0gMzsgLy8gR2xvYmFsIHN0YXRlIHRoYXQgaXMgcmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLlxuLy8gSXQgc2hvdWxkIG9ubHkgYmUgcmVhZCByaWdodCBhZnRlciBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLCB2aWFcbi8vIGBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nYC5cblxudmFyIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZTtcbnZhciBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWU7XG5cbntcbiAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IGZhbHNlO1xuICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBpbml0aWFsaXplVXBkYXRlUXVldWUoZmliZXIpIHtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIGJhc2VTdGF0ZTogZmliZXIubWVtb2l6ZWRTdGF0ZSxcbiAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgbGFzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgc2hhcmVkOiB7XG4gICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgICBsYW5lczogTm9MYW5lc1xuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBzaGFyZWRRdWV1ZSA9IHVwZGF0ZVF1ZXVlLnNoYXJlZDtcblxuICB7XG4gICAgaWYgKGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9PT0gc2hhcmVkUXVldWUgJiYgIWRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUpIHtcbiAgICAgIGVycm9yKCdBbiB1cGRhdGUgKHNldFN0YXRlLCByZXBsYWNlU3RhdGUsIG9yIGZvcmNlVXBkYXRlKSB3YXMgc2NoZWR1bGVkICcgKyAnZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCAnICsgJ3dpdGggemVybyBzaWRlLWVmZmVjdHMuIENvbnNpZGVyIHVzaW5nIGNvbXBvbmVudERpZFVwZGF0ZSBvciBhICcgKyAnY2FsbGJhY2suJyk7XG5cbiAgICAgIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoKSkge1xuICAgIC8vIFRoaXMgaXMgYW4gdW5zYWZlIHJlbmRlciBwaGFzZSB1cGRhdGUuIEFkZCBkaXJlY3RseSB0byB0aGUgdXBkYXRlXG4gICAgLy8gcXVldWUgc28gd2UgY2FuIHByb2Nlc3MgaXQgaW1tZWRpYXRlbHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7XG5cbiAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlO1xuICAgIH1cblxuICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7IC8vIFVwZGF0ZSB0aGUgY2hpbGRMYW5lcyBldmVuIHRob3VnaCB3ZSdyZSBtb3N0IGxpa2VseSBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIC8vIHRoaXMgZmliZXIuIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIHRoZSBjYXNlIHdoZXJlIHlvdVxuICAgIC8vIHVwZGF0ZSBhIGRpZmZlcmVudCBjb21wb25lbnQgZHVyaW5nIHJlbmRlciBwaGFzZSB0aGFuIHRoZSBvbmUgdGhhdCBpc1xuICAgIC8vIGN1cnJlbnRseSByZW5kZXJpbmdzIChhIHBhdHRlcm4gdGhhdCBpcyBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcpLlxuXG4gICAgcmV0dXJuIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVucXVldWVDb25jdXJyZW50Q2xhc3NVcGRhdGUoZmliZXIsIHNoYXJlZFF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7XG4gICAgdmFyIHF1ZXVlTGFuZXMgPSBzaGFyZWRRdWV1ZS5sYW5lczsgLy8gSWYgYW55IGVudGFuZ2xlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIHBlbmRpbmcgb24gdGhlIHJvb3QsIHRoZW4gdGhleSBtdXN0XG4gICAgLy8gaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2ggcmVwcmVzZW50c1xuICAgIC8vIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVudGFuZ2xlXG4gICAgLy8gbW9yZSB0aGFuIHdlIG5lZWQgdG8sIGJ1dCB0aGF0J3MgT0suIEluIGZhY3QgaXQncyB3b3JzZSBpZiB3ZSAqZG9uJ3QqXG4gICAgLy8gZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuXG5cbiAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLlxuXG4gICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpO1xuICAgIHNoYXJlZFF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZlxuICAgIC8vIHRoZSBsYW5lIGZpbmlzaGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZW50YW5nbGVkIGl0LiBTbyB3ZSBuZWVkIHRvXG4gICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS5cblxuICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgICAgIH0gLy8gU3RhdGUgb2JqZWN0XG5cblxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FwdHVyZVVwZGF0ZTpcbiAgICAgIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgIH1cbiAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBVcGRhdGVTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG4gICAgICAgIHZhciBwYXJ0aWFsU3RhdGU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFVwZGF0ZXIgZnVuY3Rpb25cbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhcnRpYWwgc3RhdGUgb2JqZWN0XG4gICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gTnVsbCBhbmQgdW5kZWZpbmVkIGFyZSB0cmVhdGVkIGFzIG5vLW9wcy5cbiAgICAgICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgICAgICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICAgICAgICByZXR1cm4gYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgLy8gSWYgdGhlIHVwZGF0ZSB3YXMgYWxyZWFkeSBjb21taXR0ZWQsIHdlIHNob3VsZCBub3QgcXVldWUgaXRzXG4gICAgICAgIC8vIGNhbGxiYWNrIGFnYWluLlxuICAgICAgICB1cGRhdGUubGFuZSAhPT0gTm9MYW5lKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2FsbGJhY2s7XG4gICAgICAgICAgdmFyIGVmZmVjdHMgPSBxdWV1ZS5lZmZlY3RzO1xuXG4gICAgICAgICAgaWYgKGVmZmVjdHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlLmVmZmVjdHMgPSBbdXBkYXRlXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWZmZWN0cy5wdXNoKHVwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuXG4gICAgICBpZiAodXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gICAgICAgIGlmIChwZW5kaW5nUXVldWUgPT09IG51bGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBmcm9tIGluc2lkZSBhIHJlZHVjZXIuIEFkZCB0aGUgbmV3XG4gICAgICAgICAgLy8gcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIGtlZXAgcHJvY2Vzc2luZy5cbiAgICAgICAgICB2YXIgX2xhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlOyAvLyBJbnRlbnRpb25hbGx5IHVuc291bmQuIFBlbmRpbmcgdXBkYXRlcyBmb3JtIGEgY2lyY3VsYXIgbGlzdCwgYnV0IHdlXG4gICAgICAgICAgLy8gdW5yYXZlbCB0aGVtIHdoZW4gdHJhbnNmZXJyaW5nIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgICAgICAgICB2YXIgX2ZpcnN0UGVuZGluZ1VwZGF0ZSA9IF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgICAgICAgIF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICB1cGRhdGUgPSBfZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gbmV3Rmlyc3RCYXNlVXBkYXRlO1xuICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGU7IC8vIEludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHN0b3JlZCBvbiBhIHNlcGFyYXRlIHF1ZXVlLiBXZSBhcmVuJ3QgZ29pbmcgdG9cbiAgICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAgIC8vIGFyZSByZW1haW5pbmcuXG5cbiAgICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuc2hhcmVkLmludGVybGVhdmVkO1xuXG4gICAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGludGVybGVhdmVkID0gbGFzdEludGVybGVhdmVkO1xuXG4gICAgICBkbyB7XG4gICAgICAgIG5ld0xhbmVzID0gbWVyZ2VMYW5lcyhuZXdMYW5lcywgaW50ZXJsZWF2ZWQubGFuZSk7XG4gICAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpO1xuICAgIH0gZWxzZSBpZiAoZmlyc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgIHF1ZXVlLnNoYXJlZC5sYW5lcyA9IE5vTGFuZXM7XG4gICAgfSAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS5cbiAgICAvLyBUaGlzIHNob3VsZCBiZSBmaW5lIGJlY2F1c2UgdGhlIG9ubHkgdHdvIG90aGVyIHRoaW5ncyB0aGF0IGNvbnRyaWJ1dGUgdG9cbiAgICAvLyBleHBpcmF0aW9uIHRpbWUgYXJlIHByb3BzIGFuZCBjb250ZXh0LiBXZSdyZSBhbHJlYWR5IGluIHRoZSBtaWRkbGUgb2YgdGhlXG4gICAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHlcbiAgICAvLyBkZWFsdCB3aXRoIHRoZSBwcm9wcy4gQ29udGV4dCBpbiBjb21wb25lbnRzIHRoYXQgc3BlY2lmeVxuICAgIC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB0cmlja3k7IGJ1dCB3ZSdsbCBoYXZlIHRvIGFjY291bnQgZm9yXG4gICAgLy8gdGhhdCByZWdhcmRsZXNzLlxuXG5cbiAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKG5ld0xhbmVzKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG5ld0xhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgY29udGV4dCkge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCAnICsgKFwicmVjZWl2ZWQ6IFwiICsgY2FsbGJhY2spKTtcbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBOT19DT05URVhUID0ge307XG52YXIgY29udGV4dFN0YWNrQ3Vyc29yJDEgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG52YXIgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7XG5cbmZ1bmN0aW9uIHJlcXVpcmVkQ29udGV4dChjKSB7XG4gIGlmIChjID09PSBOT19DT05URVhUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyAnICsgJ2luIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBnZXRSb290SG9zdENvbnRhaW5lcigpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgcmV0dXJuIHJvb3RJbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgLy8gUHVzaCBjdXJyZW50IHJvb3QgaW5zdGFuY2Ugb250byB0aGUgc3RhY2s7XG4gIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHJlc2V0IHJvb3Qgd2hlbiBwb3J0YWxzIGFyZSBwb3BwZWQuXG4gIHB1c2gocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIG5leHRSb290SW5zdGFuY2UsIGZpYmVyKTsgLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cbiAgcHVzaChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKTsgLy8gRmluYWxseSwgd2UgbmVlZCB0byBwdXNoIHRoZSBob3N0IGNvbnRleHQgdG8gdGhlIHN0YWNrLlxuICAvLyBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IGNhbGwgZ2V0Um9vdEhvc3RDb250ZXh0KCkgYW5kIHB1c2ggaXQgYmVjYXVzZVxuICAvLyB3ZSdkIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGVudHJpZXMgb24gdGhlIHN0YWNrIGRlcGVuZGluZyBvblxuICAvLyB3aGV0aGVyIGdldFJvb3RIb3N0Q29udGV4dCgpIHRocm93cyBzb21ld2hlcmUgaW4gcmVuZGVyZXIgY29kZSBvciBub3QuXG4gIC8vIFNvIHdlIHB1c2ggYW4gZW1wdHkgdmFsdWUgZmlyc3QuIFRoaXMgbGV0cyB1cyBzYWZlbHkgdW53aW5kIG9uIGVycm9ycy5cblxuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBOT19DT05URVhULCBmaWJlcik7XG4gIHZhciBuZXh0Um9vdENvbnRleHQgPSBnZXRSb290SG9zdENvbnRleHQobmV4dFJvb3RJbnN0YW5jZSk7IC8vIE5vdyB0aGF0IHdlIGtub3cgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHRocm93LCByZXBsYWNlIGl0LlxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRIb3N0Q29udGV4dCgpIHtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdENvbnRleHQoZmliZXIpIHtcbiAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7XG4gIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHQoY29udGV4dCwgZmliZXIudHlwZSk7IC8vIERvbid0IHB1c2ggdGhpcyBGaWJlcidzIGNvbnRleHQgdW5sZXNzIGl0J3MgdW5pcXVlLlxuXG4gIGlmIChjb250ZXh0ID09PSBuZXh0Q29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuXG4gIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy5cblxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC5cbiAgLy8gcHVzaEhvc3RDb250ZXh0KCkgb25seSBwdXNoZXMgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG4gIGlmIChjb250ZXh0RmliZXJTdGFja0N1cnNvci5jdXJyZW50ICE9PSBmaWJlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHBvcChjb250ZXh0U3RhY2tDdXJzb3IkMSwgZmliZXIpO1xuICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxudmFyIERlZmF1bHRTdXNwZW5zZUNvbnRleHQgPSAwOyAvLyBUaGUgU3VzcGVuc2UgQ29udGV4dCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gVGhlIGxvd2VyIGJpdHMgaXNcbi8vIGluaGVyaXRlZCBkZWVwbHkgZG93biB0aGUgc3VidHJlZS4gVGhlIHVwcGVyIGJpdHMgb25seSBhZmZlY3Rcbi8vIHRoaXMgaW1tZWRpYXRlIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBnZXRzIHJlc2V0IGVhY2ggbmV3XG4vLyBib3VuZGFyeSBvciBzdXNwZW5zZSBsaXN0LlxuXG52YXIgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxOyAvLyBTdWJ0cmVlIEZsYWdzOlxuLy8gSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0IGluZGljYXRlcyB0aGF0IG9uZSBvZiBvdXIgcGFyZW50IFN1c3BlbnNlXG4vLyBib3VuZGFyaWVzIGlzIG5vdCBjdXJyZW50bHkgc2hvd2luZyB2aXNpYmxlIG1haW4gY29udGVudC5cbi8vIEVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIG9yIGlzIG5vdCBtb3VudGVkIGF0IGFsbC5cbi8vIFdlIGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVzaXJhYmxlIHRvIHRyaWdnZXIgYSBmYWxsYmFjayBhdFxuLy8gdGhlIHBhcmVudC4gSWYgbm90LCB0aGVuIHdlIG1pZ2h0IG5lZWQgdG8gdHJpZ2dlciB1bmRlc2lyYWJsZSBib3VuZGFyaWVzXG4vLyBhbmQvb3Igc3VzcGVuZCB0aGUgY29tbWl0IHRvIGF2b2lkIGhpZGluZyB0aGUgcGFyZW50IGNvbnRlbnQuXG5cbnZhciBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgPSAxOyAvLyBTaGFsbG93IEZsYWdzOlxuLy8gRm9yY2VTdXNwZW5zZUZhbGxiYWNrIGNhbiBiZSB1c2VkIGJ5IFN1c3BlbnNlTGlzdCB0byBmb3JjZSBuZXdseSBhZGRlZFxuLy8gaXRlbXMgaW50byB0aGVpciBmYWxsYmFjayBzdGF0ZSBkdXJpbmcgb25lIG9mIHRoZSByZW5kZXIgcGFzc2VzLlxuXG52YXIgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMjtcbnZhciBzdXNwZW5zZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKERlZmF1bHRTdXNwZW5zZUNvbnRleHQpO1xuZnVuY3Rpb24gaGFzU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIGZsYWcpIHtcbiAgcmV0dXJuIChwYXJlbnRDb250ZXh0ICYgZmxhZykgIT09IDA7XG59XG5mdW5jdGlvbiBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2s7XG59XG5mdW5jdGlvbiBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHNoYWxsb3dDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0ICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgfCBzaGFsbG93Q29udGV4dDtcbn1cbmZ1bmN0aW9uIGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCwgc3VidHJlZUNvbnRleHQpIHtcbiAgcmV0dXJuIHBhcmVudENvbnRleHQgfCBzdWJ0cmVlQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hTdXNwZW5zZUNvbnRleHQoZmliZXIsIG5ld0NvbnRleHQpIHtcbiAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG59XG5mdW5jdGlvbiBwb3BTdXNwZW5zZUNvbnRleHQoZmliZXIpIHtcbiAgcG9wKHN1c3BlbnNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKHdvcmtJblByb2dyZXNzLCBoYXNJbnZpc2libGVQYXJlbnQpIHtcbiAgLy8gSWYgaXQgd2FzIHRoZSBwcmltYXJ5IGNoaWxkcmVuIHRoYXQganVzdCBzdXNwZW5kZWQsIGNhcHR1cmUgYW5kIHJlbmRlciB0aGVcbiAgLy8gZmFsbGJhY2suIE90aGVyd2lzZSwgZG9uJ3QgY2FwdHVyZSBhbmQgYnViYmxlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5leHRTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGRlaHlkcmF0ZWQgYm91bmRhcnkgYWx3YXlzIGNhcHR1cmVzLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wczsgLy8gUmVndWxhciBib3VuZGFyaWVzIGFsd2F5cyBjYXB0dXJlLlxuXG4gIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG59XG5mdW5jdGlvbiBmaW5kRmlyc3RTdXNwZW5kZWQocm93KSB7XG4gIHZhciBub2RlID0gcm93O1xuXG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGRlaHlkcmF0ZWQgPSBzdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChkZWh5ZHJhdGVkID09PSBudWxsIHx8IGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoZGVoeWRyYXRlZCkgfHwgaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soZGVoeWRyYXRlZCkpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlTGlzdENvbXBvbmVudCAmJiAvLyByZXZlYWxPcmRlciB1bmRlZmluZWQgY2FuJ3QgYmUgdHJ1c3RlZCBiZWNhdXNlIGl0IGRvbid0XG4gICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IHN1c3BlbmRlZCBvciBub3QuXG4gICAgbm9kZS5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkaWRTdXNwZW5kID0gKG5vZGUuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgaWYgKGRpZFN1c3BlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSByb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIE5vRmxhZ3MkMSA9XG4vKiAgICovXG4wOyAvLyBSZXByZXNlbnRzIHdoZXRoZXIgZWZmZWN0IHNob3VsZCBmaXJlLlxuXG52YXIgSGFzRWZmZWN0ID1cbi8qICovXG4xOyAvLyBSZXByZXNlbnRzIHRoZSBwaGFzZSBpbiB3aGljaCB0aGUgZWZmZWN0IChub3QgdGhlIGNsZWFuLXVwKSBmaXJlcy5cblxudmFyIEluc2VydGlvbiA9XG4vKiAgKi9cbjI7XG52YXIgTGF5b3V0ID1cbi8qICAgICovXG40O1xudmFyIFBhc3NpdmUkMSA9XG4vKiAgICovXG44O1xuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3Q7XG5cbntcbiAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG4vLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuXG52YXIgcmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gSSd2ZSBuYW1lZCBpdCBkaWZmZXJlbnRseSB0byBkaXN0aW5ndWlzaCBpdCBmcm9tXG4vLyB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7IC8vIEhvb2tzIGFyZSBzdG9yZWQgYXMgYSBsaW5rZWQgbGlzdCBvbiB0aGUgZmliZXIncyBtZW1vaXplZFN0YXRlIGZpZWxkLiBUaGVcbi8vIGN1cnJlbnQgaG9vayBsaXN0IGlzIHRoZSBsaXN0IHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBmaWJlci4gVGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGhvb2sgbGlzdCBpcyBhIG5ldyBsaXN0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGVcbi8vIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG5cbnZhciBjdXJyZW50SG9vayA9IG51bGw7XG52YXIgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsgLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXNcbi8vIGRvZXMgbm90IGdldCByZXNldCBpZiB3ZSBkbyBhbm90aGVyIHJlbmRlciBwYXNzOyBvbmx5IHdoZW4gd2UncmUgY29tcGxldGVseVxuLy8gZmluaXNoZWQgZXZhbHVhdGluZyB0aGlzIGNvbXBvbmVudC4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gc28gd2Uga25vd1xuLy8gd2hldGhlciB3ZSBuZWVkIHRvIGNsZWFyIHJlbmRlciBwaGFzZSB1cGRhdGVzIGFmdGVyIGEgdGhyb3cuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFdoZXJlIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9ubHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLiBUaGlzXG4vLyBnZXRzIHJlc2V0IGFmdGVyIGVhY2ggYXR0ZW1wdC5cbi8vIFRPRE86IE1heWJlIHRoZXJlJ3Mgc29tZSB3YXkgdG8gY29uc29saWRhdGUgdGhpcyB3aXRoXG4vLyBgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZWAuIE9yIHdpdGggYG51bWJlck9mUmVSZW5kZXJzYC5cblxudmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOyAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB1c2VJZCBob29rcyBpbiB0aGlzIGNvbXBvbmVudC5cblxudmFyIGxvY2FsSWRDb3VudGVyID0gMDsgLy8gVXNlZCBmb3IgaWRzIHRoYXQgYXJlIGdlbmVyYXRlZCBjb21wbGV0ZWx5IGNsaWVudC1zaWRlIChpLmUuIG5vdCBkdXJpbmdcbi8vIGh5ZHJhdGlvbikuIFRoaXMgY291bnRlciBpcyBnbG9iYWwsIHNvIGNsaWVudCBpZHMgYXJlIG5vdCBzdGFibGUgYWNyb3NzXG4vLyByZW5kZXIgYXR0ZW1wdHMuXG5cbnZhciBnbG9iYWxDbGllbnRJZENvdW50ZXIgPSAwO1xudmFyIFJFX1JFTkRFUl9MSU1JVCA9IDI1OyAvLyBJbiBERVYsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJpbWl0aXZlIGhvb2tcblxudmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsgLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLlxuLy8gVGhlIGxpc3Qgc3RvcmVzIHRoZSBvcmRlciBvZiBob29rcyB1c2VkIGR1cmluZyB0aGUgaW5pdGlhbCByZW5kZXIgKG1vdW50KS5cbi8vIFN1YnNlcXVlbnQgcmVuZGVycyAodXBkYXRlcykgcmVmZXJlbmNlIHRoaXMgbGlzdC5cblxudmFyIGhvb2tUeXBlc0RldiA9IG51bGw7XG52YXIgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gSW4gREVWLCB0aGlzIHRyYWNrcyB3aGV0aGVyIGN1cnJlbnRseSByZW5kZXJpbmcgY29tcG9uZW50IG5lZWRzIHRvIGlnbm9yZVxuLy8gdGhlIGRlcGVuZGVuY2llcyBmb3IgSG9va3MgdGhhdCBuZWVkIHRoZW0gKGUuZy4gdXNlRWZmZWN0IG9yIHVzZU1lbW8pLlxuLy8gV2hlbiB0cnVlLCBzdWNoIEhvb2tzIHdpbGwgYWx3YXlzIGJlIFwicmVtb3VudGVkXCIuIE9ubHkgdXNlZCBkdXJpbmcgaG90IHJlbG9hZC5cblxudmFyIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG5cbmZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkge1xuICB7XG4gICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG5cbiAgICBpZiAoaG9va1R5cGVzRGV2ID09PSBudWxsKSB7XG4gICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rVHlwZXNEZXYucHVzaChob29rTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKztcblxuICAgICAgaWYgKGhvb2tUeXBlc0Rldltob29rVHlwZXNVcGRhdGVJbmRleERldl0gIT09IGhvb2tOYW1lKSB7XG4gICAgICAgIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGhvb2tOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcykge1xuICB7XG4gICAgaWYgKGRlcHMgIT09IHVuZGVmaW5lZCAmJiBkZXBzICE9PSBudWxsICYmICFpc0FycmF5KGRlcHMpKSB7XG4gICAgICAvLyBWZXJpZnkgZGVwcywgYnV0IG9ubHkgb24gbW91bnQgdG8gYXZvaWQgZXh0cmEgY2hlY2tzLlxuICAgICAgLy8gSXQncyB1bmxpa2VseSB0aGVpciB0eXBlIHdvdWxkIGNoYW5nZSBhcyB1c3VhbGx5IHlvdSBkZWZpbmUgdGhlbSBpbmxpbmUuXG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCB0aGF0IGlzIG5vdCBhbiBhcnJheSAoaW5zdGVhZCwgcmVjZWl2ZWQgYCVzYCkuIFdoZW4gJyArICdzcGVjaWZpZWQsIHRoZSBmaW5hbCBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LicsIGN1cnJlbnRIb29rTmFtZUluRGV2LCB0eXBlb2YgZGVwcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkge1xuICB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gbG9jYWxJZENvdW50ZXIgPSAwO1xuICAvLyBUT0RPIFdhcm4gaWYgbm8gaG9va3MgYXJlIHVzZWQgYXQgYWxsIGR1cmluZyBtb3VudCwgdGhlbiBzb21lIGFyZSB1c2VkIGR1cmluZyB1cGRhdGUuXG4gIC8vIEN1cnJlbnRseSB3ZSB3aWxsIGlkZW50aWZ5IHRoZSB1cGRhdGUgcmVuZGVyIGFzIGEgbW91bnQgYmVjYXVzZSBtZW1vaXplZFN0YXRlID09PSBudWxsLlxuICAvLyBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIGl0J3MgdmFsaWQgZm9yIGNlcnRhaW4gdHlwZXMgb2YgY29tcG9uZW50cyAoZS5nLiBSZWFjdC5sYXp5KVxuICAvLyBVc2luZyBtZW1vaXplZFN0YXRlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtb3VudC91cGRhdGUgb25seSB3b3JrcyBpZiBhdCBsZWFzdCBvbmUgc3RhdGVmdWwgaG9vayBpcyB1c2VkLlxuICAvLyBOb24tc3RhdGVmdWwgaG9va3MgKGUuZy4gY29udGV4dCkgZG9uJ3QgZ2V0IGFkZGVkIHRvIG1lbW9pemVkU3RhdGUsXG4gIC8vIHNvIG1lbW9pemVkU3RhdGUgd291bGQgYmUgbnVsbCBkdXJpbmcgdXBkYXRlcyBhbmQgbW91bnRzLlxuXG4gIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICB9IGVsc2UgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGhhbmRsZXMgYW4gZWRnZSBjYXNlIHdoZXJlIGEgY29tcG9uZW50IGlzIHVwZGF0aW5nLFxuICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLlxuICAgICAgLy8gV2Ugd2FudCB0byBtYXRjaCB0aGUgcHJvZHVjdGlvbiBjb2RlIGJlaGF2aW9yICh3aGljaCB3aWxsIHVzZSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50KSxcbiAgICAgIC8vIGJ1dCB3aXRoIHRoZSBleHRyYSBERVYgdmFsaWRhdGlvbiB0byBlbnN1cmUgaG9va3Mgb3JkZXJpbmcgaGFzbid0IGNoYW5nZWQuXG4gICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LlxuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICB9XG4gIH1cblxuICB2YXIgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7IC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIHJlbmRlciBwaGFzZSB1cGRhdGVcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKSB7XG4gICAgLy8gS2VlcCByZW5kZXJpbmcgaW4gYSBsb29wIGZvciBhcyBsb25nIGFzIHJlbmRlciBwaGFzZSB1cGRhdGVzIGNvbnRpbnVlIHRvXG4gICAgLy8gYmUgc2NoZWR1bGVkLiBVc2UgYSBjb3VudGVyIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXG4gICAgdmFyIG51bWJlck9mUmVSZW5kZXJzID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlO1xuICAgICAgbG9jYWxJZENvdW50ZXIgPSAwO1xuXG4gICAgICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPj0gUkVfUkVOREVSX0xJTUlUKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkgcmUtcmVuZGVycy4gUmVhY3QgbGltaXRzIHRoZSBudW1iZXIgb2YgcmVuZGVycyB0byBwcmV2ZW50ICcgKyAnYW4gaW5maW5pdGUgbG9vcC4nKTtcbiAgICAgIH1cblxuICAgICAgbnVtYmVyT2ZSZVJlbmRlcnMgKz0gMTtcblxuICAgICAge1xuICAgICAgICAvLyBFdmVuIHdoZW4gaG90IHJlbG9hZGluZywgYWxsb3cgZGVwZW5kZW5jaWVzIHRvIHN0YWJpbGl6ZVxuICAgICAgICAvLyBhZnRlciBmaXJzdCByZW5kZXIgdG8gcHJldmVudCBpbmZpbml0ZSByZW5kZXIgcGhhc2UgdXBkYXRlcy5cbiAgICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgIH0gLy8gU3RhcnQgb3ZlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcblxuXG4gICAgICBjdXJyZW50SG9vayA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gICAgICB7XG4gICAgICAgIC8vIEFsc28gdmFsaWRhdGUgaG9vayBvcmRlciBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMuXG4gICAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICB9XG5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA7XG4gICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTtcbiAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpO1xuICB9IC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuXG5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGhvb2tUeXBlc0RldjtcbiAgfSAvLyBUaGlzIGNoZWNrIHVzZXMgY3VycmVudEhvb2sgc28gdGhhdCBpdCB3b3JrcyB0aGUgc2FtZSBpbiBERVYgYW5kIHByb2QgYnVuZGxlcy5cbiAgLy8gaG9va1R5cGVzRGV2IGNvdWxkIGNhdGNoIG1vcmUgY2FzZXMgKGUuZy4gY29udGV4dCkgYnV0IG9ubHkgaW4gREVWIGJ1bmRsZXMuXG5cblxuICB2YXIgZGlkUmVuZGVyVG9vRmV3SG9va3MgPSBjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBjdXJyZW50SG9vay5uZXh0ICE9PSBudWxsO1xuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNEZXYgPSBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIENvbmZpcm0gdGhhdCBhIHN0YXRpYyBmbGFnIHdhcyBub3QgYWRkZWQgb3IgcmVtb3ZlZCBzaW5jZSB0aGUgbGFzdFxuICAgIC8vIHJlbmRlci4gSWYgdGhpcyBmaXJlcywgaXQgc3VnZ2VzdHMgdGhhdCB3ZSBpbmNvcnJlY3RseSByZXNldCB0aGUgc3RhdGljXG4gICAgLy8gZmxhZ3MgaW4gc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBjb2RlYmFzZS4gVGhpcyBoYXMgaGFwcGVuZWQgYmVmb3JlLCBmb3JcbiAgICAvLyBleGFtcGxlLCBpbiB0aGUgU3VzcGVuc2VMaXN0IGltcGxlbWVudGF0aW9uLlxuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrKSAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgU3RhdGljTWFzaykgJiYgLy8gRGlzYWJsZSB0aGlzIHdhcm5pbmcgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgbGVnYWN5IFN1c3BlbnNlIGlzIHdlaXJkXG4gICAgLy8gYW5kIGNyZWF0ZXMgZmFsc2UgcG9zaXRpdmVzLiBUbyBtYWtlIHRoaXMgd29yayBpbiBsZWdhY3kgbW9kZSwgd2UnZFxuICAgIC8vIG5lZWQgdG8gbWFyayBmaWJlcnMgdGhhdCBjb21taXQgaW4gYW4gaW5jb21wbGV0ZSBzdGF0ZSwgc29tZWhvdy4gRm9yXG4gICAgLy8gbm93IEknbGwgZGlzYWJsZSB0aGUgd2FybmluZyB0aGF0IG1vc3Qgb2YgdGhlIGJ1Z3MgdGhhdCB3b3VsZCB0cmlnZ2VyXG4gICAgLy8gaXQgYXJlIGVpdGhlciBleGNsdXNpdmUgdG8gY29uY3VycmVudCBtb2RlIG9yIGV4aXN0IGluIGJvdGguXG4gICAgKGN1cnJlbnQubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEV4cGVjdGVkIHN0YXRpYyBmbGFnIHdhcyBtaXNzaW5nLiBQbGVhc2UgJyArICdub3RpZnkgdGhlIFJlYWN0IHRlYW0uJyk7XG4gICAgfVxuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBUaGlzIGlzIHJlc2V0IGJ5IGNoZWNrRGlkUmVuZGVySWRIb29rXG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICBpZiAoZGlkUmVuZGVyVG9vRmV3SG9va3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsICcgKyAnZWFybHkgcmV0dXJuIHN0YXRlbWVudC4nKTtcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGNoZWNrRGlkUmVuZGVySWRIb29rKCkge1xuICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgcmVuZGVyV2l0aEhvb2tzIGNhbGwuXG4gIC8vIENvbmNlcHR1YWxseSwgaXQncyBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgcmVuZGVyV2l0aEhvb2tzOyBpdCdzIG9ubHkgYVxuICAvLyBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhdm9pZCB1c2luZyBhbiBhcnJheSB0dXBsZS5cbiAgdmFyIGRpZFJlbmRlcklkSG9vayA9IGxvY2FsSWRDb3VudGVyICE9PSAwO1xuICBsb2NhbElkQ291bnRlciA9IDA7XG4gIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7XG59XG5mdW5jdGlvbiBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byByZXNldCB0aGUgZmxhZ3MgaGVyZSwgYmVjYXVzZSB0aGV5J3JlIHJlc2V0IGluIHRoZVxuICAvLyBjb21wbGV0ZSBwaGFzZSAoYnViYmxlUHJvcGVydGllcykuXG5cbiAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfihNb3VudFBhc3NpdmVEZXYgfCBNb3VudExheW91dERldiB8IFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oUGFzc2l2ZSB8IFVwZGF0ZSk7XG4gIH1cblxuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xufVxuXG5mdW5jdGlvbiBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgdmFyIGhvb2sgPSB7XG4gICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCxcbiAgICBiYXNlU3RhdGU6IG51bGwsXG4gICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgIHF1ZXVlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdFxuICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IGhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dCA9IGhvb2s7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIGZvciB1cGRhdGVzIGFuZCBmb3IgcmUtcmVuZGVycyB0cmlnZ2VyZWQgYnkgYVxuICAvLyByZW5kZXIgcGhhc2UgdXBkYXRlLiBJdCBhc3N1bWVzIHRoZXJlIGlzIGVpdGhlciBhIGN1cnJlbnQgaG9vayB3ZSBjYW5cbiAgLy8gY2xvbmUsIG9yIGEgd29yay1pbi1wcm9ncmVzcyBob29rIGZyb20gYSBwcmV2aW91cyByZW5kZXIgcGFzcyB0aGF0IHdlIGNhblxuICAvLyB1c2UgYXMgYSBiYXNlLiBXaGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGJhc2UgbGlzdCwgd2UgbXVzdCBzd2l0Y2ggdG9cbiAgLy8gdGhlIGRpc3BhdGNoZXIgdXNlZCBmb3IgbW91bnRzLlxuICB2YXIgbmV4dEN1cnJlbnRIb29rO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q3VycmVudEhvb2sgPSBudWxsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICB9XG5cbiAgdmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgbmV4dFdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICB9XG5cbiAgaWYgKG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwpIHtcbiAgICAvLyBUaGVyZSdzIGFscmVhZHkgYSB3b3JrLWluLXByb2dyZXNzLiBSZXVzZSBpdC5cbiAgICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgICBjdXJyZW50SG9vayA9IG5leHRDdXJyZW50SG9vaztcbiAgfSBlbHNlIHtcbiAgICAvLyBDbG9uZSBmcm9tIHRoZSBjdXJyZW50IGhvb2suXG4gICAgaWYgKG5leHRDdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbCxcbiAgICBzdG9yZXM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlc1xuICByZXR1cm4gdHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGluaXRpYWxTdGF0ZTtcblxuICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdChpbml0aWFsQXJnKTtcbiAgfSBlbHNlIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsQXJnO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAocXVldWUgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgcXVldWUuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICB2YXIgY3VycmVudCA9IGN1cnJlbnRIb29rOyAvLyBUaGUgbGFzdCByZWJhc2UgdXBkYXRlIHRoYXQgaXMgTk9UIHBhcnQgb2YgdGhlIGJhc2Ugc3RhdGUuXG5cbiAgdmFyIGJhc2VRdWV1ZSA9IGN1cnJlbnQuYmFzZVF1ZXVlOyAvLyBUaGUgbGFzdCBwZW5kaW5nIHVwZGF0ZSB0aGF0IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnBlbmRpbmc7XG5cbiAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgbmV3IHVwZGF0ZXMgdGhhdCBoYXZlbid0IGJlZW4gcHJvY2Vzc2VkIHlldC5cbiAgICAvLyBXZSdsbCBhZGQgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cbiAgICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAvLyBNZXJnZSB0aGUgcGVuZGluZyBxdWV1ZSBhbmQgdGhlIGJhc2UgcXVldWUuXG4gICAgICB2YXIgYmFzZUZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgICB2YXIgcGVuZGluZ0ZpcnN0ID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICBiYXNlUXVldWUubmV4dCA9IHBlbmRpbmdGaXJzdDtcbiAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0O1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChjdXJyZW50LmJhc2VRdWV1ZSAhPT0gYmFzZVF1ZXVlKSB7XG4gICAgICAgIC8vIEludGVybmFsIGludmFyaWFudCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmZWFzaWJseSBjb3VsZCBpblxuICAgICAgICAvLyB0aGUgZnV0dXJlIGlmIHdlIGltcGxlbWVudCByZXN1bWluZywgb3Igc29tZSBmb3JtIG9mIHRoYXQuXG4gICAgICAgIGVycm9yKCdJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSB0byBiZSBhIGNsb25lLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgLy8gV2UgaGF2ZSBhIHF1ZXVlIHRvIHByb2Nlc3MuXG4gICAgdmFyIGZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7XG4gICAgdmFyIG5ld1N0YXRlID0gY3VycmVudC5iYXNlU3RhdGU7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbnVsbDtcbiAgICB2YXIgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0O1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbmV3QmFzZVF1ZXVlTGFzdCA9IGNsb25lO1xuICAgICAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG4gICAgICAgIC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlXG4gICAgICAgIC8vIHJlbmRlckxhbmVzIGZyb20gdGhlIG9yaWdpbmFsIGxhbmVzLlxuXG5cbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgdXBkYXRlTGFuZSk7XG4gICAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXModXBkYXRlTGFuZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXRcbiAgICAgICAgICAgIC8vIGl0LiBVc2luZyBOb0xhbmUgd29ya3MgYmVjYXVzZSAwIGlzIGEgc3Vic2V0IG9mIGFsbCBiaXRtYXNrcywgc29cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS5cbiAgICAgICAgICAgIGxhbmU6IE5vTGFuZSxcbiAgICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmhhc0VhZ2VyU3RhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHVwZGF0ZSBpcyBhIHN0YXRlIHVwZGF0ZSAobm90IGEgcmVkdWNlcikgYW5kIHdhcyBwcm9jZXNzZWQgZWFnZXJseSxcbiAgICAgICAgICAvLyB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlXG4gICAgICAgICAgbmV3U3RhdGUgPSB1cGRhdGUuZWFnZXJTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsICYmIHVwZGF0ZSAhPT0gZmlyc3QpO1xuXG4gICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdDtcbiAgICB9IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICBob29rLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBob29rLmJhc2VRdWV1ZSA9IG5ld0Jhc2VRdWV1ZUxhc3Q7XG4gICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvXG4gIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gIC8vIGFyZSByZW1haW5pbmcuXG5cblxuICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7XG5cbiAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBpbnRlcmxlYXZlZExhbmUgPSBpbnRlcmxlYXZlZC5sYW5lO1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoaW50ZXJsZWF2ZWRMYW5lKTtcbiAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTtcbiAgfSBlbHNlIGlmIChiYXNlUXVldWUgPT09IG51bGwpIHtcbiAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0b1xuICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgcXVldWUubGFuZXMgPSBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7XG4gIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0U25hcHNob3Q7XG4gIHZhciBpc0h5ZHJhdGluZyA9IGdldElzSHlkcmF0aW5nKCk7XG5cbiAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgaWYgKGdldFNlcnZlclNuYXBzaG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBnZXRTZXJ2ZXJTbmFwc2hvdCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yICcgKyAnc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFdpbGwgcmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuJyk7XG4gICAgfVxuXG4gICAgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcblxuICAgIHtcbiAgICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgICAgaWYgKG5leHRTbmFwc2hvdCAhPT0gZ2V0U2VydmVyU25hcHNob3QoKSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNlcnZlclNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgICAgaWYgKCFvYmplY3RJcyhuZXh0U25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSkge1xuICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cbiAgICAvL1xuICAgIC8vIFdlIHdvbid0IGRvIHRoaXMgaWYgd2UncmUgaHlkcmF0aW5nIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LCBiZWNhdXNlIGlmXG4gICAgLy8gdGhlIGNvbnRlbnQgaXMgc3RhbGUsIGl0J3MgYWxyZWFkeSB2aXNpYmxlIGFueXdheS4gSW5zdGVhZCB3ZSdsbCBwYXRjaFxuICAgIC8vIGl0IHVwIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gIHZhciBpbnN0ID0ge1xuICAgIHZhbHVlOiBuZXh0U25hcHNob3QsXG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90XG4gIH07XG4gIGhvb2sucXVldWUgPSBpbnN0OyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZS5cblxuICBtb3VudEVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHVwZGF0ZSB0aGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZHMuIFdlIHdpbGwgdXBkYXRlXG4gIC8vIHRoaXMgd2hlbmV2ZXIgc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgb3IgdmFsdWUgY2hhbmdlcy4gQmVjYXVzZSB0aGVyZSdzIG5vXG4gIC8vIGNsZWFuLXVwIGZ1bmN0aW9uLCBhbmQgd2UgdHJhY2sgdGhlIGRlcHMgY29ycmVjdGx5LCB3ZSBjYW4gY2FsbCBwdXNoRWZmZWN0XG4gIC8vIGRpcmVjdGx5LCB3aXRob3V0IHN0b3JpbmcgYW55IGFkZGl0aW9uYWwgc3RhdGUuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlXG4gIC8vIGRvbid0IG5lZWQgdG8gc2V0IGEgc3RhdGljIGZsYWcsIGVpdGhlci5cbiAgLy8gVE9ETzogV2UgY2FuIG1vdmUgdGhpcyB0byB0aGUgcGFzc2l2ZSBwaGFzZSBvbmNlIHdlIGFkZCBhIHByZS1jb21taXRcbiAgLy8gY29uc2lzdGVuY3kgY2hlY2suIFNlZSB0aGUgbmV4dCBjb21tZW50LlxuXG4gIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7XG4gIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpO1xuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOyAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlXG4gIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZVxuICAvLyBhbHdheXMgc3luY2hyb25vdXMuXG5cbiAgdmFyIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAge1xuICAgIGlmICghZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpIHtcbiAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG5cbiAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7XG5cbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2U25hcHNob3QgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzbmFwc2hvdENoYW5nZWQgPSAhb2JqZWN0SXMocHJldlNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuXG4gIGlmIChzbmFwc2hvdENoYW5nZWQpIHtcbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7XG4gICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gaG9vay5xdWV1ZTtcbiAgdXBkYXRlRWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBXaGVuZXZlciBnZXRTbmFwc2hvdCBvciBzdWJzY3JpYmUgY2hhbmdlcywgd2UgbmVlZCB0byBjaGVjayBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlIGlmIHRoZXJlIHdhcyBhbiBpbnRlcmxlYXZlZCBtdXRhdGlvbi4gSW4gY29uY3VycmVudCBtb2RlXG4gIC8vIHRoaXMgY2FuIGhhcHBlbiBhbGwgdGhlIHRpbWUsIGJ1dCBldmVuIGluIHN5bmNocm9ub3VzIG1vZGUsIGFuIGVhcmxpZXJcbiAgLy8gZWZmZWN0IG1heSBoYXZlIG11dGF0ZWQgdGhlIHN0b3JlLlxuXG4gIGlmIChpbnN0LmdldFNuYXBzaG90ICE9PSBnZXRTbmFwc2hvdCB8fCBzbmFwc2hvdENoYW5nZWQgfHwgLy8gQ2hlY2sgaWYgdGhlIHN1c2JjcmliZSBmdW5jdGlvbiBjaGFuZ2VkLiBXZSBjYW4gc2F2ZSBzb21lIG1lbW9yeSBieVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHdlIHNjaGVkdWxlZCBhIHN1YnNjcmlwdGlvbiBlZmZlY3QgYWJvdmUuXG4gIHdvcmtJblByb2dyZXNzSG9vayAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiBIYXNFZmZlY3QpIHtcbiAgICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICAgIHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgUGFzc2l2ZSQxLCB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpLCB1bmRlZmluZWQsIG51bGwpOyAvLyBVbmxlc3Mgd2UncmUgcmVuZGVyaW5nIGEgYmxvY2tpbmcgbGFuZSwgc2NoZWR1bGUgYSBjb25zaXN0ZW5jeSBjaGVjay5cbiAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlXG4gICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC5cblxuICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIHdvcmstaW4tcHJvZ3Jlc3Mgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHtcbiAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0U25hcHNob3Q7XG59XG5cbmZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7XG4gIGZpYmVyLmZsYWdzIHw9IFN0b3JlQ29uc2lzdGVuY3k7XG4gIHZhciBjaGVjayA9IHtcbiAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgdmFsdWU6IHJlbmRlcmVkU25hcHNob3RcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc3RvcmVzID0gY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgaWYgKHN0b3JlcyA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVzLnB1c2goY2hlY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVTdG9yZUluc3RhbmNlKGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSB7XG4gIC8vIFRoZXNlIGFyZSB1cGRhdGVkIGluIHRoZSBwYXNzaXZlIHBoYXNlXG4gIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gIGluc3QuZ2V0U25hcHNob3QgPSBnZXRTbmFwc2hvdDsgLy8gU29tZXRoaW5nIG1heSBoYXZlIGJlZW4gbXV0YXRlZCBpbiBiZXR3ZWVuIHJlbmRlciBhbmQgY29tbWl0LiBUaGlzIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiBpbiBhbiBldmVudCB0aGF0IGZpcmVkIGJlZm9yZSB0aGUgcGFzc2l2ZSBlZmZlY3RzLCBvciBpdCBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYSBsYXlvdXQgZWZmZWN0LiBJbiB0aGF0IGNhc2UsIHdlIHdvdWxkIGhhdmUgdXNlZCB0aGUgb2xkXG4gIC8vIHNuYXBzaG8gYW5kIGdldFNuYXBzaG90IHZhbHVlcyB0byBiYWlsIG91dC4gV2UgbmVlZCB0byBjaGVjayBvbmUgbW9yZSB0aW1lLlxuXG4gIGlmIChjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpKSB7XG4gICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWJzY3JpYmVUb1N0b3JlKGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhhbmRsZVN0b3JlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoZSBzdG9yZSBjaGFuZ2VkLiBDaGVjayBpZiB0aGUgc25hcHNob3QgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlXG4gICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS5cbiAgICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuXG4gICAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpO1xuICAgIH1cbiAgfTsgLy8gU3Vic2NyaWJlIHRvIHRoZSBzdG9yZSBhbmQgcmV0dXJuIGEgY2xlYW4tdXAgZnVuY3Rpb24uXG5cblxuICByZXR1cm4gc3Vic2NyaWJlKGhhbmRsZVN0b3JlQ2hhbmdlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSB7XG4gIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gIHZhciBwcmV2VmFsdWUgPSBpbnN0LnZhbHVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gIH07XG4gIGhvb2sucXVldWUgPSBxdWV1ZTtcbiAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaFNldFN0YXRlLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAge1xuICAgIHZhciBfcmVmMiA9IHtcbiAgICAgIGN1cnJlbnQ6IGluaXRpYWxWYWx1ZVxuICAgIH07XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gX3JlZjI7XG4gICAgcmV0dXJuIF9yZWYyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChNb3VudFBhc3NpdmVEZXYgfCBQYXNzaXZlIHwgUGFzc2l2ZVN0YXRpYywgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdChjcmVhdGUsIHJlZikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZWZDYWxsYmFjayA9IHJlZjtcblxuICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmQ2FsbGJhY2soX2luc3QpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZDYWxsYmFjayhudWxsKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciByZWZPYmplY3QgPSByZWY7XG5cbiAgICB7XG4gICAgICBpZiAoIXJlZk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgZmlyc3QgYXJndW1lbnQgdG8gZWl0aGVyIGJlIGEgJyArICdyZWYgY2FsbGJhY2sgb3IgUmVhY3QuY3JlYXRlUmVmKCkgb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCAnYW4gb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKHJlZk9iamVjdCkuam9pbignLCAnKSArICd9Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpO1xuXG4gICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBfaW5zdDI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlZk9iamVjdC5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gIHtcbiAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgfVxuXG4gIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZXNvbHZlZEN1cnJlbnRIb29rID0gY3VycmVudEhvb2s7XG4gIHZhciBwcmV2VmFsdWUgPSByZXNvbHZlZEN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChob29rLCBwcmV2VmFsdWUsIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG5cbiAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhIG1vdW50LlxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVyZW5kZXIgZHVyaW5nIGFuIHVwZGF0ZS5cbiAgICB2YXIgcHJldlZhbHVlID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSkge1xuICB2YXIgc2hvdWxkRGVmZXJWYWx1ZSA9ICFpbmNsdWRlc09ubHlOb25VcmdlbnRMYW5lcyhyZW5kZXJMYW5lcyk7XG5cbiAgaWYgKHNob3VsZERlZmVyVmFsdWUpIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVyZ2VudCB1cGRhdGUuIElmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCB1c2luZyB0aGVcbiAgICAvLyBwcmV2aW91cyB2YWx1ZSBhbmQgc3Bhd24gYSBkZWZlcnJlZCByZW5kZXIgdG8gdXBkYXRlIGl0IGxhdGVyLlxuICAgIGlmICghb2JqZWN0SXModmFsdWUsIHByZXZWYWx1ZSkpIHtcbiAgICAgIC8vIFNjaGVkdWxlIGEgZGVmZXJyZWQgcmVuZGVyXG4gICAgICB2YXIgZGVmZXJyZWRMYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGRlZmVycmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGRlZmVycmVkTGFuZSk7IC8vIFNldCB0aGlzIHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVuZGVyZWQgdmFsdWUgaXMgaW5jb25zaXN0ZW50XG4gICAgICAvLyBmcm9tIHRoZSBsYXRlc3QgdmFsdWUuIFRoZSBuYW1lIFwiYmFzZVN0YXRlXCIgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlXG4gICAgICAvLyB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nIGEgc3RhdGUgaG9vayBmaWVsZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGFcbiAgICAgIC8vIG5ldyBvbmUuXG5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gdHJ1ZTtcbiAgICB9IC8vIFJldXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuXG5cbiAgICByZXR1cm4gcHJldlZhbHVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbm90IGFuIHVyZ2VudCB1cGRhdGUsIHNvIHdlIGNhbiB1c2UgdGhlIGxhdGVzdCB2YWx1ZSByZWdhcmRsZXNzXG4gICAgLy8gb2Ygd2hhdCBpdCBpcy4gTm8gbmVlZCB0byBkZWZlciBpdC5cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgc3Bhd25lZCByZW5kZXIsIHRoZW4gd2UgbmVlZCB0byBtYXJrXG4gICAgLy8gdGhpcyBhcyBhbiB1cGRhdGUgdG8gcHJldmVudCB0aGUgZmliZXIgZnJvbSBiYWlsaW5nIG91dC5cbiAgICAvL1xuICAgIC8vIGBiYXNlU3RhdGVgIGlzIHRydWUgd2hlbiB0aGUgY3VycmVudCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcmVuZGVyZWRcbiAgICAvLyB2YWx1ZS4gVGhlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0Y2ggaG93IHdlIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmdcbiAgICAvLyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgaWYgKGhvb2suYmFzZVN0YXRlKSB7XG4gICAgICAvLyBGbGlwIHRoaXMgYmFjayB0byBmYWxzZS5cbiAgICAgIGhvb2suYmFzZVN0YXRlID0gZmFsc2U7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGhpZ2hlckV2ZW50UHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSwgQ29udGludW91c0V2ZW50UHJpb3JpdHkpKTtcbiAgc2V0UGVuZGluZyh0cnVlKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuXG4gICAge1xuICAgICAgaWYgKHByZXZUcmFuc2l0aW9uID09PSBudWxsICYmIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzKSB7XG4gICAgICAgIHZhciB1cGRhdGVkRmliZXJzQ291bnQgPSBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5zaXplO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmliZXJzQ291bnQgPiAxMCkge1xuICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50VHJhbnNpdGlvbigpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFBlbmRpbmcgPSBfbW91bnRTdGF0ZVsxXTsgLy8gVGhlIGBzdGFydGAgbWV0aG9kIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBzdGFydDtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbigpIHtcbiAgdmFyIF91cGRhdGVTdGF0ZSA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGVbMF07XG5cbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHN0YXJ0ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZSA9IHJlcmVuZGVyU3RhdGUoKSxcbiAgICAgIGlzUGVuZGluZyA9IF9yZXJlbmRlclN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxudmFyIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpIHtcbiAge1xuICAgIHJldHVybiBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50SWQoKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTsgLy8gVE9ETzogSW4gRml6eiwgaWQgZ2VuZXJhdGlvbiBpcyBzcGVjaWZpYyB0byBlYWNoIHNlcnZlciBjb25maWcuIE1heWJlIHdlXG4gIC8vIHNob3VsZCBkbyB0aGlzIGluIEZpYmVyLCB0b28/IERlZmVycmluZyB0aGlzIGRlY2lzaW9uIGZvciBub3cgYmVjYXVzZVxuICAvLyB0aGVyZSdzIG5vIG90aGVyIHBsYWNlIHRvIHN0b3JlIHRoZSBwcmVmaXggZXhjZXB0IGZvciBhbiBpbnRlcm5hbCBmaWVsZCBvblxuICAvLyB0aGUgcHVibGljIGNyZWF0ZVJvb3Qgb2JqZWN0LCB3aGljaCB0aGUgZmliZXIgdHJlZSBkb2VzIG5vdCBjdXJyZW50bHkgaGF2ZVxuICAvLyBhIHJlZmVyZW5jZSB0by5cblxuICB2YXIgaWRlbnRpZmllclByZWZpeCA9IHJvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgdmFyIGlkO1xuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgdmFyIHRyZWVJZCA9IGdldFRyZWVJZCgpOyAvLyBVc2UgYSBjYXB0aWFsIFIgcHJlZml4IGZvciBzZXJ2ZXItZ2VuZXJhdGVkIGlkcy5cblxuICAgIGlkID0gJzonICsgaWRlbnRpZmllclByZWZpeCArICdSJyArIHRyZWVJZDsgLy8gVW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IGlkIGF0IHRoaXMgbGV2ZWwsIGFwcGVuZCBhIG51bWJlciBhdCB0aGUgZW5kXG4gICAgLy8gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NpdGlvbiBvZiB0aGlzIHVzZUlkIGhvb2sgYW1vbmcgYWxsIHRoZSB1c2VJZFxuICAgIC8vIGhvb2tzIGZvciB0aGlzIGZpYmVyLlxuXG4gICAgdmFyIGxvY2FsSWQgPSBsb2NhbElkQ291bnRlcisrO1xuXG4gICAgaWYgKGxvY2FsSWQgPiAwKSB7XG4gICAgICBpZCArPSAnSCcgKyBsb2NhbElkLnRvU3RyaW5nKDMyKTtcbiAgICB9XG5cbiAgICBpZCArPSAnOic7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIGEgbG93ZXJjYXNlIHIgcHJlZml4IGZvciBjbGllbnQtZ2VuZXJhdGVkIGlkcy5cbiAgICB2YXIgZ2xvYmFsQ2xpZW50SWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKztcbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAncicgKyBnbG9iYWxDbGllbnRJZC50b1N0cmluZygzMikgKyAnOic7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBpZDtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJZCgpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIGlkID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoUmVkdWNlckFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgIGlmIChmaWJlci5sYW5lcyA9PT0gTm9MYW5lcyAmJiAoYWx0ZXJuYXRlID09PSBudWxsIHx8IGFsdGVybmF0ZS5sYW5lcyA9PT0gTm9MYW5lcykpIHtcbiAgICAgIC8vIFRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHksIHdoaWNoIG1lYW5zIHdlIGNhbiBlYWdlcmx5IGNvbXB1dGUgdGhlXG4gICAgICAvLyBuZXh0IHN0YXRlIGJlZm9yZSBlbnRlcmluZyB0aGUgcmVuZGVyIHBoYXNlLiBJZiB0aGUgbmV3IHN0YXRlIGlzIHRoZVxuICAgICAgLy8gc2FtZSBhcyB0aGUgY3VycmVudCBzdGF0ZSwgd2UgbWF5IGJlIGFibGUgdG8gYmFpbCBvdXQgZW50aXJlbHkuXG4gICAgICB2YXIgbGFzdFJlbmRlcmVkUmVkdWNlciA9IHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXI7XG5cbiAgICAgIGlmIChsYXN0UmVuZGVyZWRSZWR1Y2VyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7XG4gICAgICAgICAgdmFyIGVhZ2VyU3RhdGUgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTsgLy8gU3Rhc2ggdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUsIGFuZCB0aGUgcmVkdWNlciB1c2VkIHRvIGNvbXB1dGVcbiAgICAgICAgICAvLyBpdCwgb24gdGhlIHVwZGF0ZSBvYmplY3QuIElmIHRoZSByZWR1Y2VyIGhhc24ndCBjaGFuZ2VkIGJ5IHRoZVxuICAgICAgICAgIC8vIHRpbWUgd2UgZW50ZXIgdGhlIHJlbmRlciBwaGFzZSwgdGhlbiB0aGUgZWFnZXIgc3RhdGUgY2FuIGJlIHVzZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGNhbGxpbmcgdGhlIHJlZHVjZXIgYWdhaW4uXG5cbiAgICAgICAgICB1cGRhdGUuaGFzRWFnZXJTdGF0ZSA9IHRydWU7XG4gICAgICAgICAgdXBkYXRlLmVhZ2VyU3RhdGUgPSBlYWdlclN0YXRlO1xuXG4gICAgICAgICAgaWYgKG9iamVjdElzKGVhZ2VyU3RhdGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuXG4gICAgICAgICAgICAvLyBJdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgd2UnbGwgbmVlZCB0byByZWJhc2UgdGhpcyB1cGRhdGUgbGF0ZXIsXG4gICAgICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgZm9yIGEgZGlmZmVyZW50IHJlYXNvbiBhbmQgYnkgdGhhdFxuICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC5cbiAgICAgICAgICAgIC8vIFRPRE86IERvIHdlIHN0aWxsIG5lZWQgdG8gZW50YW5nbGUgdHJhbnNpdGlvbnMgaW4gdGhpcyBjYXNlP1xuICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlQW5kRWFnZXJseUJhaWxvdXQoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsvLyBTdXBwcmVzcyB0aGUgZXJyb3IuIEl0IHdpbGwgdGhyb3cgYWdhaW4gaW4gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgcmV0dXJuIGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG59IC8vIFRPRE86IE1vdmUgdG8gUmVhY3RGaWJlckNvbmN1cnJlbnRVcGRhdGVzP1xuXG5cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkge1xuICAgIHZhciBxdWV1ZUxhbmVzID0gcXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXlcbiAgICAvLyBtdXN0IGhhdmUgZmluaXNoZWQuIFdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBzaGFyZWQgcXVldWUsIHdoaWNoXG4gICAgLy8gcmVwcmVzZW50cyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlXG4gICAgLy8gbWF5IGVudGFuZ2xlIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWZcbiAgICAvLyB3ZSAqZG9uJ3QqIGVudGFuZ2xlIHdoZW4gd2Ugc2hvdWxkLlxuXG4gICAgcXVldWVMYW5lcyA9IGludGVyc2VjdExhbmVzKHF1ZXVlTGFuZXMsIHJvb3QucGVuZGluZ0xhbmVzKTsgLy8gRW50YW5nbGUgdGhlIG5ldyB0cmFuc2l0aW9uIGxhbmUgd2l0aCB0aGUgb3RoZXIgdHJhbnNpdGlvbiBsYW5lcy5cblxuICAgIHZhciBuZXdRdWV1ZUxhbmVzID0gbWVyZ2VMYW5lcyhxdWV1ZUxhbmVzLCBsYW5lKTtcbiAgICBxdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWZcbiAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0b1xuICAgIC8vIGVudGFuZ2xlIGl0IGFnYWluLCBqdXN0IHRvIGJlIHN1cmUuXG5cbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBuZXdRdWV1ZUxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSwgYWN0aW9uKSB7XG5cbiAge1xuICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gIH1cbn1cblxudmFyIENvbnRleHRPbmx5RGlzcGF0Y2hlciA9IHtcbiAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VDb250ZXh0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUluc2VydGlvbkVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VMYXlvdXRFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTWVtbzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWR1Y2VyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVJlZjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWJ1Z1ZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZURlZmVycmVkVmFsdWU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlVHJhbnNpdGlvbjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VNdXRhYmxlU291cmNlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUlkOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcblxudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDtcbnZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG5cbntcbiAgdmFyIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gIH07XG5cbiAgdmFyIHdhcm5JbnZhbGlkSG9va0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBlcnJvcignRG8gbm90IGNhbGwgSG9va3MgaW5zaWRlIHVzZUVmZmVjdCguLi4pLCB1c2VNZW1vKC4uLiksIG9yIG90aGVyIGJ1aWx0LWluIEhvb2tzLiAnICsgJ1lvdSBjYW4gb25seSBjYWxsIEhvb2tzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciBSZWFjdCBmdW5jdGlvbi4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyk7XG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG5cbiAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJZCgpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG59XG5cbnZhciBub3ckMSA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG52YXIgY29tbWl0VGltZSA9IDA7XG52YXIgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7XG52YXIgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbnZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7XG4vKipcbiAqIFRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQvY2FzY2FkaW5nIHVwZGF0ZSAoc2NoZWR1bGVkIGZyb20gYSBsYXlvdXQgZWZmZWN0KS5cbiAqXG4gKiBUaGUgb3ZlcmFsbCBzZXF1ZW5jZSBpczpcbiAqICAgMS4gcmVuZGVyXG4gKiAgIDIuIGNvbW1pdCAoYW5kIGNhbGwgYG9uUmVuZGVyYCwgYG9uQ29tbWl0YClcbiAqICAgMy4gY2hlY2sgZm9yIG5lc3RlZCB1cGRhdGVzXG4gKiAgIDQuIGZsdXNoIHBhc3NpdmUgZWZmZWN0cyAoYW5kIGNhbGwgYG9uUG9zdENvbW1pdGApXG4gKlxuICogTmVzdGVkIHVwZGF0ZXMgYXJlIGlkZW50aWZpZWQgaW4gc3RlcCAzIGFib3ZlLFxuICogYnV0IHN0ZXAgNCBzdGlsbCBhcHBsaWVzIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGp1c3QgY29tbWl0dGVkLlxuICogV2UgdXNlIHR3byBmbGFncyB0byB0cmFjayBuZXN0ZWQgdXBkYXRlcyB0aGVuOlxuICogb25lIHRyYWNrcyB3aGV0aGVyIHRoZSB1cGNvbWluZyB1cGRhdGUgaXMgYSBuZXN0ZWQgdXBkYXRlLFxuICogYW5kIHRoZSBvdGhlciB0cmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkIHVwZGF0ZS5cbiAqIFRoZSBmaXJzdCB2YWx1ZSBnZXRzIHN5bmNlZCB0byB0aGUgc2Vjb25kIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLlxuICovXG5cbnZhciBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbnZhciBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkge1xuICByZXR1cm4gY3VycmVudFVwZGF0ZUlzTmVzdGVkO1xufVxuXG5mdW5jdGlvbiBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCkge1xuICB7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBmYWxzZTtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW5jTmVzdGVkVXBkYXRlRmxhZygpIHtcbiAge1xuICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDtcbiAgICBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChsYXlvdXRFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBsYXlvdXRFZmZlY3RTdGFydFRpbWU7XG4gICAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGZpYmVyKSB7XG5cbiAgaWYgKHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lO1xuICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvclxuICAgIC8vIE9yIHRoZSByb290IChmb3IgdGhlIERldlRvb2xzIFByb2ZpbGVyIHRvIHJlYWQpXG5cbiAgICB2YXIgcGFyZW50RmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcm9vdC5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmIChwYXJlbnRTdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIERldGFjaGVkIGZpYmVycyBoYXZlIHRoZWlyIHN0YXRlIG5vZGUgY2xlYXJlZCBvdXQuXG4gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBhbHNvIGNsZWFyZWQgb3V0LFxuICAgICAgICAgICAgLy8gc28gd2Ugd29uJ3QgYmUgYWJsZSB0byByZXBvcnQgdGhlIHRpbWUgc3BlbnQgaW4gdGhpcyBQcm9maWxlcidzIHN1YnRyZWUuXG4gICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKSB7XG5cbiAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQYXNzaXZlRWZmZWN0VGltZXIoKSB7XG5cbiAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24oZmliZXIpIHtcbiAgLy8gVHJhbnNmZXIgdGltZSBzcGVudCByZW5kZXJpbmcgdGhlc2UgY2hpbGRyZW4gc28gd2UgZG9uJ3QgbG9zZSBpdFxuICAvLyBhZnRlciB3ZSByZXJlbmRlci4gVGhpcyBpcyB1c2VkIGFzIGEgaGVscGVyIGluIHNwZWNpYWwgY2FzZXNcbiAgLy8gd2hlcmUgd2Ugc2hvdWxkIGNvdW50IHRoZSB3b3JrIG9mIG11bHRpcGxlIHBhc3Nlcy5cbiAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkKSB7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgYmFzZVByb3BzKTtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpOiBBIHZhbGlkIHN0YXRlIG9iamVjdCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gJyArICdZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWZcbiAgLy8gaXQgY2F1c2VzIHByb2JsZW1zLiBUaGlzIGlzIG1lYW50IHRvIGdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGZvclxuICAvLyBSZWFjdERPTTE1LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHJlYWN0RE9NMTZDb21wb25lbnQsXG4gIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSBcIl9wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgLy8gZXhjZXB0aW9uLlxuXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZha2VJbnRlcm5hbEluc3RhbmNlLCAnX3Byb2Nlc3NDaGlsZENvbnRleHQnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBSZWFjdCAxNisuIFRoaXMgbGlrZWx5ICcgKyAnbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0ICcgKyAnYSBSZWFjdCAxNSB0cmVlIGluc2lkZSBhIFJlYWN0IDE2IHRyZWUgdXNpbmcgJyArIFwidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIsIHdoaWNoIGlzbid0IHN1cHBvcnRlZC4gVHJ5IFwiICsgJ3RvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0IChhbmQgaWRlYWxseSwgc3dpdGNoICcgKyAndG8gUmVhY3RET00uY3JlYXRlUG9ydGFsKS4nKTtcbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlKGN0b3IsIHBhcnRpYWxTdGF0ZSk7XG4gIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gIHZhciBtZW1vaXplZFN0YXRlID0gcGFydGlhbFN0YXRlID09PSBudWxsIHx8IHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8gcHJldlN0YXRlIDogYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBtZW1vaXplZFN0YXRlOyAvLyBPbmNlIHRoZSB1cGRhdGUgcXVldWUgaXMgZW1wdHksIHBlcnNpc3QgdGhlIGRlcml2ZWQgc3RhdGUgb250byB0aGVcbiAgLy8gYmFzZSBzdGF0ZS5cblxuICBpZiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBRdWV1ZSBpcyBhbHdheXMgbm9uLW51bGwgZm9yIGNsYXNzZXNcbiAgICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBtZW1vaXplZFN0YXRlO1xuICB9XG59XG5cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gUmVwbGFjZVN0YXRlO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKGluc3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gICAge1xuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW4gZXh0cmEgdGltZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbiAgfVxuXG4gIGlmIChjdG9yLnByb3RvdHlwZSAmJiBjdG9yLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCkge1xuICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcbiAgICB2YXIgcmVuZGVyUHJlc2VudCA9IGluc3RhbmNlLnJlbmRlcjtcblxuICAgIGlmICghcmVuZGVyUHJlc2VudCkge1xuICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIHR5cGVvZiBjdG9yLnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/JywgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogeW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBkZWZpbmUgYHJlbmRlcmAuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmdldEluaXRpYWxTdGF0ZSAmJiAhaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkICYmICFpbnN0YW5jZS5zdGF0ZSkge1xuICAgICAgZXJyb3IoJ2dldEluaXRpYWxTdGF0ZSB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdEaWQgeW91IG1lYW4gdG8gZGVmaW5lIGEgc3RhdGUgcHJvcGVydHkgaW5zdGVhZD8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmICFpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBkZWZhdWx0UHJvcHMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcFR5cGVzKSB7XG4gICAgICBlcnJvcigncHJvcFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlKSB7XG4gICAgICBlcnJvcignY29udGV4dFR5cGUgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZSBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChjdG9yLmNoaWxkQ29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuaGFzKGN0b3IpICYmIC8vIFN0cmljdCBNb2RlIGhhcyBpdHMgb3duIHdhcm5pbmcgZm9yIGxlZ2FjeSBjb250ZXh0LCBzbyB3ZSBjYW4gc2tpcFxuICAgICAgLy8gdGhpcyBvbmUuXG4gICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCQxLmFkZChjdG9yKTtcblxuICAgICAgICBlcnJvcignJXMgdXNlcyB0aGUgbGVnYWN5IGNoaWxkQ29udGV4dFR5cGVzIEFQSSB3aGljaCBpcyBubyBsb25nZXIgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBVc2UgJyArICdSZWFjdC5jcmVhdGVDb250ZXh0KCkgaW5zdGVhZFxcblxcbi4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQkMS5oYXMoY3RvcikgJiYgLy8gU3RyaWN0IE1vZGUgaGFzIGl0cyBvd24gd2FybmluZyBmb3IgbGVnYWN5IGNvbnRleHQsIHNvIHdlIGNhbiBza2lwXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0JDEuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyB1c2VzIHRoZSBsZWdhY3kgY29udGV4dFR5cGVzIEFQSSB3aGljaCBpcyBubyBsb25nZXIgc3VwcG9ydGVkICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBVc2UgJyArICdSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBzdGF0aWMgY29udGV4dFR5cGUgaW5zdGVhZC5cXG5cXG4nICsgJ0xlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCdjb250ZXh0VHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN0b3IuY29udGV4dFR5cGUgJiYgY3Rvci5jb250ZXh0VHlwZXMgJiYgIWRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5hZGQoY3Rvcik7XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRTaG91bGRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgJiYgdHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpLiAnICsgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBleHRlbmRpbmcgUmVhY3QuUHVyZUNvbXBvbmVudC4gJyArICdQbGVhc2UgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdXNlZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0EgcHVyZSBjb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBoYXNNdXRhdGVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wcyAhPT0gbmV3UHJvcHM7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IHVuZGVmaW5lZCAmJiBoYXNNdXRhdGVkUHJvcHMpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgXCJ1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIiwgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZXJyb3IoJ1NldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4nICsgJyBJbnN0ZWFkLCBkZWZpbmUgZGVmYXVsdFByb3BzIGFzIGEgc3RhdGljIHByb3BlcnR5IG9uICVzLicsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAhZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhjdG9yKSkge1xuICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmFkZChjdG9yKTtcblxuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIHNob3VsZCBiZSB1c2VkIHdpdGggY29tcG9uZW50RGlkVXBkYXRlKCkuICcgKyAnVGhpcyBjb21wb25lbnQgZGVmaW5lcyBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIG9ubHkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnLCBhZGRlbmR1bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBjb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IGN0b3IuY29udGV4dFR5cGVzO1xuICAgIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gY29udGV4dFR5cGVzICE9PSBudWxsICYmIGNvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnRleHQgPSBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA/IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCkgOiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuICB7XG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCdgJXNgIHVzZXMgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYnV0IGl0cyBpbml0aWFsIHN0YXRlIGlzICcgKyAnJXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLiBJbnN0ZWFkLCBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgYnkgJyArICdhc3NpZ25pbmcgYW4gb2JqZWN0IHRvIGB0aGlzLnN0YXRlYCBpbiB0aGUgY29uc3RydWN0b3Igb2YgYCVzYC4gJyArICdUaGlzIGVuc3VyZXMgdGhhdCBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBhcmd1bWVudHMgaGF2ZSBhIGNvbnNpc3RlbnQgc2hhcGUuJywgY29tcG9uZW50TmFtZSwgaW5zdGFuY2Uuc3RhdGUgPT09IG51bGwgPyAnbnVsbCcgOiAndW5kZWZpbmVkJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSAvLyBJZiBuZXcgY29tcG9uZW50IEFQSXMgYXJlIGRlZmluZWQsIFwidW5zYWZlXCIgbGlmZWN5Y2xlcyB3b24ndCBiZSBjYWxsZWQuXG4gICAgLy8gV2FybiBhYm91dCB0aGVzZSBsaWZlY3ljbGVzIGlmIHRoZXkgYXJlIHByZXNlbnQuXG4gICAgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIG1ldGhvZHMgdGhvdWdoLlxuXG5cbiAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGZvdW5kV2lsbE1vdW50TmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9IG51bGw7XG4gICAgICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbE1vdW50TmFtZSA9ICdjb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgICAgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA9ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJztcbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIHZhciBuZXdBcGlOYW1lID0gdHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nID8gJ2dldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpJyA6ICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpJztcblxuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuaGFzKF9jb21wb25lbnROYW1lKSkge1xuICAgICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuYWRkKF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICAgIGVycm9yKCdVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4nICsgJyVzIHVzZXMgJXMgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczolcyVzJXNcXG5cXG4nICsgJ1RoZSBhYm92ZSBsaWZlY3ljbGVzIHNob3VsZCBiZSByZW1vdmVkLiBMZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOlxcbicgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcycsIF9jb21wb25lbnROYW1lLCBuZXdBcGlOYW1lLCBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJywgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2FjaGUgdW5tYXNrZWQgY29udGV4dCBzbyB3ZSBjYW4gYXZvaWQgcmVjcmVhdGluZyBtYXNrZWQgY29udGV4dCB1bmxlc3MgbmVjZXNzYXJ5LlxuICAvLyBSZWFjdEZpYmVyQ29udGV4dCB1c3VhbGx5IHVwZGF0ZXMgdGhpcyBjYWNoZSBidXQgY2FuJ3QgZm9yIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2VzLlxuXG5cbiAgaWYgKGlzTGVnYWN5Q29udGV4dENvbnN1bWVyKSB7XG4gICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICB2YXIgb2xkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICB9XG5cbiAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsTW91bnQoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvIHRoaXMuc3RhdGUgaXMgJyArIFwiZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gIH1cblxuICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlKSB7XG4gICAge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSB7fTtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB7XG4gICAgaWYgKGluc3RhbmNlLnN0YXRlID09PSBuZXdQcm9wcykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgJyArIFwiYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gXCIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3Mod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH0gLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cblxuICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7IC8vIElmIHdlIGhhZCBhZGRpdGlvbmFsIHN0YXRlIHVwZGF0ZXMgZHVyaW5nIHRoaXMgbGlmZS1jeWNsZSwgbGV0J3NcbiAgICAvLyBwcm9jZXNzIHRoZW0gbm93LlxuXG4gICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICB7XG4gICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICB9XG5cbiAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVNb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBmaWJlckZsYWdzIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7XG4gICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB9XG5cbiAgdmFyIHNob3VsZFVwZGF0ZSA9IGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB8fCBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2ZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gICAgICB9XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFnczIgPSBVcGRhdGU7XG5cbiAgICAgIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IExheW91dFN0YXRpYztcbiAgICAgIH1cblxuICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF9maWJlckZsYWdzMiB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3MyO1xuICAgIH0gLy8gSWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybmVkIGZhbHNlLCB3ZSBzaG91bGQgc3RpbGwgdXBkYXRlIHRoZVxuICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuXG5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBuZXdQcm9wcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlblxuICAvLyBpZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJucyBmYWxzZS5cblxuXG4gIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7XG4gIGluc3RhbmNlLnN0YXRlID0gbmV3U3RhdGU7XG4gIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgcmV0dXJuIHNob3VsZFVwZGF0ZTtcbn0gLy8gSW52b2tlcyB0aGUgdXBkYXRlIGxpZmUtY3ljbGVzIGFuZCByZXR1cm5zIGZhbHNlIGlmIGl0IHNob3VsZG4ndCByZXJlbmRlci5cblxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHVucmVzb2x2ZWRPbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID8gdW5yZXNvbHZlZE9sZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB1bnJlc29sdmVkT2xkUHJvcHMpO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgdW5yZXNvbHZlZE5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IHVucmVzb2x2ZWROZXdQcm9wcyB8fCBvbGRDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCk7XG4gIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBuZXdTdGF0ZSA9IGluc3RhbmNlLnN0YXRlID0gb2xkU3RhdGU7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAodW5yZXNvbHZlZE9sZFByb3BzID09PSB1bnJlc29sdmVkTmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgJiYgIShlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHx8IC8vIFRPRE86IEluIHNvbWUgY2FzZXMsIHdlJ2xsIGVuZCB1cCBjaGVja2luZyBpZiBjb250ZXh0IGhhcyBjaGFuZ2VkIHR3aWNlLFxuICAvLyBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAgaGFzIGJlZW4gY2FsbGVkLiBOb3QgaWRlYWwsXG4gIC8vIGJ1dCBJJ20gbG9hdGggdG8gcmVmYWN0b3IgdGhpcyBmdW5jdGlvbi4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIG1lbW9pemVkXG4gIC8vIGNvbXBvbmVudHMgc28gaXQncyBub3QgdGhhdCBjb21tb24uXG4gIGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICA7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlKSB7XG4gIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBlcnJvciwgY2FsbCB0aGlzIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIGl0IGlzIHRocm93blxuICAvLyBzbyB0aGUgc3RhY2sgaXMgYWNjdXJhdGUuXG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIHNvdXJjZTogc291cmNlLFxuICAgIHN0YWNrOiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qoc291cmNlKSxcbiAgICBkaWdlc3Q6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIGRpZ2VzdCwgc3RhY2spIHtcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBudWxsLFxuICAgIHN0YWNrOiBzdGFjayAhPSBudWxsID8gc3RhY2sgOiBudWxsLFxuICAgIGRpZ2VzdDogZGlnZXN0ICE9IG51bGwgPyBkaWdlc3QgOiBudWxsXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHNvdXJjZSkgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWVNZXNzYWdlID0gY29tcG9uZW50TmFtZSA/IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudDpcIiA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuICAgICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlO1xuXG4gICAgICBpZiAoYm91bmRhcnkudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdDb25zaWRlciBhZGRpbmcgYW4gZXJyb3IgYm91bmRhcnkgdG8geW91ciB0cmVlIHRvIGN1c3RvbWl6ZSBlcnJvciBoYW5kbGluZyBiZWhhdmlvci5cXG4nICsgJ1Zpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihib3VuZGFyeSkgfHwgJ0Fub255bW91cyc7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCBcIiArIChcInVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSB5b3UgcHJvdmlkZWQsIFwiICsgZXJyb3JCb3VuZGFyeU5hbWUgKyBcIi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSwgU3luY0xhbmUpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgIC8vIGluZGljYXRlIHRoYXQgaXQgc3RpbGwgaGFzIHBlbmRpbmcgd29yay5cblxuXG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIFN5bmNMYW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbiAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgLy9cbiAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgLy9cbiAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgLy9cbiAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gIC8vXG4gIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gIC8vXG4gIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgLy9cbiAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gIC8vXG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAvL1xuICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gIC8vXG4gIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBUT0RPOiBJIHRoaW5rIHdlIGNhbiByZW1vdmUgdGhpcywgc2luY2Ugd2Ugbm93IHVzZSBgRGlkQ2FwdHVyZWAgaW5cbiAgLy8gdGhlIGJlZ2luIHBoYXNlIHRvIHByZXZlbnQgYW4gZWFybHkgYmFpbG91dC5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICByZXR1cm4gc3VzcGVuc2VCb3VuZGFyeTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24ocm9vdCwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSB7XG4gIC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS5cbiAgc291cmNlRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcblxuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnNcbiAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgcm9vdFJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS4gVGhlIGNvbXBvbmVudCBzdXNwZW5kZWQuXG4gICAgdmFyIHdha2VhYmxlID0gdmFsdWU7XG4gICAgcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIpO1xuXG4gICAge1xuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7XG4gICAgICB9XG4gICAgfVxuXG5cbiAgICB2YXIgc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTtcblxuICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7IC8vIFdlIG9ubHkgYXR0YWNoIHBpbmcgbGlzdGVuZXJzIGluIGNvbmN1cnJlbnQgbW9kZS4gTGVnYWN5IFN1c3BlbnNlIGFsd2F5c1xuICAgICAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuXG4gICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBhdHRhY2hSZXRyeUxpc3RlbmVyKHN1c3BlbnNlQm91bmRhcnksIHJvb3QsIHdha2VhYmxlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYm91bmRhcnkgd2FzIGZvdW5kLiBVbmxlc3MgdGhpcyBpcyBhIHN5bmMgdXBkYXRlLCB0aGlzIGlzIE9LLlxuICAgICAgLy8gV2UgY2FuIHN1c3BlbmQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG4gICAgICBpZiAoIWluY2x1ZGVzU3luY0xhbmUocm9vdFJlbmRlckxhbmVzKSkge1xuICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN5bmMgdXBkYXRlLiBTdXNwZW5kLiBTaW5jZSB3ZSdyZSBub3QgYWN0aXZhdGluZyBhXG4gICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGlzIHdpbGwgdW53aW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IHdpdGhvdXRcbiAgICAgICAgLy8gcGVyZm9ybWluZyBhIHNlY29uZCBwYXNzIHRvIHJlbmRlciBhIGZhbGxiYWNrLiAoVGhpcyBpcyBhcmd1YWJseSBob3dcbiAgICAgICAgLy8gcmVmcmVzaCB0cmFuc2l0aW9ucyBzaG91bGQgd29yaywgdG9vLCBzaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gY29tbWl0XG4gICAgICAgIC8vIHRoZSBmYWxsYmFja3MgYW55d2F5LilcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBjYXNlIGFsc28gYXBwbGllcyB0byBpbml0aWFsIGh5ZHJhdGlvbi5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gVGhpcyBpcyBhIHN5bmMvZGlzY3JldGUgdXBkYXRlLiBXZSB0cmVhdCB0aGlzIGNhc2UgbGlrZSBhbiBlcnJvclxuICAgICAgLy8gYmVjYXVzZSBkaXNjcmV0ZSByZW5kZXJzIGFyZSBleHBlY3RlZCB0byBwcm9kdWNlIGEgY29tcGxldGUgdHJlZVxuICAgICAgLy8gc3luY2hyb25vdXNseSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIGV4dGVybmFsIHN0YXRlLlxuXG5cbiAgICAgIHZhciB1bmNhdWdodFN1c3BlbnNlRXJyb3IgPSBuZXcgRXJyb3IoJ0EgY29tcG9uZW50IHN1c3BlbmRlZCB3aGlsZSByZXNwb25kaW5nIHRvIHN5bmNocm9ub3VzIGlucHV0LiBUaGlzICcgKyAnd2lsbCBjYXVzZSB0aGUgVUkgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIGxvYWRpbmcgaW5kaWNhdG9yLiBUbyAnICsgJ2ZpeCwgdXBkYXRlcyB0aGF0IHN1c3BlbmQgc2hvdWxkIGJlIHdyYXBwZWQgJyArICd3aXRoIHN0YXJ0VHJhbnNpdGlvbi4nKTsgLy8gSWYgd2UncmUgb3V0c2lkZSBhIHRyYW5zaXRpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBlcnJvciBwYXRoLlxuICAgICAgLy8gVGhlIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBuZWFyZXN0IHN1c3BlbnNlIGJvdW5kYXJ5LlxuXG4gICAgICB2YWx1ZSA9IHVuY2F1Z2h0U3VzcGVuc2VFcnJvcjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgZXJyb3IsIG5vdCBhIFN1c3BlbnNlIHdha2VhYmxlLlxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcblxuICAgICAgdmFyIF9zdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpOyAvLyBJZiB0aGUgZXJyb3Igd2FzIHRocm93biBkdXJpbmcgaHlkcmF0aW9uLCB3ZSBtYXkgYmUgYWJsZSB0byByZWNvdmVyIGJ5XG4gICAgICAvLyBkaXNjYXJkaW5nIHRoZSBkZWh5ZHJhdGVkIGNvbnRlbnQgYW5kIHN3aXRjaGluZyB0byBhIGNsaWVudCByZW5kZXIuXG4gICAgICAvLyBJbnN0ZWFkIG9mIHN1cmZhY2luZyB0aGUgZXJyb3IsIGZpbmQgdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnlcbiAgICAgIC8vIGFuZCByZW5kZXIgaXQgYWdhaW4gd2l0aG91dCBoeWRyYXRpb24uXG5cblxuICAgICAgaWYgKF9zdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFNldCBhIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgdHJ5IHJlbmRlcmluZyB0aGUgbm9ybWFsXG4gICAgICAgICAgLy8gY2hpbGRyZW4gYWdhaW4sIG5vdCB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgX3N1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgIH1cblxuICAgICAgICBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoX3N1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gRXZlbiB0aG91Z2ggdGhlIHVzZXIgbWF5IG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGVycm9yLCB3ZSBzaG91bGRcbiAgICAgICAgLy8gc3RpbGwgbG9nIGl0IHNvIGl0IGNhbiBiZSBmaXhlZC5cblxuICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICByZW5kZXJEaWRFcnJvcih2YWx1ZSk7IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIHVwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgZXJyb3JJbmZvLCBfbGFuZSk7XG5cbiAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF91cGRhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICB9IHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGdldFN1c3BlbmRlZENhY2hlKCkge1xuICB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IHN1c3BlbmRzLiBJdCByZXR1cm5zIHRoZVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xudmFyIGRpZFdhcm5BYm91dERlZmF1bHRQcm9wc09uRnVuY3Rpb25Db21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0QmFkQ2xhc3MgPSB7fTtcbiAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnMgPSB7fTtcbiAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlciA9IHt9O1xuICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucyA9IHt9O1xuICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG4gICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc29cbiAgICAvLyBsZXQncyB0aHJvdyBpdCBvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvcmsgb2YgcmVjb25jaWxlQ2hpbGRyZW4uIEl0J3MgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZVxuICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlXG4gIC8vIGVmZmVjdCBvZiBhbGwgY3VycmVudCBjaGlsZHJlbiBiZWluZyB1bm1vdW50ZWQ7IGV2ZW4gaWYgdGhlIHR5cGUgYW5kIGtleVxuICAvLyBhcmUgdGhlIHNhbWUsIHRoZSBvbGQgY2hpbGQgaXMgdW5tb3VudGVkIGFuZCBhIG5ldyBjaGlsZCBpcyBjcmVhdGVkLlxuICAvL1xuICAvLyBUbyBkbyB0aGlzLCB3ZSdyZSBnb2luZyB0byBnbyB0aHJvdWdoIHRoZSByZWNvbmNpbGUgYWxnb3JpdGhtIHR3aWNlLiBJblxuICAvLyB0aGUgZmlyc3QgcGFzcywgd2Ugc2NoZWR1bGUgYSBkZWxldGlvbiBmb3IgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuIGJ5XG4gIC8vIHBhc3NpbmcgbnVsbC5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIG1vdW50IHRoZSBuZXcgY2hpbGRyZW4uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgd2VcbiAgLy8gcGFzcyBudWxsIGluIHBsYWNlIG9mIHdoZXJlIHdlIHVzdWFsbHkgcGFzcyB0aGUgY3VycmVudCBjaGlsZCBzZXQuIFRoaXMgaGFzXG4gIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyXG4gIC8vIGlkZW50aXRpZXMgbWF0Y2guXG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcblxuICAgIGlmIChpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpICYmIENvbXBvbmVudC5jb21wYXJlID09PSBudWxsICYmIC8vIFNpbXBsZU1lbW9Db21wb25lbnQgY29kZXBhdGggZG9lc24ndCByZXNvbHZlIG91dGVyIHByb3BzIGVpdGhlci5cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHBsYWluIGZ1bmN0aW9uIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQgcHJvcHMsXG4gICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdFxuICAgICAgLy8gdG8gYSBTaW1wbGVNZW1vQ29tcG9uZW50IHRvIGFsbG93IGZhc3QgcGF0aCB1cGRhdGVzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZWRUeXBlO1xuXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAgZXJyb3IoJyVzOiBTdXBwb3J0IGZvciBkZWZhdWx0UHJvcHMgd2lsbCBiZSByZW1vdmVkIGZyb20gbWVtbyBjb21wb25lbnRzICcgKyAnaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gVXNlIEphdmFTY3JpcHQgZGVmYXVsdCBwYXJhbWV0ZXJzIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhDb21wb25lbnQudHlwZSwgbnVsbCwgbmV4dFByb3BzLCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyTGFuZXMpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHtcbiAgICB2YXIgX3R5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKF9pbm5lclByb3BUeXBlcykge1xuICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkXG5cbiAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBvdXRlck1lbW9UeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG5cbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7XG4gICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gbnVsbDtcbiAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLlxuXG5cbiAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcblxuICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG91dGVyTWVtb1R5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuXG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7IC8vIFRoZSBwcm9wcyBhcmUgc2hhbGxvd2x5IGVxdWFsLiBSZXVzZSB0aGUgcHJldmlvdXMgcHJvcHMgb2JqZWN0LCBsaWtlIHdlXG4gICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIHRoYXQgdGhlIHByb3BzIG9iamVjdCBpcyByZWZlcmVudGlhbGx5XG4gICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkgXHUyMDE0IGxpa2UgaWYgdGhlIHByb3BzXG4gICAgICAvLyBhcmUgc2hhbGxvd2x5IGVxdWFsLCBidXQgdGhlcmUncyBhIGxvY2FsIHN0YXRlIG9yIGNvbnRleHQgdXBkYXRlIGluIHRoZVxuICAgICAgLy8gc2FtZSBiYXRjaC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBhcyBhIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGFpbSB0byBtYWtlIHRoZSBiZWhhdmlvciBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgZGlmZmVyZW50IHdheXMgb2YgbWVtb2l6aW5nIGEgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgUmVhY3QubWVtb1xuICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvblxuICAgICAgLy8gY29tcG9uZW50IChTaW1wbGVNZW1vQ29tcG9uZW50KSB2ZXJzdXMgaWYgeW91IHBhc3MgYSBkaWZmZXJlbnQgdHlwZVxuICAgICAgLy8gbGlrZSBmb3J3YXJkUmVmIChNZW1vQ29tcG9uZW50KS4gQnV0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3RcbiAgICAgIC8vIGFmZmVjdCB3aGV0aGVyIHRoZSBwcm9wcyBvYmplY3QgaXMgcmV1c2VkIGR1cmluZyBhIGJhaWxvdXQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcztcblxuICAgICAgaWYgKCFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2VcbiAgICAgICAgLy8gd2UncmUgYmFpbGluZyBvdXQgZWFybHkgKndpdGhvdXQqIGV2YWx1YXRpbmcgdGhlIGNvbXBvbmVudCwgd2UgbmVlZFxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBpdCBoZXJlLCB0b28uIFJlc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBmaWJlci5cbiAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsXG4gICAgICAgIC8vIGJlY2F1c2UgYSBNZW1vQ29tcG9uZW50IGZpYmVyIGRvZXMgbm90IGhhdmUgaG9va3Mgb3IgYW4gdXBkYXRlIHF1ZXVlO1xuICAgICAgICAvLyByYXRoZXIsIGl0IHdyYXBzIGFyb3VuZCBhbiBpbm5lciBjb21wb25lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90XG4gICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLlxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoZSByZXNldCBhdCBpbiBiZWdpbldvcmsgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBzbyB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHtcbiAgICAvLyBSZW5kZXJpbmcgYSBoaWRkZW4gdHJlZS5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBob3cgT2Zmc2NyZWVuIHNob3VsZCB3b3JrIHdpdGggdHJhbnNpdGlvbnMgaW4gdGhlIGZ1dHVyZVxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXRcbiAgICAgIC8vIGFuZCByZXN1bWUgdGhpcyB0cmVlIGxhdGVyLlxuXG4gICAgICB2YXIgbmV4dEJhc2VMYW5lcztcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkJhc2VMYW5lcyA9IHByZXZTdGF0ZS5iYXNlTGFuZXM7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IHNwYXduZWRDYWNoZVBvb2wsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAvLyB0byBhdm9pZCBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cblxuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlci4gVGhlIHN1cnJvdW5kaW5nIHZpc2libGUgY29udGVudCBoYXMgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuXG4gICAgICAvLyBSZW5kZXJpbmcgYXQgb2Zmc2NyZWVuLCBzbyB3ZSBjYW4gY2xlYXIgdGhlIGJhc2UgbGFuZXMuXG4gICAgICB2YXIgX25leHRTdGF0ZTIgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlMjsgLy8gUHVzaCB0aGUgbGFuZXMgdGhhdCB3ZXJlIHNraXBwZWQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuXG4gICAgICB2YXIgc3VidHJlZVJlbmRlckxhbmVzID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmJhc2VMYW5lcyA6IHJlbmRlckxhbmVzO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbmRlcmluZyBhIHZpc2libGUgdHJlZS5cbiAgICB2YXIgX3N1YnRyZWVSZW5kZXJMYW5lcztcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuXG5mdW5jdGlvbiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwgJiYgcmVmICE9PSBudWxsIHx8IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5yZWYgIT09IHJlZikge1xuICAgIC8vIFNjaGVkdWxlIGEgUmVmIGVmZmVjdFxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICAgIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBMYXp5IGNvbXBvbmVudCBwcm9wcyBjYW4ndCBiZSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLlxuICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7XG4gICAgICAgIGNoZWNrUHJvcFR5cGVzKGlubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0O1xuXG4gIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIG5leHRDaGlsZHJlbjtcbiAgdmFyIGhhc0lkO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7XG4gICAgYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7XG4gICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIGVycm9yLlxuICAgIHN3aXRjaCAoc2hvdWxkRXJyb3Iod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICBjYXNlIGZhbHNlOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRPRE8gVGhpcyB3YXkgb2YgcmVzZXR0aW5nIHRoZSBlcnJvciBib3VuZGFyeSBzdGF0ZSBpcyBhIGhhY2suXG4gICAgICAgICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/XG5cbiAgICAgICAgICB2YXIgdGVtcEluc3RhbmNlID0gbmV3IGN0b3Iod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcywgX2luc3RhbmNlLmNvbnRleHQpO1xuICAgICAgICAgIHZhciBzdGF0ZSA9IHRlbXBJbnN0YW5jZS5zdGF0ZTtcblxuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVyLmVucXVldWVTZXRTdGF0ZShfaW5zdGFuY2UsIHN0YXRlLCBudWxsKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcblxuICAgICAgICAgIHZhciBlcnJvciQxID0gbmV3IEVycm9yKCdTaW11bGF0ZWQgZXJyb3IgY29taW5nIGZyb20gRGV2VG9vbHMnKTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCB3b3JrSW5Qcm9ncmVzcyksIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZTtcblxuICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gSW4gdGhlIGluaXRpYWwgcGFzcyB3ZSBtaWdodCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnYSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRVbml0T2ZXb3JrO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFJlZnMgc2hvdWxkIHVwZGF0ZSBldmVuIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgZGlkQ2FwdHVyZUVycm9yID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKCFzaG91bGRVcGRhdGUgJiYgIWRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIENvbnRleHQgcHJvdmlkZXJzIHNob3VsZCBkZWZlciB0byBzQ1UgZm9yIHJlbmRlcmluZ1xuICAgIGlmIChoYXNDb250ZXh0KSB7XG4gICAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBSZXJlbmRlclxuXG4gIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgbmV4dENoaWxkcmVuO1xuXG4gIGlmIChkaWRDYXB0dXJlRXJyb3IgJiYgdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBJZiB3ZSBjYXB0dXJlZCBhbiBlcnJvciwgYnV0IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpcyBub3QgZGVmaW5lZCxcbiAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvXG4gICAgLy8gcmUtcmVuZGVyIGEgZmFsbGJhY2suIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUgZXZlcnlvbmUgdG9cbiAgICAvLyB0aGUgbmV3IEFQSS5cbiAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcblxuICAgIHtcbiAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICAgIG5leHRDaGlsZHJlbiA9IGluc3RhbmNlLnJlbmRlcigpO1xuXG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIGN1cnJlbnQgZmliZXIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHByZXZDaGlsZHJlbiA9IHByZXZTdGF0ZS5lbGVtZW50O1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cblxuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFN0YXRlLmVsZW1lbnQ7XG5cbiAgaWYgKCBwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkKSB7XG4gICAgLy8gVGhpcyBpcyBhIGh5ZHJhdGlvbiByb290IHdob3NlIHNoZWxsIGhhcyBub3QgeWV0IGh5ZHJhdGVkLiBXZSBzaG91bGRcbiAgICAvLyBhdHRlbXB0IHRvIGh5ZHJhdGUuXG4gICAgLy8gRmxpcCBpc0RlaHlkcmF0ZWQgdG8gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB3aGVuIHRoaXMgcmVuZGVyXG4gICAgLy8gZmluaXNoZXMsIHRoZSByb290IHdpbGwgbm8gbG9uZ2VyIGJlIGRlaHlkcmF0ZWQuXG4gICAgdmFyIG92ZXJyaWRlU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBuZXh0Q2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGZhbHNlLFxuICAgICAgY2FjaGU6IG5leHRTdGF0ZS5jYWNoZSxcbiAgICAgIHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6IG5leHRTdGF0ZS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLFxuICAgICAgdHJhbnNpdGlvbnM6IG5leHRTdGF0ZS50cmFuc2l0aW9uc1xuICAgIH07XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIGBiYXNlU3RhdGVgIGNhbiBhbHdheXMgYmUgdGhlIGxhc3Qgc3RhdGUgYmVjYXVzZSB0aGUgcm9vdCBkb2Vzbid0XG4gICAgLy8gaGF2ZSByZWR1Y2VyIGZ1bmN0aW9ucyBzbyBpdCBkb2Vzbid0IG5lZWQgcmViYXNpbmcuXG5cbiAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBvdmVycmlkZVN0YXRlO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBvdmVycmlkZVN0YXRlO1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBhIHByZXZpb3VzIGF0dGVtcHQgdG8gaHlkcmF0ZSB0aGUgc2hlbGwsIHNvIHdlXG4gICAgICAvLyBmb3JjZWQgYSBjbGllbnQgcmVuZGVyLlxuICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcuIEJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbmVkIG91dHNpZGUgJyArICdvZiBhIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGUgZW50aXJlIHJvb3Qgd2lsbCBzd2l0Y2ggdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpO1xuICAgIH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBfcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhpcyByb290IHJlY2VpdmVkIGFuIGVhcmx5IHVwZGF0ZSwgYmVmb3JlIGFueXRoaW5nIHdhcyBhYmxlICcgKyAnaHlkcmF0ZS4gU3dpdGNoZWQgdGhlIGVudGlyZSByb290IHRvIGNsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCBfcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBvdXRlcm1vc3Qgc2hlbGwgaGFzIG5vdCBoeWRyYXRlZCB5ZXQuIFN0YXJ0IGh5ZHJhdGluZy5cbiAgICAgIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB2YXIgY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAvLyBNYXJrIGVhY2ggY2hpbGQgYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgIG5vZGUuZmxhZ3MgPSBub2RlLmZsYWdzICYgflBsYWNlbWVudCB8IEh5ZHJhdGluZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUm9vdCBpcyBub3QgZGVoeWRyYXRlZC4gRWl0aGVyIHRoaXMgaXMgYSBjbGllbnQtb25seSByb290LCBvciBpdFxuICAgIC8vIGFscmVhZHkgaHlkcmF0ZWQuXG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG5leHRDaGlsZHJlbiA9PT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJldlByb3BzID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IG51bGw7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBpc0RpcmVjdFRleHRDaGlsZCA9IHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIG5leHRQcm9wcyk7XG5cbiAgaWYgKGlzRGlyZWN0VGV4dENoaWxkKSB7XG4gICAgLy8gV2Ugc3BlY2lhbCBjYXNlIGEgZGlyZWN0IHRleHQgY2hpbGQgb2YgYSBob3N0IG5vZGUuIFRoaXMgaXMgYSBjb21tb25cbiAgICAvLyBjYXNlLiBXZSB3b24ndCBoYW5kbGUgaXQgYXMgYSByZWlmaWVkIGNoaWxkLiBXZSB3aWxsIGluc3RlYWQgaGFuZGxlXG4gICAgLy8gdGhpcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudCB0aGF0IGFsc28gaGFzIGFjY2VzcyB0byB0aGlzIHByb3AuIFRoYXRcbiAgICAvLyBhdm9pZHMgYWxsb2NhdGluZyBhbm90aGVyIEhvc3RUZXh0IGZpYmVyIGFuZCB0cmF2ZXJzaW5nIGl0LlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG4gIH0gZWxzZSBpZiAocHJldlByb3BzICE9PSBudWxsICYmIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByZXZQcm9wcykpIHtcbiAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBhIGRpcmVjdCB0ZXh0IGNoaWxkIHRvIGEgbm9ybWFsIGNoaWxkLCBvciB0b1xuICAgIC8vIGVtcHR5LCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoZSB0ZXh0IGNvbnRlbnQgdG8gYmUgcmVzZXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ29udGVudFJlc2V0O1xuICB9XG5cbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIFRoaXMgaXMgdGVybWluYWwuIFdlJ2xsIGRvIHRoZSBjb21wbGV0aW9uIHN0ZXBcbiAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKSB7XG4gIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbGF6eUNvbXBvbmVudCA9IGVsZW1lbnRUeXBlO1xuICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcbiAgdmFyIENvbXBvbmVudCA9IGluaXQocGF5bG9hZCk7IC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuXG4gIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQ7XG4gIHZhciByZXNvbHZlZFRhZyA9IHdvcmtJblByb2dyZXNzLnRhZyA9IHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkO1xuXG4gIHN3aXRjaCAocmVzb2x2ZWRUYWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIHJlc29sdmVkUHJvcHMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIGhpbnQgPSAnJztcblxuICB7XG4gICAgaWYgKENvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgQ29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgaGludCA9ICcgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT8nO1xuICAgIH1cbiAgfSAvLyBUaGlzIG1lc3NhZ2UgaW50ZW50aW9uYWxseSBkb2Vzbid0IG1lbnRpb24gRm9yd2FyZFJlZiBvciBNZW1vQ29tcG9uZW50XG4gIC8vIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCdzIGEgc2VwYXJhdGUgdHlwZSBvZiB3b3JrIGlzIGFuXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbC5cblxuXG4gIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgdHlwZSBpcyBpbnZhbGlkLiBSZWNlaXZlZCBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0bzogXCIgKyBDb21wb25lbnQgKyBcIi4gXCIgKyAoXCJMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQpKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOyAvLyBQcm9tb3RlIHRoZSBmaWJlciB0byBhIGNsYXNzIGFuZCB0cnkgcmVuZGVyaW5nIGFnYWluLlxuXG4gIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIGEgZm9yayBvZiBgdXBkYXRlQ2xhc3NDb21wb25lbnRgXG4gIC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gIHZhciBoYXNDb250ZXh0O1xuXG4gIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gZWxzZSB7XG4gICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpO1xuICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBjb250ZXh0O1xuXG4gIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGZhbHNlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciB2YWx1ZTtcbiAgdmFyIGhhc0lkO1xuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB7XG4gICAgaWYgKENvbXBvbmVudC5wcm90b3R5cGUgJiYgdHlwZW9mIENvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArIFwiSWYgeW91IGNhbid0IHVzZSBhIGNsYXNzIHRyeSBhc3NpZ25pbmcgdGhlIHByb3RvdHlwZSBvbiB0aGUgZnVuY3Rpb24gYXMgYSB3b3JrYXJvdW5kLiBcIiArIFwiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgXCIgKyAnY2Fubm90IGJlIGNhbGxlZCB3aXRoIGBuZXdgIGJ5IFJlYWN0LicsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIC8vIFJ1biB0aGVzZSBjaGVja3MgaW4gcHJvZHVjdGlvbiBvbmx5IGlmIHRoZSBmbGFnIGlzIG9mZi5cbiAgLy8gRXZlbnR1YWxseSB3ZSdsbCBkZWxldGUgdGhpcyBicmFuY2ggYWx0b2dldGhlci5cbiAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lMiA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgY2xhc3MgaW5zdGFuY2VcblxuXG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gQ2xhc3NDb21wb25lbnQ7IC8vIFRocm93IG91dCBhbnkgaG9va3MgdGhhdCB3ZXJlIHVzZWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gICAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAgIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICAgIHZhciBoYXNDb250ZXh0ID0gZmFsc2U7XG5cbiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgaGFzQ29udGV4dCA9IHRydWU7XG4gICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzQ29udGV4dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB2YWx1ZS5zdGF0ZSAhPT0gbnVsbCAmJiB2YWx1ZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUuc3RhdGUgOiBudWxsO1xuICAgIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCB2YWx1ZSk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIGZpbmlzaENsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGZ1bmN0aW9uIGNvbXBvbmVudFxuICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IEZ1bmN0aW9uQ29tcG9uZW50O1xuXG4gICAge1xuXG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKG51bGwsIHdvcmtJblByb2dyZXNzLCB2YWx1ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAge1xuICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCkge1xuICB7XG4gICAgaWYgKENvbXBvbmVudCkge1xuICAgICAgaWYgKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogY2hpbGRDb250ZXh0VHlwZXMgY2Fubm90IGJlIGRlZmluZWQgb24gYSBmdW5jdGlvbiBjb21wb25lbnQuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgfVxuXG4gICAgICB2YXIgd2FybmluZ0tleSA9IG93bmVyTmFtZSB8fCAnJztcbiAgICAgIHZhciBkZWJ1Z1NvdXJjZSA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZTtcblxuICAgICAgaWYgKGRlYnVnU291cmNlKSB7XG4gICAgICAgIHdhcm5pbmdLZXkgPSBkZWJ1Z1NvdXJjZS5maWxlTmFtZSArICc6JyArIGRlYnVnU291cmNlLmxpbmVOdW1iZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnMuICcgKyAnQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgcmVmIHdpbGwgZmFpbC4gJyArICdEaWQgeW91IG1lYW4gdG8gdXNlIFJlYWN0LmZvcndhcmRSZWYoKT8lcycsIGluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggQ29tcG9uZW50LmRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCclczogU3VwcG9ydCBmb3IgZGVmYXVsdFByb3BzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGZ1bmN0aW9uIGNvbXBvbmVudHMgJyArICdpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBVc2UgSmF2YVNjcmlwdCBkZWZhdWx0IHBhcmFtZXRlcnMgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXREZWZhdWx0UHJvcHNPbkZ1bmN0aW9uQ29tcG9uZW50W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgX2NvbXBvbmVudE5hbWUzKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50LmNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTQgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0pIHtcbiAgICAgICAgZXJyb3IoJyVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGNvbnRleHRUeXBlLicsIF9jb21wb25lbnROYW1lNCk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgU1VTUEVOREVEX01BUktFUiA9IHtcbiAgZGVoeWRyYXRlZDogbnVsbCxcbiAgdHJlZUNvbnRleHQ6IG51bGwsXG4gIHJldHJ5TGFuZTogTm9MYW5lXG59O1xuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IHJlbmRlckxhbmVzLFxuICAgIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSxcbiAgICB0cmFuc2l0aW9uczogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNhY2hlUG9vbCA9IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpLFxuICAgIGNhY2hlUG9vbDogY2FjaGVQb29sLFxuICAgIHRyYW5zaXRpb25zOiBwcmV2T2Zmc2NyZWVuU3RhdGUudHJhbnNpdGlvbnNcbiAgfTtcbn0gLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIGlubGluZSB0aGlzIGJhY2tcblxuXG5mdW5jdGlvbiBzaG91bGRSZW1haW5PbkZhbGxiYWNrKHN1c3BlbnNlQ29udGV4dCwgY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0b1xuICAvLyByZW1haW4gb24gdGhhdCBmYWxsYmFjayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIHJlc29sdmVkLlxuICAvLyBGb3IgZXhhbXBsZSwgU3VzcGVuc2VMaXN0IGNvb3JkaW5hdGVzIHdoZW4gbmVzdGVkIGNvbnRlbnQgYXBwZWFycy5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICAvLyBDdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBEb24ndCBoaWRlIGl0LCBldmVuIGlmIEZvcmNlU3VzcGVuc2VGYWxsYmFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQXZvaWRlZCBib3VuZGFyaWVzIGFyZSBub3QgY29uc2lkZXJlZCBzaW5jZSB0aGV5IGNhbm5vdCBoYW5kbGUgcHJlZmVycmVkIGZhbGxiYWNrIHN0YXRlcy5cbiAgICAgIHtcbiAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gYWRkU3VidHJlZVN1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gT0ssIHRoZSBuZXh0IHBhcnQgaXMgY29uZnVzaW5nLiBXZSdyZSBhYm91dCB0byByZWNvbmNpbGUgdGhlIFN1c3BlbnNlXG4gIC8vIGJvdW5kYXJ5J3MgY2hpbGRyZW4uIFRoaXMgaW52b2x2ZXMgc29tZSBjdXN0b20gcmVjb25jaWxpYXRpb24gbG9naWMuIFR3b1xuICAvLyBtYWluIHJlYXNvbnMgdGhpcyBpcyBzbyBjb21wbGljYXRlZC5cbiAgLy9cbiAgLy8gRmlyc3QsIExlZ2FjeSBNb2RlIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhlXG4gIC8vIHByaW1hcnkgdHJlZSB3aWxsIGNvbW1pdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUsIHNvIHdoZW4gd2UgZG8gdGhlXG4gIC8vIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2ssIHdlIGRvIHNvbWUgZXhjZWVkaW5nbHksIHVoLCBjbGV2ZXJcbiAgLy8gaGFja3MgdG8gbWFrZSB0aGF0IG5vdCB0b3RhbGx5IGJyZWFrLiBMaWtlIHRyYW5zZmVycmluZyBlZmZlY3RzIGFuZFxuICAvLyBkZWxldGlvbnMgZnJvbSBoaWRkZW4gdHJlZS4gSW4gQ29uY3VycmVudCBNb2RlLCBpdCdzIG11Y2ggc2ltcGxlcixcbiAgLy8gYmVjYXVzZSB3ZSBiYWlsb3V0IG9uIHRoZSBwcmltYXJ5IHRyZWUgY29tcGxldGVseSBhbmQgbGVhdmUgaXQgaW4gaXRzIG9sZFxuICAvLyBzdGF0ZSwgbm8gZWZmZWN0cy4gU2FtZSBhcyB3aGF0IHdlIGRvIGZvciBPZmZzY3JlZW4gKGV4Y2VwdCB0aGF0XG4gIC8vIE9mZnNjcmVlbiBkb2Vzbid0IGhhdmUgdGhlIGZpcnN0IHJlbmRlciBwYXNzKS5cbiAgLy9cbiAgLy8gU2Vjb25kIGlzIGh5ZHJhdGlvbi4gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIFN1c3BlbnNlIGZpYmVyIGhhcyBhIHNsaWdodGx5XG4gIC8vIGRpZmZlcmVudCBsYXlvdXQsIHdoZXJlIHRoZSBjaGlsZCBwb2ludHMgdG8gYSBkZWh5ZHJhdGVkIGZyYWdtZW50LCB3aGljaFxuICAvLyBjb250YWlucyB0aGUgRE9NIHJlbmRlcmVkIGJ5IHRoZSBzZXJ2ZXIuXG4gIC8vXG4gIC8vIFRoaXJkLCBldmVuIGlmIHlvdSBzZXQgYWxsIHRoYXQgYXNpZGUsIFN1c3BlbnNlIGlzIGxpa2UgZXJyb3IgYm91bmRhcmllcyBpblxuICAvLyB0aGF0IHdlIGZpcnN0IHdlIHRyeSB0byByZW5kZXIgb25lIHRyZWUsIGFuZCBpZiB0aGF0IGZhaWxzLCB3ZSByZW5kZXIgYWdhaW5cbiAgLy8gYW5kIHN3aXRjaCB0byBhIGRpZmZlcmVudCB0cmVlLiBMaWtlIGEgdHJ5L2NhdGNoIGJsb2NrLiBTbyB3ZSBoYXZlIHRvIHRyYWNrXG4gIC8vIHdoaWNoIGJyYW5jaCB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nLiBJZGVhbGx5IHdlIHdvdWxkIG1vZGVsIHRoaXMgdXNpbmdcbiAgLy8gYSBzdGFjay5cblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuXG4gICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cblxuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZGVoeWRyYXRlZCA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKGRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBkZWh5ZHJhdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuXG4gICAgICByZXR1cm4gZmFsbGJhY2tGcmFnbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2RlaHlkcmF0ZWQgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgaWYgKF9kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgX2RlaHlkcmF0ZWQsIHByZXZTdGF0ZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbiwgX25leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkTGFuZXMgPSBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjIgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbmAgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZVxuICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKG9mZnNjcmVlblByb3BzLCBtb2RlLCBOb0xhbmVzLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSB0aGUgZmFsbGJhY2sgY2hpbGQgZnJhZ21lbnRcbiAgICB2YXIgZGVsZXRpb25zID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIE1ha2Ugc3VyZSB3ZSdyZSBvbiB0aGUgc2Vjb25kIHBhc3MsIGkuZS4gdGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgd2FzXG4gIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXNcbiAgLy8gd2hlbiBEZXZUb29scyBmb3JjZXMgdXMgdG8gZGlzcGxheSBhIGZhbGxiYWNrOyB3ZSBza2lwIHRoZSBmaXJzdCByZW5kZXJcbiAgLy8gcGFzcyBlbnRpcmVseSBhbmQgZ28gc3RyYWlnaHQgdG8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjay4gKEluIENvbmN1cnJlbnRcbiAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktXG4gIC8vIG9ubHkgY29kZXBhdGguKVxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50KSB7XG4gICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfSAvLyBUaGUgZmFsbGJhY2sgZmliZXIgd2FzIGFkZGVkIGFzIGEgZGVsZXRpb24gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTsgLy8gU2luY2Ugd2UncmUgcmV1c2luZyBhIGN1cnJlbnQgdHJlZSwgd2UgbmVlZCB0byByZXVzZSB0aGUgZmxhZ3MsIHRvby5cbiAgICAvLyAoV2UgZG9uJ3QgZG8gdGhpcyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBpbiBsZWdhY3kgbW9kZSB3ZSBkb24ndCByZS11c2VcbiAgICAvLyB0aGUgY3VycmVudCB0cmVlOyBzZWUgcHJldmlvdXMgYnJhbmNoLilcblxuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB9XG5cbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQsIGZhbGxiYWNrQ2hpbGRyZW4pO1xuICB9IGVsc2Uge1xuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gICAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gRmFsbGluZyBiYWNrIHRvIGNsaWVudCByZW5kZXJpbmcuIEJlY2F1c2UgdGhpcyBoYXMgcGVyZm9ybWFuY2VcbiAgLy8gaW1wbGljYXRpb25zLCBpdCdzIGNvbnNpZGVyZWQgYSByZWNvdmVyYWJsZSBlcnJvciwgZXZlbiB0aG91Z2ggdGhlIHVzZXJcbiAgLy8gbGlrZWx5IHdvbid0IG9ic2VydmUgYW55dGhpbmcgd3Jvbmcgd2l0aCB0aGUgVUkuXG4gIC8vXG4gIC8vIFRoZSBlcnJvciBpcyBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQgdG8gZW5mb3JjZSB0aGF0IGV2ZXJ5IGNhbGxlciBwcm92aWRlXG4gIC8vIGEgY3VzdG9tIG1lc3NhZ2UsIG9yIGV4cGxpY2l0bHkgb3B0IG91dCAoY3VycmVudGx5IHRoZSBvbmx5IHBhdGggdGhhdCBvcHRzXG4gIC8vIG91dCBpcyBsZWdhY3kgbW9kZTsgZXZlcnkgY29uY3VycmVudCBwYXRoIHByb3ZpZGVzIGFuIGVycm9yKS5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3IgIT09IG51bGwpIHtcbiAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICB9IC8vIFRoaXMgd2lsbCBhZGQgdGhlIG9sZCBmaWJlciB0byB0aGUgZGVsZXRpb24gbGlzdFxuXG5cbiAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gV2UncmUgbm93IG5vdCBzdXNwZW5kZWQgbm9yIGRlaHlkcmF0ZWQuXG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5XG4gIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCBmYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXJNb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgZmliZXJNb2RlKTtcbiAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIGZpYmVyTW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkpIGFscmVhZHkgbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgLy8gV2Ugd2lsbCBoYXZlIGRyb3BwZWQgdGhlIGVmZmVjdCBsaXN0IHdoaWNoIGNvbnRhaW5zIHRoZVxuICAgIC8vIGRlbGV0aW9uLiBXZSBuZWVkIHRvIHJlY29uY2lsZSB0byBkZWxldGUgdGhlIGN1cnJlbnQgY2hpbGQuXG4gICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBEdXJpbmcgdGhlIGZpcnN0IHBhc3MsIHdlJ2xsIGJhaWwgb3V0IGFuZCBub3QgZHJpbGwgaW50byB0aGUgY2hpbGRyZW4uXG4gIC8vIEluc3RlYWQsIHdlJ2xsIGxlYXZlIHRoZSBjb250ZW50IGluIHBsYWNlIGFuZCB0cnkgdG8gaHlkcmF0ZSBpdCBsYXRlci5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignQ2Fubm90IGh5ZHJhdGUgU3VzcGVuc2UgaW4gbGVnYWN5IG1vZGUuIFN3aXRjaCBmcm9tICcgKyAnUmVhY3RET00uaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIpIHRvICcgKyAnUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KScgKyAnLnJlbmRlcihlbGVtZW50KSBvciByZW1vdmUgdGhlIFN1c3BlbnNlIGNvbXBvbmVudHMgZnJvbSAnICsgJ3RoZSBzZXJ2ZXIgcmVuZGVyZWQgY29tcG9uZW50cy4nKTtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKFN5bmNMYW5lKTtcbiAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgIC8vIFRoaXMgaXMgYSBjbGllbnQtb25seSBib3VuZGFyeS4gU2luY2Ugd2Ugd29uJ3QgZ2V0IGFueSBjb250ZW50IGZyb20gdGhlIHNlcnZlclxuICAgIC8vIGZvciB0aGlzLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoYXQgYXQgYSBoaWdoZXIgcHJpb3JpdHkgYmFzZWQgb24gd2hlbiBpdCB3b3VsZFxuICAgIC8vIGhhdmUgdGltZWQgb3V0LiBJbiB0aGVvcnkgd2UgY291bGQgcmVuZGVyIGl0IGluIHRoaXMgcGFzcyBidXQgaXQgd291bGQgaGF2ZSB0aGVcbiAgICAvLyB3cm9uZyBwcmlvcml0eSBhc3NvY2lhdGVkIHdpdGggaXQgYW5kIHdpbGwgcHJldmVudCBoeWRyYXRpb24gb2YgcGFyZW50IHBhdGguXG4gICAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgd29yayBsZWZ0IG9uIGl0IHRvIHJlbmRlciBpdCBpbiBhIHNlcGFyYXRlIGNvbW1pdC5cbiAgICAvLyBUT0RPIFRoaXMgdGltZSBzaG91bGQgYmUgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHNlcnZlciByZW5kZXJlZCByZXNwb25zZSB0aGF0IGlzXG4gICAgLy8gYSBwYXJlbnQgdG8gdGhpcyBib3VuZGFyeSB3YXMgZGlzcGxheWVkLiBIb3dldmVyLCBzaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZVxuICAgIC8vIGEgcHJvdG9jb2wgdG8gdHJhbnNmZXIgdGhhdCB0aW1lLCB3ZSdsbCBqdXN0IGVzdGltYXRlIGl0IGJ5IHVzaW5nIHRoZSBjdXJyZW50XG4gICAgLy8gdGltZS4gVGhpcyB3aWxsIG1lYW4gdGhhdCBTdXNwZW5zZSB0aW1lb3V0cyBhcmUgc2xpZ2h0bHkgc2hpZnRlZCB0byBsYXRlciB0aGFuXG4gICAgLy8gdGhleSBzaG91bGQgYmUuXG4gICAgLy8gU2NoZWR1bGUgYSBub3JtYWwgcHJpIHVwZGF0ZSB0byByZW5kZXIgdGhpcyBjb250ZW50LlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoRGVmYXVsdEh5ZHJhdGlvbkxhbmUpO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlJ2xsIGNvbnRpbnVlIGh5ZHJhdGluZyB0aGUgcmVzdCBhdCBvZmZzY3JlZW4gcHJpb3JpdHkgc2luY2Ugd2UnbGwgYWxyZWFkeVxuICAgIC8vIGJlIHNob3dpbmcgdGhlIHJpZ2h0IGNvbnRlbnQgY29taW5nIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgbm8gcnVzaC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKE9mZnNjcmVlbkxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlaHlkcmF0ZWRTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZGlkU3VzcGVuZCwgbmV4dFByb3BzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLCByZW5kZXJMYW5lcykge1xuICBpZiAoIWRpZFN1c3BlbmQpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGFzcy4gQXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIFdlIHNob3VsZCBuZXZlciBiZSBoeWRyYXRpbmcgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzIHRoZSBmaXJzdCBwYXNzLFxuICAgIC8vIGJ1dCBhZnRlciB3ZSd2ZSBhbHJlYWR5IGNvbW1pdHRlZCBvbmNlLlxuICAgIHdhcm5JZkh5ZHJhdGluZygpO1xuXG4gICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIC8vIFRPRE86IFdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgbWFrZSB0aGlzIGVycm9yIGFyZ3VtZW50XG4gICAgICAvLyByZXF1aXJlZCBcdTIwMTQgZXZlcnkgY29uY3VycmVudCBtb2RlIHBhdGggdGhhdCBjYXVzZXMgaHlkcmF0aW9uIHRvXG4gICAgICAvLyBkZS1vcHQgdG8gY2xpZW50IHJlbmRlcmluZyBzaG91bGQgaGF2ZSBhbiBlcnJvciBtZXNzYWdlLlxuICAgICAgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgICAvLyBUaGlzIGJvdW5kYXJ5IGlzIGluIGEgcGVybWFuZW50IGZhbGxiYWNrIHN0YXRlLiBJbiB0aGlzIGNhc2UsIHdlJ2xsIG5ldmVyXG4gICAgICAvLyBnZXQgYW4gdXBkYXRlIGFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGh5ZHJhdGUgdGhlIGZpbmFsIGNvbnRlbnQuIExldCdzIGp1c3QgdHJ5IHRoZVxuICAgICAgLy8gY2xpZW50IHNpZGUgcmVuZGVyIGluc3RlYWQuXG4gICAgICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjaztcblxuICAgICAge1xuICAgICAgICB2YXIgX2dldFN1c3BlbnNlSW5zdGFuY2VGID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrRXJyb3JEZXRhaWxzKHN1c3BlbnNlSW5zdGFuY2UpO1xuXG4gICAgICAgIGRpZ2VzdCA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5kaWdlc3Q7XG4gICAgICAgIG1lc3NhZ2UgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYubWVzc2FnZTtcbiAgICAgICAgc3RhY2sgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuc3RhY2s7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvcjtcblxuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignVGhlIHNlcnZlciBjb3VsZCBub3QgZmluaXNoIHRoaXMgU3VzcGVuc2UgYm91bmRhcnksIGxpa2VseSAnICsgJ2R1ZSB0byBhbiBlcnJvciBkdXJpbmcgc2VydmVyIHJlbmRlcmluZy4gU3dpdGNoZWQgdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIGRpZ2VzdCwgc3RhY2spO1xuICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgY2FwdHVyZWRWYWx1ZSk7XG4gICAgfVxuICAgIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG5cblxuICAgIHZhciBoYXNDb250ZXh0Q2hhbmdlZCA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIGN1cnJlbnQuY2hpbGRMYW5lcyk7XG5cbiAgICBpZiAoZGlkUmVjZWl2ZVVwZGF0ZSB8fCBoYXNDb250ZXh0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG9cbiAgICAgIC8vIGh5ZHJhdGUgaXQuIFdlIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gaHlkcmF0ZSBpdCB1c2luZyBhIGhpZ2hlciBwcmlvcml0eSBsYW5lLlxuICAgICAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICBpZiAoYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gTm9MYW5lICYmIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKSB7XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBtdXRhdGluZyBzaW5jZSB0aGlzIHJlbmRlciB3aWxsIGdldCBpbnRlcnJ1cHRlZC4gVGhpc1xuICAgICAgICAgIC8vIGlzIG9uZSBvZiB0aGUgdmVyeSByYXJlIHRpbWVzIHdoZXJlIHdlIG11dGF0ZSB0aGUgY3VycmVudCB0cmVlXG4gICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lOyAvLyBUT0RPOiBJZGVhbGx5IHRoaXMgd291bGQgaW5oZXJpdCB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCByZW5kZXJcblxuICAgICAgICAgIHZhciBldmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoY3VycmVudCwgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSk7XG4gICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUsIGV2ZW50VGltZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSWYgd2UgaGF2ZSBzY2hlZHVsZWQgaGlnaGVyIHByaSB3b3JrIGFib3ZlLCB0aGlzIHdpbGwgcHJvYmFibHkganVzdCBhYm9ydCB0aGUgcmVuZGVyXG4gICAgICAvLyBzaW5jZSB3ZSBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgd29yaywgYnV0IGluIGNhc2UgaXQgZG9lc24ndCwgd2UgbmVlZCB0byBwcmVwYXJlIHRvXG4gICAgICAvLyByZW5kZXIgc29tZXRoaW5nLCBpZiB3ZSB0aW1lIG91dC4gRXZlbiBpZiB0aGF0IHJlcXVpcmVzIHVzIHRvIGRlbGV0ZSBldmVyeXRoaW5nIGFuZFxuICAgICAgLy8gc2tpcCBoeWRyYXRpb24uXG4gICAgICAvLyBEZWxheSBoYXZpbmcgdG8gZG8gdGhpcyBhcyBsb25nIGFzIHRoZSBzdXNwZW5zZSB0aW1lb3V0IGFsbG93cyB1cy5cblxuXG4gICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG5cbiAgICAgIHZhciBfY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGlzIFN1c3BlbnNlIGJvdW5kYXJ5IHJlY2VpdmVkIGFuIHVwZGF0ZSBiZWZvcmUgaXQgZmluaXNoZWQgJyArICdoeWRyYXRpbmcuIFRoaXMgY2F1c2VkIHRoZSBib3VuZGFyeSB0byBzd2l0Y2ggdG8gY2xpZW50IHJlbmRlcmluZy4gJyArICdUaGUgdXN1YWwgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHdyYXAgdGhlIG9yaWdpbmFsIHVwZGF0ZSAnICsgJ2luIHN0YXJ0VHJhbnNpdGlvbi4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpIHtcbiAgICAgIC8vIFRoaXMgY29tcG9uZW50IGlzIHN0aWxsIHBlbmRpbmcgbW9yZSBkYXRhIGZyb20gdGhlIHNlcnZlciwgc28gd2UgY2FuJ3QgaHlkcmF0ZSBpdHNcbiAgICAgIC8vIGNvbnRlbnQuIFdlIHRyZWF0IGl0IGFzIGlmIHRoaXMgY29tcG9uZW50IHN1c3BlbmRlZCBpdHNlbGYuIEl0IG1pZ2h0IHNlZW0gYXMgaWZcbiAgICAgIC8vIHdlIGNvdWxkIGp1c3QgdHJ5IHRvIHJlbmRlciBpdCBjbGllbnQtc2lkZSBpbnN0ZWFkLiBIb3dldmVyLCB0aGlzIHdpbGwgcGVyZm9ybSBhXG4gICAgICAvLyBsb3Qgb2YgdW5uZWNlc3Nhcnkgd29yayBhbmQgaXMgdW5saWtlbHkgdG8gY29tcGxldGUgc2luY2UgaXQgb2Z0ZW4gd2lsbCBzdXNwZW5kXG4gICAgICAvLyBvbiBtaXNzaW5nIGRhdGEgYW55d2F5LiBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbWlnaHQgYmUgYWJsZSB0byByZW5kZXIgbW9yZVxuICAgICAgLy8gdGhhbiB3ZSBjYW4gb24gdGhlIGNsaWVudCB5ZXQuIEluIHRoYXQgY2FzZSB3ZSdkIGVuZCB1cCB3aXRoIG1vcmUgZmFsbGJhY2sgc3RhdGVzXG4gICAgICAvLyBvbiB0aGUgY2xpZW50IHRoYW4gaWYgd2UganVzdCBsZWF2ZSBpdCBhbG9uZS4gSWYgdGhlIHNlcnZlciB0aW1lcyBvdXQgb3IgZXJyb3JzXG4gICAgICAvLyB0aGVzZSBzaG91bGQgdXBkYXRlIHRoaXMgYm91bmRhcnkgdG8gdGhlIHBlcm1hbmVudCBGYWxsYmFjayBzdGF0ZSBpbnN0ZWFkLlxuICAgICAgLy8gTWFyayBpdCBhcyBoYXZpbmcgY2FwdHVyZWQgKGkuZS4gc3VzcGVuZGVkKS5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIExlYXZlIHRoZSBjaGlsZCBpbiBwbGFjZS4gSS5lLiB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHJ5IHRoaXMgYm91bmRhcnkgb25jZSB0aGUgc2VydmVyIGhhcyBzZW50IHRoZSByZXN1bHQuXG5cbiAgICAgIHZhciByZXRyeSA9IHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkuYmluZChudWxsLCBjdXJyZW50KTtcbiAgICAgIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KHN1c3BlbnNlSW5zdGFuY2UsIHJldHJ5KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBhdHRlbXB0LlxuICAgICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTtcbiAgICAgIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBNYXJrIHRoZSBjaGlsZHJlbiBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBIeWRyYXRpbmc7XG4gICAgICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCByZW5kZXIgcGFzcy4gV2UgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gaHlkcmF0ZWQsIGJ1dFxuICAgIC8vIHNvbWV0aGluZyBlaXRoZXIgc3VzcGVuZGVkIG9yIGVycm9yZWQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBoeWRyYXRpb24uIFRyeSBhZ2FpbiB3aXRob3V0IGh5ZHJhdGluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjtcblxuICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7XG5cbiAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlMik7XG4gICAgfSBlbHNlIGlmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkIGFuZCB3ZSBzaG91bGQgc3RpbGwgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBUaGUgZGVoeWRyYXRlZCBjb21wbGV0aW9uIHBhc3MgZXhwZWN0cyB0aGlzIGZsYWcgdG8gYmUgdGhlcmVcbiAgICAgIC8vIGJ1dCB0aGUgbm9ybWFsIHN1c3BlbnNlIHBhc3MgZG9lc24ndC5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdXNwZW5kZWQgYnV0IHdlIHNob3VsZCBubyBsb25nZXIgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgLy8gVGhlcmVmb3JlIHdlIG5vdyBoYXZlIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suXG4gICAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcbiAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7XG4gICAgdmFyIGlzSXRlcmFibGUgPSAhaXNBbkFycmF5ICYmIHR5cGVvZiBnZXRJdGVyYXRvckZuKGNoaWxkU2xvdCkgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNBbkFycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBbkFycmF5ID8gJ2FycmF5JyA6ICdpdGVyYWJsZSc7XG5cbiAgICAgIGVycm9yKCdBIG5lc3RlZCAlcyB3YXMgcGFzc2VkIHRvIHJvdyAjJXMgaW4gPFN1c3BlbnNlTGlzdCAvPi4gV3JhcCBpdCBpbiAnICsgJ2FuIGFkZGl0aW9uYWwgU3VzcGVuc2VMaXN0IHRvIGNvbmZpZ3VyZSBpdHMgcmV2ZWFsT3JkZXI6ICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPnslc308L1N1c3BlbnNlTGlzdD4gLi4uICcgKyAnPC9TdXNwZW5zZUxpc3Q+JywgdHlwZSwgaW5kZXgsIHR5cGUpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4oY2hpbGRyZW4sIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAoKHJldmVhbE9yZGVyID09PSAnZm9yd2FyZHMnIHx8IHJldmVhbE9yZGVyID09PSAnYmFja3dhcmRzJykgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkcmVuW2ldLCBpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5JdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG5cbiAgICAgICAgICBpZiAoY2hpbGRyZW5JdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHZhciBfaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKHN0ZXAudmFsdWUsIF9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdBIHNpbmdsZSByb3cgd2FzIHBhc3NlZCB0byBhIDxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9XCIlc1wiIC8+LiAnICsgJ1RoaXMgaXMgbm90IHVzZWZ1bCBzaW5jZSBpdCBuZWVkcyBtdWx0aXBsZSByb3dzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsIHJldmVhbE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGlzQmFja3dhcmRzLCB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpIHtcbiAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgaXNCYWNrd2FyZHM6IGlzQmFja3dhcmRzLFxuICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLFxuICAgICAgbGFzdDogbGFzdENvbnRlbnRSb3csXG4gICAgICB0YWlsOiB0YWlsLFxuICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuXG4gICAgcmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMgPSBpc0JhY2t3YXJkcztcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7XG4gICAgcmVuZGVyU3RhdGUubGFzdCA9IGxhc3RDb250ZW50Um93O1xuICAgIHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7XG4gIH1cbn0gLy8gVGhpcyBjYW4gZW5kIHVwIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCBtdWx0aXBsZSBwYXNzZXMuXG4vLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuXG4vLyBXZSBmaXJzdCByZW5kZXIgdGhlIGhlYWQuIElmIGFueXRoaW5nIGlzIGluIGZhbGxiYWNrIHN0YXRlLCB3ZSBkbyBhbm90aGVyXG4vLyBwYXNzIHRocm91Z2ggYmVnaW5Xb3JrIHRvIHJlcmVuZGVyIGFsbCBjaGlsZHJlbiAoaW5jbHVkaW5nIHRoZSB0YWlsKSB3aXRoXG4vLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluXG4vLyBpbiBmYWxsYmFjayBzdGF0ZS4gVGhlbiB3ZSByZW5kZXIgZWFjaCByb3cgaW4gdGhlIHRhaWwgb25lLWJ5LW9uZS5cbi8vIFRoYXQgaGFwcGVucyBpbiB0aGUgY29tcGxldGVXb3JrIHBoYXNlIHdpdGhvdXQgZ29pbmcgYmFjayB0byBiZWdpbldvcmsuXG5cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7XG4gIHZhciB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4obmV3Q2hpbGRyZW4sIHJldmVhbE9yZGVyKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG91bGRGb3JjZUZhbGxiYWNrID0gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcblxuICBpZiAoc2hvdWxkRm9yY2VGYWxsYmFjaykge1xuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSBmb3JjZWQgYSBmYWxsYmFjaywgd2UgbmVlZCB0byBzY2hlZHVsZSB3b3JrXG4gICAgICAvLyBvbiBhbnkgbmVzdGVkIGJvdW5kYXJpZXMgdG8gbGV0IHRoZW0ga25vdyB0byB0cnkgdG8gcmVuZGVyXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLlxuICAgICAgcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIH1cblxuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuXG4gIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAob2JqZWN0SXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAvLyBObyBjaGFuZ2UuIEJhaWxvdXQgZWFybHkgaWYgY2hpbGRyZW4gYXJlIHRoZSBzYW1lLlxuICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvbnRleHQgdmFsdWUgY2hhbmdlZC4gU2VhcmNoIGZvciBtYXRjaGluZyBjb25zdW1lcnMgYW5kIHNjaGVkdWxlXG4gICAgICAgIC8vIHRoZW0gdG8gdXBkYXRlLlxuICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRoZSBsb2dpYyBiZWxvdyBmb3IgQ29udGV4dCBkaWZmZXJzIGRlcGVuZGluZyBvbiBQUk9EIG9yIERFViBtb2RlLiBJblxuICAvLyBERVYgbW9kZSwgd2UgY3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBDb250ZXh0LkNvbnN1bWVyIHRoYXQgYWN0c1xuICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0RcbiAgLy8gc28gd2UgdXNlIHRoZSBvbGQgYmVoYXZpb3VyIChDb250ZXh0LkNvbnN1bWVyIHJlZmVyZW5jZXMgQ29udGV4dCkgdG9cbiAgLy8gcmVkdWNlIHNpemUgYW5kIG92ZXJoZWFkLiBUaGUgc2VwYXJhdGUgb2JqZWN0IHJlZmVyZW5jZXMgY29udGV4dCB2aWFcbiAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgXCJfY29udGV4dFwiLCB3aGljaCBhbHNvIGdpdmVzIHVzIHRoZSBhYmlsaXR5IHRvIGNoZWNrXG4gIC8vIGluIERFViBtb2RlIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCBhbmQgd2FybiBpZiBpdCBkb2VzIG5vdC5cblxuICB7XG4gICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCdzIGEgQ29udGV4dCAocmF0aGVyIHRoYW4gYSBDb25zdW1lcikuXG4gICAgICAvLyBPciBpdCBtYXkgYmUgYmVjYXVzZSBpdCdzIG9sZGVyIFJlYWN0IHdoZXJlIHRoZXkncmUgdGhlIHNhbWUgdGhpbmcuXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuXG4gICAgICBpZiAoY29udGV4dCAhPT0gY29udGV4dC5Db25zdW1lcikge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lcikge1xuICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgXCJ0aGF0IGlzbid0IGEgZnVuY3Rpb24uIEEgY29udGV4dCBjb25zdW1lciBleHBlY3RzIGEgc2luZ2xlIGNoaWxkIFwiICsgJ3RoYXQgaXMgYSBmdW5jdGlvbi4gSWYgeW91IGRpZCBwYXNzIGEgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0aGVyZSAnICsgJ2lzIG5vIHRyYWlsaW5nIG9yIGxlYWRpbmcgd2hpdGVzcGFjZSBhcm91bmQgaXQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5ld1ZhbHVlID0gcmVhZENvbnRleHQoY29udGV4dCk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBBIGxhenkgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIFJldXNlIHByZXZpb3VzIGRlcGVuZGVuY2llc1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IHVwZGF0ZSBcImJhc2VcIiByZW5kZXIgdGltZXMgZm9yIGJhaWxvdXRzLlxuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nKCk7XG4gIH1cblxuICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlIGNoaWxkcmVuIGhhdmUgYW55IHBlbmRpbmcgd29yay5cblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKSB7XG4gICAgLy8gVGhlIGNoaWxkcmVuIGRvbid0IGhhdmUgYW55IHdvcmsgZWl0aGVyLiBXZSBjYW4gc2tpcCB0aGVtLlxuICAgIC8vIFRPRE86IE9uY2Ugd2UgYWRkIGJhY2sgcmVzdW1pbmcsIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY2hpbGRyZW4gYXJlXG4gICAgLy8gYSB3b3JrLWluLXByb2dyZXNzIHNldC4gSWYgc28sIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlaXIgZWZmZWN0cy5cbiAgICB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gVGhpcyBmaWJlciBkb2Vzbid0IGhhdmUgd29yaywgYnV0IGl0cyBzdWJ0cmVlIGRvZXMuIENsb25lIHRoZSBjaGlsZFxuICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuXG5cbiAgY2xvbmVDaGlsZEZpYmVycyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gcmVtb3VudEZpYmVyKGN1cnJlbnQsIG9sZFdvcmtJblByb2dyZXNzLCBuZXdXb3JrSW5Qcm9ncmVzcykge1xuICB7XG4gICAgdmFyIHJldHVybkZpYmVyID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gICAgaWYgKHJldHVybkZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc3dhcCB0aGUgcm9vdCBmaWJlci4nKTtcbiAgICB9IC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIGN1cnJlbnQuXG4gICAgLy8gSXQgd2lsbCBnZXQgZGVsZXRlZC5cblxuXG4gICAgY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIG9sZFdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIENvbm5lY3QgdG8gdGhlIG5ldyB0cmVlLlxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuaW5kZXggPSBvbGRXb3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gb2xkV29ya0luUHJvZ3Jlc3Muc2libGluZztcbiAgICBuZXdXb3JrSW5Qcm9ncmVzcy5yZXR1cm4gPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmVmID0gb2xkV29ya0luUHJvZ3Jlc3MucmVmOyAvLyBSZXBsYWNlIHRoZSBjaGlsZC9zaWJsaW5nIHBvaW50ZXJzIGFib3ZlIGl0LlxuXG4gICAgaWYgKG9sZFdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZCkge1xuICAgICAgcmV0dXJuRmliZXIuY2hpbGQgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZXZTaWJsaW5nID0gcmV0dXJuRmliZXIuY2hpbGQ7XG5cbiAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2Rlc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHBhcmVudCB0byBoYXZlIGEgY2hpbGQuJyk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChwcmV2U2libGluZy5zaWJsaW5nICE9PSBvbGRXb3JrSW5Qcm9ncmVzcykge1xuICAgICAgICBwcmV2U2libGluZyA9IHByZXZTaWJsaW5nLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHByZXZTaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJldlNpYmxpbmcuc2libGluZyA9IG5ld1dvcmtJblByb2dyZXNzO1xuICAgIH0gLy8gRGVsZXRlIHRoZSBvbGQgZmliZXIgYW5kIHBsYWNlIHRoZSBuZXcgb25lLlxuICAgIC8vIFNpbmNlIHRoZSBvbGQgZmliZXIgaXMgZGlzY29ubmVjdGVkLCB3ZSBoYXZlIHRvIHNjaGVkdWxlIGl0IG1hbnVhbGx5LlxuXG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2N1cnJlbnRdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudCk7XG4gICAgfVxuXG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIEJlZm9yZSBwZXJmb3JtaW5nIGFuIGVhcmx5IGJhaWxvdXQsIHdlIG11c3QgY2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmdcbiAgLy8gdXBkYXRlcyBvciBjb250ZXh0LlxuICB2YXIgdXBkYXRlTGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBObyBwZW5kaW5nIHVwZGF0ZSwgYnV0IGJlY2F1c2UgY29udGV4dCBpcyBwcm9wYWdhdGVkIGxhemlseSwgd2UgbmVlZFxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZmliZXIgZG9lcyBub3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrLiBCYWlsb3V0IHdpdGhvdXQgZW50ZXJpbmdcbiAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gIC8vIGluIHRoaXMgb3B0aW1pemVkIHBhdGgsIG1vc3RseSBwdXNoaW5nIHN0dWZmIG9udG8gdGhlIHN0YWNrLlxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIC8vIFByb2ZpbGVyIHNob3VsZCBvbmx5IGNhbGwgb25SZW5kZXIgd2hlbiBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgICAgICB2YXIgaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuXG4gICAgICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgICAgICB2YXIgc3RhdGVOb2RlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChzdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gV2Uga25vdyB0aGF0IHRoaXMgY29tcG9uZW50IHdpbGwgc3VzcGVuZCBhZ2FpbiBiZWNhdXNlIGlmIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiB1bnN1c3BlbmRlZCBpdCBoYXMgY29tbWl0dGVkIGFzIGEgcmVzb2x2ZWQgU3VzcGVuc2UgY29tcG9uZW50LlxuICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuXG5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIFdlIHNob3VsZCBuZXZlciByZW5kZXIgdGhlIGNoaWxkcmVuIG9mIGEgZGVoeWRyYXRlZCBib3VuZGFyeSB1bnRpbCB3ZVxuICAgICAgICAgICAgLy8gdXBncmFkZSBpdC4gV2UgcmV0dXJuIG51bGwgaW5zdGVhZCBvZiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrLlxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9IC8vIElmIHRoaXMgYm91bmRhcnkgaXMgY3VycmVudGx5IHRpbWVkIG91dCwgd2UgbmVlZCB0byBkZWNpZGVcbiAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgLy8gZ28gc3RyYWlnaHQgdG8gdGhlIGZhbGxiYWNrLiBDaGVjayB0aGUgcHJpb3JpdHkgb2YgdGhlIHByaW1hcnlcbiAgICAgICAgICAvLyBjaGlsZCBmcmFnbWVudC5cblxuXG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgdmFyIHByaW1hcnlDaGlsZExhbmVzID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcztcblxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBwcmltYXJ5Q2hpbGRMYW5lcykpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAvLyB0byBhdHRlbXB0IHRvIHJlbmRlciB0aGUgcHJpbWFyeSBjaGlsZHJlbiBhZ2Fpbi5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCBkb2VzIG5vdCBoYXZlIHBlbmRpbmcgd29yayBtYXJrZWRcbiAgICAgICAgICAgIC8vIG9uIGl0XG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgLy8gcHJpb3JpdHkuIEJhaWxvdXQuXG5cbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBmYWxsYmFjayBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gU2tpcCBvdmVyIHRoZVxuICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4gcmV0dXJuIGBudWxsYCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBjaGVja2VkXG4gICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlcmUgd2VyZSBuZXN0ZWQgY29udGV4dCBjb25zdW1lcnMsIHZpYSB0aGUgY2FsbCB0b1xuICAgICAgICAgICAgICAvLyBgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29ya2AgYWJvdmUuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBkaWRTdXNwZW5kQmVmb3JlID0gKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgICAgICB2YXIgX2hhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyB3YXMgaW4gZmFsbGJhY2sgc3RhdGUgbGFzdCB0aW1lLCBhbmQgd2UgaGF2ZSBhbGwgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyBtaWdodCBnZXQgdW5ibG9ja2VkIGJ5IHN0YXRlIHVwZGF0ZXMgb3IgcmV0cmllcyBpbiB0aGVcbiAgICAgICAgICAgIC8vIHRyZWUgd2hpY2ggd2lsbCBhZmZlY3QgdGhlIHRhaWwuIFNvIHdlIG5lZWQgdG8gdXNlIHRoZSBub3JtYWxcbiAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH0gLy8gSWYgbm9uZSBvZiB0aGUgY2hpbGRyZW4gaGFkIGFueSB3b3JrLCB0aGF0IG1lYW5zIHRoYXQgbm9uZSBvZlxuICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG5cblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgIC8vIHRoZW4gdGhlIHRhaWwgZG9lc24ndCBtYXR0ZXIuIEFueXRoaW5nIG5ldyB0aGF0IHN1c3BlbmRzIHdpbGwgd29ya1xuICAgICAgICAvLyBpbiB0aGUgXCJ0b2dldGhlclwiIG1vZGUsIHNvIHdlIGNhbiBjb250aW51ZSBmcm9tIHRoZSBzdGF0ZSB3ZSBoYWQuXG5cblxuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSBpbiBjYXNlIHdlJ3ZlIHN0YXJ0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBudWxsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KTtcblxuICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAvLyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBsb2dpYyB1c2VkIGluIHRoZSBub3JtYWwgdXBkYXRlIHBhdGgsXG4gICAgICAgIC8vIHNvIHdlJ2xsIGp1c3QgZW50ZXIgdGhhdC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3ZSdsbCBiYWlsIG91dFxuICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAvLyBoYXZlIG5vdCBjaGFuZ2VkLiBXaGljaCBpcyBmaW5lLlxuICAgICAgICAvLyBUT0RPOiBQcm9iYWJseSBzaG91bGQgcmVmYWN0b3IgYGJlZ2luV29ya2AgdG8gc3BsaXQgdGhlIGJhaWxvdXRcbiAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgLy8gYnV0IEkgd29uJ3QgOilcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBiZWdpbldvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ICYmIGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCByZXN0YXJ0IHRoZSBiZWdpbiBwaGFzZSB3aXRoIGEgbmV3IGZpYmVyLlxuICAgICAgcmV0dXJuIHJlbW91bnRGaWJlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLmtleSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fCBudWxsLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYW5lcykpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgaGFzQ29udGV4dENoYW5nZWQoKSB8fCAoIC8vIEZvcmNlIGEgcmUtcmVuZGVyIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIGR1ZSB0byBob3QgcmVsb2FkOlxuICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSBjdXJyZW50LnR5cGUgKSkge1xuICAgICAgLy8gSWYgcHJvcHMgb3IgY29udGV4dCBjaGFuZ2VkLCBtYXJrIHRoZSBmaWJlciBhcyBoYXZpbmcgcGVyZm9ybWVkIHdvcmsuXG4gICAgICAvLyBUaGlzIG1heSBiZSB1bnNldCBpZiB0aGUgcHJvcHMgYXJlIGRldGVybWluZWQgdG8gYmUgZXF1YWwgbGF0ZXIgKG1lbW8pLlxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgcHJvcHMgbm9yIGxlZ2FjeSBjb250ZXh0IGNoYW5nZXMuIENoZWNrIGlmIHRoZXJlJ3MgYSBwZW5kaW5nXG4gICAgICAvLyB1cGRhdGUgb3IgY29udGV4dCBjaGFuZ2UuXG4gICAgICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCAmJiAvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgcGFzcyBvZiBhbiBlcnJvciBvciBzdXNwZW5zZSBib3VuZGFyeSwgdGhlcmVcbiAgICAgIC8vIG1heSBub3QgYmUgd29yayBzY2hlZHVsZWQgb24gYGN1cnJlbnRgLCBzbyB3ZSBjaGVjayBmb3IgdGhpcyBmbGFnLlxuICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gTm8gcGVuZGluZyB1cGRhdGVzIG9yIGNvbnRleHQuIEJhaWwgb3V0IG5vdy5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdEVhcmx5QmFpbG91dElmTm9TY2hlZHVsZWRVcGRhdGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9uIHRoaXMgZmliZXIsIGJ1dCB0aGVyZSBhcmUgbm8gbmV3IHByb3BzXG4gICAgICAgIC8vIG5vciBsZWdhY3kgY29udGV4dC4gU2V0IHRoaXMgdG8gZmFsc2UuIElmIGFuIHVwZGF0ZSBxdWV1ZSBvciBjb250ZXh0XG4gICAgICAgIC8vIGNvbnN1bWVyIHByb2R1Y2VzIGEgY2hhbmdlZCB2YWx1ZSwgaXQgd2lsbCBzZXQgdGhpcyB0byB0cnVlLiBPdGhlcndpc2UsXG4gICAgICAgIC8vIHRoZSBjb21wb25lbnQgd2lsbCBhc3N1bWUgdGhlIGNoaWxkcmVuIGhhdmUgbm90IGNoYW5nZWQgYW5kIGJhaWwgb3V0LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNoaWxkIGJlbG9uZ3MgdG8gYSBsaXN0IG9mIG11bGlwbGUgY2hpbGRyZW4gaW5cbiAgICAgIC8vIGl0cyBwYXJlbnQuXG4gICAgICAvL1xuICAgICAgLy8gSW4gYSB0cnVlIG11bHRpLXRocmVhZGVkIGltcGxlbWVudGF0aW9uLCB3ZSB3b3VsZCByZW5kZXIgY2hpbGRyZW4gb25cbiAgICAgIC8vIHBhcmFsbGVsIHRocmVhZHMuIFRoaXMgd291bGQgcmVwcmVzZW50IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgcmVuZGVyXG4gICAgICAvLyB0aHJlYWQgZm9yIHRoaXMgc3VidHJlZS5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBvbmx5IHVzZSB0aGlzIGZvciBpZCBnZW5lcmF0aW9uIGR1cmluZyBoeWRyYXRpb24sIHdoaWNoIGlzIHdoeSB0aGVcbiAgICAgIC8vIGxvZ2ljIGlzIGxvY2F0ZWQgaW4gdGhpcyBzcGVjaWFsIGJyYW5jaC5cbiAgICAgIHZhciBzbG90SW5kZXggPSB3b3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gZ2V0Rm9ya3NBdExldmVsKCk7XG4gICAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpO1xuICAgIH1cbiAgfSAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciBwZW5kaW5nIHVwZGF0ZSBwcmlvcml0eS5cbiAgLy8gVE9ETzogVGhpcyBhc3N1bWVzIHRoYXQgd2UncmUgYWJvdXQgdG8gZXZhbHVhdGUgdGhlIGNvbXBvbmVudCBhbmQgcHJvY2Vzc1xuICAvLyB0aGUgdXBkYXRlIHF1ZXVlLiBIb3dldmVyLCB0aGVyZSdzIGFuIGV4Y2VwdGlvbjogU2ltcGxlTWVtb0NvbXBvbmVudFxuICAvLyBzb21ldGltZXMgYmFpbHMgb3V0IGxhdGVyIGluIHRoZSBiZWdpbiBwaGFzZS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGRcbiAgLy8gbW92ZSB0aGlzIGFzc2lnbm1lbnQgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBhbmQgaW50byBlYWNoIGJyYW5jaC5cblxuXG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTtcbiAgICAgICAgcmV0dXJuIG1vdW50TGF6eUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBDb21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50LCBfdW5yZXNvbHZlZFByb3BzKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9Db21wb25lbnQsIF9yZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICByZXR1cm4gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIF91bnJlc29sdmVkUHJvcHMyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gdHlwZSA/IF91bnJlc29sdmVkUHJvcHMyIDogcmVzb2x2ZURlZmF1bHRQcm9wcyh0eXBlLCBfdW5yZXNvbHZlZFByb3BzMik7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIF9yZXNvbHZlZFByb3BzMiwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGcmFnbWVudDpcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBNb2RlOlxuICAgICAgcmV0dXJuIHVwZGF0ZU1vZGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfdHlwZTIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFJlc29sdmUgb3V0ZXIgcHJvcHMgZmlyc3QsIHRoZW4gcmVzb2x2ZSBpbm5lciBwcm9wcy5cblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIsIF91bnJlc29sdmVkUHJvcHMzKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBfdHlwZTIucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIF9yZXNvbHZlZFByb3BzMywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczQgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50MiA/IF91bnJlc29sdmVkUHJvcHM0IDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wczQpO1xuXG4gICAgICAgIHJldHVybiBtb3VudEluY29tcGxldGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudDIsIF9yZXNvbHZlZFByb3BzNCwgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBUYWcgdGhlIGZpYmVyIHdpdGggYW4gdXBkYXRlIGVmZmVjdC4gVGhpcyB0dXJucyBhIFBsYWNlbWVudCBpbnRvXG4gIC8vIGEgUGxhY2VtZW50QW5kVXBkYXRlLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcykge1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYztcbiAgfVxufVxuXG52YXIgYXBwZW5kQWxsQ2hpbGRyZW47XG52YXIgdXBkYXRlSG9zdENvbnRhaW5lcjtcbnZhciB1cGRhdGVIb3N0Q29tcG9uZW50JDE7XG52YXIgdXBkYXRlSG9zdFRleHQkMTtcblxue1xuICAvLyBNdXRhdGlvbiBtb2RlXG4gIGFwcGVuZEFsbENoaWxkcmVuID0gZnVuY3Rpb24gKHBhcmVudCwgd29ya0luUHJvZ3Jlc3MsIG5lZWRzVmlzaWJpbGl0eVRvZ2dsZSwgaXNIaWRkZW4pIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBjcmVhdGVkIGJ1dCB3ZSBuZWVkIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0Q29udGFpbmVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7Ly8gTm9vcFxuICB9O1xuXG4gIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gYWx0ZXJuYXRlLCB0aGF0IG1lYW5zIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCB3ZSBuZWVkIHRvXG4gICAgLy8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy5cbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzKSB7XG4gICAgICAvLyBJbiBtdXRhdGlvbiBtb2RlLCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGEgYmFpbG91dCBiZWNhdXNlXG4gICAgICAvLyB3ZSB3b24ndCB0b3VjaCB0aGlzIG5vZGUgZXZlbiBpZiBjaGlsZHJlbiBjaGFuZ2VkLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBvbmUgb2Ygb3VyIGNoaWxkcmVuIHVwZGF0ZWQsIHdlIGRvbid0XG4gICAgLy8gaGF2ZSBuZXdQcm9wcyBzbyB3ZSdsbCBoYXZlIHRvIHJldXNlIHRoZW0uXG4gICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uXG4gICAgLy8gRXZlbiBiZXR0ZXIgd291bGQgYmUgaWYgY2hpbGRyZW4gd2VyZW4ndCBzcGVjaWFsIGNhc2VkIGF0IGFsbCB0aG8uXG5cblxuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICB2YXIgY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsgLy8gVE9ETzogRXhwZXJpZW5jaW5nIGFuIGVycm9yIHdoZXJlIG9sZFByb3BzIGlzIG51bGwuIFN1Z2dlc3RzIGEgaG9zdFxuICAgIC8vIGNvbXBvbmVudCBpcyBoaXR0aW5nIHRoZSByZXN1bWUgcGF0aC4gRmlndXJlIG91dCB3aHkuIFBvc3NpYmx5XG4gICAgLy8gcmVsYXRlZCB0byBgaGlkZGVuYC5cblxuICAgIHZhciB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShpbnN0YW5jZSwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCk7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGlzIGRvbmUgaW4gY29tbWl0V29yay5cblxuICAgIGlmICh1cGRhdGVQYXlsb2FkKSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdFRleHQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSkge1xuICBpZiAoaGFzVW5oeWRyYXRlZFRhaWxOb2RlcygpICYmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHtcbiAgICB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKHdvcmtJblByb2dyZXNzKTtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXIgfCBJbmNvbXBsZXRlIHwgU2hvdWxkQ2FwdHVyZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCF3YXNIeWRyYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuXG4gICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB7XG4gICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoaXMgdHJlZS4gSWYgdGhpcyB3YXMgYSBmb3JjZWQgY2xpZW50IHJlbmRlcixcbiAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgLy8gYXR0ZW1wdC4gSWYgc28sIGFkZCB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOyAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIFN1c3BlbnNlIHBhdGhcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBNb3ZlIGNyZWF0ZUluc3RhbmNlIHRvIGJlZ2luV29yayBhbmQga2VlcCBpdCBvbiBhIGNvbnRleHRcbiAgICAgICAgICAvLyBcInN0YWNrXCIgYXMgdGhlIHBhcmVudC4gVGhlbiBhcHBlbmQgY2hpbGRyZW4gYXMgd2UgZ28gaW4gYmVnaW5Xb3JrXG4gICAgICAgICAgLy8gb3IgY29tcGxldGVXb3JrIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIHdhbnQgdG8gYWRkIHRoZW0gdG9wLT5kb3duIG9yXG4gICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLlxuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBhbmQgY3JlYXRlSW5zdGFuY2Ugc3RlcCBpbnRvIHRoZSBiZWdpblBoYXNlXG4gICAgICAgICAgICAvLyB0byBjb25zb2xpZGF0ZS5cbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgY2hhbmdlcyB0byB0aGUgaHlkcmF0ZWQgbm9kZSBuZWVkIHRvIGJlIGFwcGxpZWQgYXQgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbW1pdC1waGFzZSB3ZSBtYXJrIHRoaXMgYXMgc3VjaC5cbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgYXBwZW5kQWxsQ2hpbGRyZW4oaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIENlcnRhaW4gcmVuZGVyZXJzIHJlcXVpcmUgY29tbWl0LXRpbWUgZWZmZWN0cyBmb3IgaW5pdGlhbCBtb3VudC5cbiAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgc3VwcG9ydHMgYXV0by1mb2N1cyBmb3IgY2VydGFpbiBlbGVtZW50cykuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgc3VjaCByZW5kZXJlcnMgZ2V0IHNjaGVkdWxlZCBmb3IgbGF0ZXIgd29yay5cblxuICAgICAgICAgICAgaWYgKGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGluc3RhbmNlLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHJlZiBvbiBhIGhvc3Qgbm9kZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wcztcblxuICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudC5tZW1vaXplZFByb3BzOyAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG5cbiAgICAgICAgICB1cGRhdGVIb3N0VGV4dCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBvbGRUZXh0LCBuZXdUZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5ld1RleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9yb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpO1xuXG4gICAgICAgICAgdmFyIF9jdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpO1xuXG4gICAgICAgICAgdmFyIF93YXNIeWRyYXRlZDIgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAoX3dhc0h5ZHJhdGVkMikge1xuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsgLy8gU3BlY2lhbCBwYXRoIGZvciBkZWh5ZHJhdGVkIGJvdW5kYXJpZXMuIFdlIG1heSBldmVudHVhbGx5IG1vdmUgdGhpc1xuICAgICAgICAvLyB0byBpdHMgb3duIGZpYmVyIHR5cGUgc28gdGhhdCB3ZSBjYW4gYWRkIG90aGVyIGtpbmRzIG9mIGh5ZHJhdGlvblxuICAgICAgICAvLyBib3VuZGFyaWVzIHRoYXQgYXJlbid0IGFzc29jaWF0ZWQgd2l0aCBhIFN1c3BlbnNlIHRyZWUuIEluIGFudGljaXBhdGlvblxuICAgICAgICAvLyBvZiBzdWNoIGEgcmVmYWN0b3IsIGFsbCB0aGUgaHlkcmF0aW9uIGxvZ2ljIGlzIGNvbnRhaW5lZCBpblxuICAgICAgICAvLyB0aGlzIGJyYW5jaC5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCA9IGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoIWZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlLiBUaGVyZSB3ZXJlIHJlbWFpbmluZyB1bmh5ZHJhdGVkIG5vZGVzLiBXZSB0cmVhdFxuICAgICAgICAgICAgICAvLyB0aGlzIGFzIGEgbWlzbWF0Y2guIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlxuICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmlzaCBoeWRyYXRpbmcsIGVpdGhlciBiZWNhdXNlIHRoaXMgaXMgdGhlIGluaXRpYWxcbiAgICAgICAgICAgICAgLy8gcmVuZGVyIG9yIGJlY2F1c2Ugc29tZXRoaW5nIHN1c3BlbmRlZC5cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBDb250aW51ZSB3aXRoIHRoZSBub3JtYWwgU3VzcGVuc2UgcGF0aC5cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH0gLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV4dERpZFRpbWVvdXQgPSBuZXh0U3RhdGUgIT09IG51bGw7XG4gICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgICAvLyBhIHBhc3NpdmUgZWZmZWN0LCB3aGljaCBpcyB3aGVuIHdlIHByb2Nlc3MgdGhlIHRyYW5zaXRpb25zXG5cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgIT09IHByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gYW4gZWZmZWN0IHRvIHRvZ2dsZSB0aGUgc3VidHJlZSdzIHZpc2liaWxpdHkuIFdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBmYWxsYmFjayAtPiBwcmltYXJ5LCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIHNjaGVkdWxlcyB0aGlzIGVmZmVjdFxuICAgICAgICAgIC8vIGFzIHBhcnQgb2YgaXRzIG5vcm1hbCBjb21wbGV0ZSBwaGFzZS4gQnV0IHdoZW4gd2Ugc3dpdGNoIGZyb21cbiAgICAgICAgICAvLyBwcmltYXJ5IC0+IGZhbGxiYWNrLCB0aGUgaW5uZXIgT2Zmc2NyZWVuIGZpYmVyIGRvZXMgbm90IGhhdmUgYSBjb21wbGV0ZVxuICAgICAgICAgIC8vIHBoYXNlLiBTbyB3ZSBuZWVkIHRvIHNjaGVkdWxlIGl0cyBlZmZlY3QgaGVyZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGFsc28gdXNlIHRoaXMgZmxhZyB0byBjb25uZWN0L2Rpc2Nvbm5lY3QgdGhlIGVmZmVjdHMsIGJ1dCB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxvZ2ljIGFwcGxpZXM6IHdoZW4gcmUtY29ubmVjdGluZywgdGhlIE9mZnNjcmVlbiBmaWJlcidzIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2Ugd2lsbCBoYW5kbGUgc2NoZWR1bGluZyB0aGUgZWZmZWN0LiBJdCdzIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2tcbiAgICAgICAgICAvLyBpcyBhY3RpdmUgdGhhdCB3ZSBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuXG5cblxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkge1xuICAgICAgICAgICAgdmFyIF9vZmZzY3JlZW5GaWJlcjIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIF9vZmZzY3JlZW5GaWJlcjIuZmxhZ3MgfD0gVmlzaWJpbGl0eTsgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgICAvLyBpbiB0aGUgY29uY3VycmVudCB0cmVlIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBrbm93biBidWcuXG5cbiAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbGFyZ2UgdHJlZSB3aGljaCBpcyBjb21tb24gZm9yIGluaXRpYWwgbG9hZHMuIFdlXG4gICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIHJlc3RhcnQgYSByZW5kZXIgb3Igbm90IHVudGlsIHdlIGdldFxuICAgICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAgIC8vIElmIHRoaXMgcmVuZGVyIGFscmVhZHkgaGFkIGEgcGluZyBvciBsb3dlciBwcmkgdXBkYXRlcyxcbiAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdlXG4gICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICAgIHZhciBoYXNJbnZpc2libGVDaGlsZENvbnRleHQgPSBjdXJyZW50ID09PSBudWxsICYmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlIHx8ICFlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrKTtcblxuICAgICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBpbiBhbiBpbnZpc2libGUgdHJlZSBvciBhIG5ldyByZW5kZXIsIHRoZW4gc2hvd2luZ1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgYm91bmRhcnkgaXMgb2suXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBoaWRlIGNvbnRlbnQgc28gd2Ugc2hvdWxkXG4gICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhIHJldHJ5IGxpc3RlbmVyIHRvIHRoZSBwcm9taXNlLlxuICAgICAgICAgIC8vIFRPRE86IE1vdmUgdG8gcGFzc2l2ZSBwaGFzZVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgcHJlcGFyZVBvcnRhbE1vdW50KHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgIH1cblxuICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgLy8gUG9wIHByb3ZpZGVyIGZpYmVyXG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGRlZmF1bHQsIFwiaW5kZXBlbmRlbnRcIiBtb2RlLlxuICAgICAgICAgIC8vIFdlIGRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgbW9kZS5cbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWRTdXNwZW5kQWxyZWFkeSA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuICAgICAgICB2YXIgcmVuZGVyZWRUYWlsID0gcmVuZGVyU3RhdGUucmVuZGVyaW5nO1xuXG4gICAgICAgIGlmIChyZW5kZXJlZFRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBqdXN0IHJlbmRlcmVkIHRoZSBoZWFkLlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHBhc3MuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBhbnl0aGluZyBpcyBzdGlsbFxuICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGluIHRoZSByZW5kZXJlZCBzZXQuXG4gICAgICAgICAgICAvLyBJZiBuZXcgY29udGVudCB1bnN1c3BlbmRlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBjb250ZW50IHRoYXRcbiAgICAgICAgICAgIC8vIGRpZG4ndC4gVGhlbiB3ZSBuZWVkIHRvIGRvIGEgc2Vjb25kIHBhc3MgdGhhdCBmb3JjZXMgZXZlcnl0aGluZ1xuICAgICAgICAgICAgLy8gdG8ga2VlcCBzaG93aW5nIHRoZWlyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIHN1c3BlbmRlZCBpZiBzb21ldGhpbmcgaW4gdGhpcyByZW5kZXIgcGFzcyBzdXNwZW5kZWQsIG9yXG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgaW4gdGhlIHByZXZpb3VzIGNvbW1pdHRlZCBwYXNzIHN1c3BlbmRlZC4gT3RoZXJ3aXNlLFxuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBjaGFuY2Ugc28gd2UgY2FuIHNraXAgdGhlIGV4cGVuc2l2ZSBjYWxsIHRvXG4gICAgICAgICAgICAvLyBmaW5kRmlyc3RTdXNwZW5kZWQuXG4gICAgICAgICAgICB2YXIgY2Fubm90QmVTdXNwZW5kZWQgPSByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSAmJiAoY3VycmVudCA9PT0gbnVsbCB8fCAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKTtcblxuICAgICAgICAgICAgaWYgKCFjYW5ub3RCZVN1c3BlbmRlZCkge1xuICAgICAgICAgICAgICB2YXIgcm93ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgd2hpbGUgKHJvdyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBzdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocm93KTtcblxuICAgICAgICAgICAgICAgIGlmIChzdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gSWYgdGhpcyBpcyBhIG5ld2x5IHN1c3BlbmRlZCB0cmVlLCBpdCBtaWdodCBub3QgZ2V0IGNvbW1pdHRlZCBhc1xuICAgICAgICAgICAgICAgICAgLy8gcGFydCBvZiB0aGUgc2Vjb25kIHBhc3MuIEluIHRoYXQgY2FzZSBub3RoaW5nIHdpbGwgc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgdGhlbmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbmFibGVzIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuc2VMaXN0IHNvIHRoYXQgaXQgY2FuIHJldHJ5IGlmIHRoZXkgcmVzb2x2ZS5cbiAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIG9mIHRoZXNlIGluIHRoZSBsaXN0IGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAgICAgICAgICAgLy8gZ29pbmcgdG8gd2FpdCBmb3IgYWxsIG9mIHRoZW0gYW55d2F5LCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG9uZXMgZ2V0cyB0byBwaW5nLiBJbiB0aGVvcnkgd2UgY291bGQgZ2V0IGNsZXZlciBhbmQga2VlcFxuICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgb2YgaG93IG1hbnkgZGVwZW5kZW5jaWVzIHJlbWFpbiBidXQgaXQgZ2V0cyB0cmlja3kgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1lYW50aW1lLCB3ZSBjYW4gYWRkL3JlbW92ZS9jaGFuZ2UgaXRlbXMgYW5kIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICAgIC8vIFdlIG1pZ2h0IGJhaWwgb3V0IG9mIHRoZSBsb29wIGJlZm9yZSBmaW5kaW5nIGFueSBidXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIgc2luY2UgdGhhdCBtZWFucyB0aGF0IHRoZSBvdGhlciBib3VuZGFyaWVzIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdlIGRpZCBmaW5kIGFscmVhZHkgaGFzIHRoZWlyIGxpc3RlbmVycyBhdHRhY2hlZC5cblxuICAgICAgICAgICAgICAgICAgdmFyIG5ld1RoZW5hYmxlcyA9IHN1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKG5ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICAgICAgfSAvLyBSZXJlbmRlciB0aGUgd2hvbGUgbGlzdCwgYnV0IHRoaXMgdGltZSwgd2UnbGwgZm9yY2UgZmFsbGJhY2tzXG4gICAgICAgICAgICAgICAgICAvLyB0byBzdGF5IGluIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBjaGlsZCBmaWJlcnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuXG5cblxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgICAgICAgICAgIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsgLy8gU2V0IHVwIHRoZSBTdXNwZW5zZSBDb250ZXh0IHRvIGZvcmNlIHN1c3BlbnNlIGFuZCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgLy8gcmVyZW5kZXIgdGhlIGNoaWxkcmVuLlxuXG4gICAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSk7IC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpO1xuICAgICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBnb2luZyB0byByZW5kZXIgdGhlIHRhaWwuXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdGhlIHJlbmRlcmVkIHJvdyB0byB0aGUgY2hpbGQgbGlzdC5cbiAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICB2YXIgX3N1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyZW5kZXJlZFRhaWwpO1xuXG4gICAgICAgICAgICBpZiAoX3N1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7IC8vIEVuc3VyZSB3ZSB0cmFuc2ZlciB0aGUgdXBkYXRlIHF1ZXVlIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBkb2Vzbid0XG4gICAgICAgICAgICAgIC8vIGdldCBsb3N0IGlmIHRoaXMgcm93IGVuZHMgdXAgZHJvcHBlZCBkdXJpbmcgYSBzZWNvbmQgcGFzcy5cblxuICAgICAgICAgICAgICB2YXIgX25ld1RoZW5hYmxlcyA9IF9zdXNwZW5kZWQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICAgICAgaWYgKF9uZXdUaGVuYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVuYWJsZXM7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCB0cnVlKTsgLy8gVGhpcyBtaWdodCBoYXZlIGJlZW4gbW9kaWZpZWQuXG5cbiAgICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgPT09IG51bGwgJiYgcmVuZGVyU3RhdGUudGFpbE1vZGUgPT09ICdoaWRkZW4nICYmICFyZW5kZXJlZFRhaWwuYWx0ZXJuYXRlICYmICFnZXRJc0h5ZHJhdGluZygpIC8vIFdlIGRvbid0IGN1dCBpdCBpZiB3ZSdyZSBoeWRyYXRpbmcuXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMpIHtcbiAgICAgICAgICAgIC8vIFRoZSBlZmZlY3QgbGlzdCBvZiB0aGUgYmFja3dhcmRzIHRhaWwgd2lsbCBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBlbmQuIFRoaXMgYnJlYWtzIHRoZSBndWFyYW50ZWUgdGhhdCBsaWZlLWN5Y2xlcyBmaXJlIGluXG4gICAgICAgICAgICAvLyBzaWJsaW5nIG9yZGVyIGJ1dCB0aGF0IGlzbid0IGEgc3Ryb25nIGd1YXJhbnRlZSBwcm9taXNlZCBieSBSZWFjdC5cbiAgICAgICAgICAgIC8vIEVzcGVjaWFsbHkgc2luY2UgdGhlc2UgbWlnaHQgYWxzbyBqdXN0IHBvcCBpbiBkdXJpbmcgZnV0dXJlIGNvbW1pdHMuXG4gICAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAgICAgICAgICAgIHJlbmRlcmVkVGFpbC5zaWJsaW5nID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzU2libGluZyA9IHJlbmRlclN0YXRlLmxhc3Q7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c1NpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcHJldmlvdXNTaWJsaW5nLnNpYmxpbmcgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyU3RhdGUubGFzdCA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgdGFpbCByb3dzIHRvIHJlbmRlci5cbiAgICAgICAgICAvLyBQb3AgYSByb3cuXG4gICAgICAgICAgdmFyIG5leHQgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG5leHQ7XG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG5leHQuc2libGluZztcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPSBub3coKTtcbiAgICAgICAgICBuZXh0LnNpYmxpbmcgPSBudWxsOyAvLyBSZXN0b3JlIHRoZSBjb250ZXh0LlxuICAgICAgICAgIC8vIFRPRE86IFdlIGNhbiBwcm9iYWJseSBqdXN0IGF2b2lkIHBvcHBpbmcgaXQgaW5zdGVhZCBhbmQgb25seVxuICAgICAgICAgIC8vIHNldHRpbmcgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZ28gZnJvbSBub3Qgc3VzcGVuZGVkIHRvIHN1c3BlbmRlZC5cblxuICAgICAgICAgIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG5cbiAgICAgICAgICBpZiAoZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIERvIGEgcGFzcyBvdmVyIHRoZSBuZXh0IHJvdy5cbiAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIHZhciBuZXh0SXNIaWRkZW4gPSBfbmV4dFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgKCAvLyBMZWdhY3lIaWRkZW4gZG9lc24ndCBkbyBhbnkgaGlkaW5nIFx1MjAxNCBpdCBvbmx5IHByZS1yZW5kZXJzLlxuICAgICAgICAgICFlbmFibGVMZWdhY3lIaWRkZW4gKSkge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5leHRJc0hpZGRlbiB8fCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgZm9yIGhpZGRlbiBjaGlsZHJlbiB1bmxlc3Mgd2UncmUgcmVuZGVyaW5nXG4gICAgICAgICAgLy8gYXQgb2Zmc2NyZWVuIHByaW9yaXR5LlxuICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbnNlcnRpb24gb3IgdXBkYXRlIGluIHRoZSBoaWRkZW4gc3VidHJlZS5cbiAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gaGlkZSB0aG9zZSBub2RlcyBpbiB0aGUgY29tbWl0IHBoYXNlLCBzb1xuICAgICAgICAgICAgICAvLyBzY2hlZHVsZSBhIHZpc2liaWxpdHkgZWZmZWN0LlxuICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmIChQbGFjZW1lbnQgfCBVcGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG5cbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59IC8vIFVzZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHN0YWNrLlxuLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLlxuLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlU3VzcGVuc2VMYXlvdXRFZmZlY3RTZW1hbnRpY3MgaXMgZW5hYmxlZC5cblxuXG52YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7XG52YXIgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IGZhbHNlO1xudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy5cblxudmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG52YXIgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuZnVuY3Rpb24gcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yKSB7XG4gIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkXG4gIC8vIGNhbGxiYWNrIGlzIGEgYml0IHRvbyBzbG93IChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMTY2NikuXG4gIC8vIEJ1dCB3ZSByZWx5IG9uIGl0IHRvIHN1cmZhY2UgZXJyb3JzIHRvIERFViB0b29scyBsaWtlIG92ZXJsYXlzXG4gIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS5cbiAgLy8gQXMgYSBjb21wcm9taXNlLCByZXRocm93IG9ubHkgY2F1Z2h0IGVycm9ycyBpbiBhIGd1YXJkLlxuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgfVxufVxuXG52YXIgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICB9XG59OyAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCB1bm1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lcihjdXJyZW50LCBpbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgcmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzICYmIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpIHtcbiAgdHJ5IHtcbiAgICBkZXN0cm95KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbnZhciBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xudmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpcnN0Q2hpbGQpIHtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gcHJlcGFyZUZvckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pO1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuICB2YXIgc2hvdWxkRmlyZSA9IHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1cjtcbiAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG4gIHJldHVybiBzaG91bGRGaXJlO1xufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVGhpcyBwaGFzZSBpcyBvbmx5IHVzZWQgZm9yIGJlZm9yZUFjdGl2ZUluc3RhbmNlQmx1ci5cblxuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBCZWZvcmVNdXRhdGlvbk1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykge1xuICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTW91bnRcblxuXG4gICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSBjcmVhdGUoKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuXG4gICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoZGVzdHJveSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkIG51bGwuIElmIHlvdXIgZWZmZWN0IGRvZXMgbm90IHJlcXVpcmUgY2xlYW4gJyArICd1cCwgcmV0dXJuIHVuZGVmaW5lZCAob3Igbm90aGluZykuJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSAnICsgaG9va05hbWUgKyAnKGFzeW5jICgpID0+IC4uLikgb3IgcmV0dXJuZWQgYSBQcm9taXNlLiAnICsgJ0luc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgJyArICdhbmQgY2FsbCBpdCBpbW1lZGlhdGVseTpcXG5cXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyBcIn0sIFtzb21lSWRdKTsgLy8gT3IgW10gaWYgZWZmZWN0IGRvZXNuJ3QgbmVlZCBwcm9wcyBvciBzdGF0ZVxcblxcblwiICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaG9va3MtZGF0YS1mZXRjaGluZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IoJyVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBob29rTmFtZSwgYWRkZW5kdW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIHtcbiAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuXG4gICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUuaWQsXG4gICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLm9uUG9zdENvbW1pdDsgLy8gVGhpcyB2YWx1ZSB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblBvc3RDb21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH0gLy8gQnViYmxlIHRpbWVzIHRvIHRoZSBuZXh0IG5lYXJlc3QgYW5jZXN0b3IgUHJvZmlsZXIuXG4gICAgICAgICAgICAvLyBBZnRlciB3ZSBwcm9jZXNzIHRoYXQgUHJvZmlsZXIsIHdlJ2xsIGJ1YmJsZSBmdXJ0aGVyIHVwLlxuXG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0UHVibGljSW5zdGFuY2UoZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIG1heSBzY2hlZHVsZSBhdXRvLWZvY3VzIGZvciBpbnB1dHMgYW5kIGZvcm0gY29udHJvbHMpLlxuICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsICYmIGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgY29tbWl0TW91bnQoX2luc3RhbmNlMiwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCB0ZXh0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LFxuICAgICAgICAgICAgICAgIG9uUmVuZGVyID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vblJlbmRlcjtcbiAgICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGN1cnJlbnQgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Db21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgICAgfSAvLyBTY2hlZHVsZSBhIHBhc3NpdmUgZWZmZWN0IGZvciB0aGlzIFByb2ZpbGVyIHRvIGNhbGwgb25Qb3N0Q29tbWl0IGhvb2tzLlxuICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBzaG91bGQgYmUgc2NoZWR1bGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gb25Qb3N0Q29tbWl0IGNhbGxiYWNrIGZvciB0aGlzIFByb2ZpbGVyLFxuICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy5cblxuXG4gICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpbmlzaGVkV29yayk7IC8vIFByb3BhZ2F0ZSBsYXlvdXQgZWZmZWN0IGR1cmF0aW9ucyB0byB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yLlxuICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LlxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAge1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikge1xuICAgICAgICBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihub2RlKSB7XG4gIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC5cbiAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcbiAgc3dpdGNoIChub2RlLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBub2RlLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQobm9kZSwgbm9kZS5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlzSGlkZGVuKSB7XG4gIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuXG4gIHZhciBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZShub2RlLnN0YXRlTm9kZSwgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yaykge1xuICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlO1xuICAgIH0gLy8gTW92ZWQgb3V0c2lkZSB0byBlbnN1cmUgRENFIHdvcmtzIHdpdGggdGhpcyBmbGFnXG5cbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXIgdG8gZGlzY29ubmVjdCBpdCBmcm9tIHRoZSB0cmVlLlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGV0ZWN0IGFuZCB3YXJuIGFnYWluc3Qgc3RhdGUgdXBkYXRlcyBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLlxuICAvL1xuICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLlxuICAvLyBUaGlzIGNoaWxkIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjbGVhciBjaGlsZCBvciBzaWJsaW5nIHBvaW50ZXJzIHlldC5cbiAgLy8gVGhleSdyZSBuZWVkZWQgZm9yIHBhc3NpdmUgZWZmZWN0cyBhbmQgZm9yIGZpbmRET01Ob2RlLlxuICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuXG4gIC8vXG4gIC8vIERvbid0IHJlc2V0IHRoZSBhbHRlcm5hdGUgeWV0LCBlaXRoZXIuIFdlIG5lZWQgdGhhdCBzbyB3ZSBjYW4gZGV0YWNoIHRoZVxuICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpc1xuICAvLyBzdWZmaWNpZW50IGZvciBmaW5kRE9NTm9kZSBzZW1hbnRpY3MuXG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICB9XG5cbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZmliZXIuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhhbHRlcm5hdGUpO1xuICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlXG4gIC8vIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgaXMgdW5kZWZpbmVkLlxuXG5cbiAge1xuICAgIC8vIENsZWFyIGN5Y2xpY2FsIEZpYmVyIGZpZWxkcy4gVGhpcyBsZXZlbCBhbG9uZSBpcyBkZXNpZ25lZCB0byByb3VnaGx5XG4gICAgLy8gYXBwcm94aW1hdGUgdGhlIHBsYW5uZWQgRmliZXIgcmVmYWN0b3IuIEluIHRoYXQgd29ybGQsIGBzZXRTdGF0ZWAgd2lsbCBiZVxuICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCBcImluc3RhbmNlXCIgb2JqZWN0IGluc3RlYWQgb2YgYSBGaWJlci4gVGhlIEluc3RhbmNlXG4gICAgLy8gb2JqZWN0IHdpbGwgbm90IGhhdmUgYW55IG9mIHRoZXNlIGZpZWxkcy4gSXQgd2lsbCBvbmx5IGJlIGNvbm5lY3RlZCB0b1xuICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzXG4gICAgLy8gc3VmZmljaWVudCB0byBmaXggbWVtb3J5IGlzc3VlcywgdGhhdCBib2RlcyB3ZWxsIGZvciBvdXIgcGxhbnMuXG4gICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgZmliZXIuc2libGluZyA9IG51bGw7IC8vIFRoZSBgc3RhdGVOb2RlYCBpcyBjeWNsaWNhbCBiZWNhdXNlIG9uIGhvc3Qgbm9kZXMgaXQgcG9pbnRzIHRvIHRoZSBob3N0XG4gICAgLy8gdHJlZSwgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcnMgdG8gY2hpbGRyZW4sIHBhcmVudHMsIGFuZCBzaWJsaW5ncy5cbiAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXRcbiAgICAvLyBvbmUsIHRvby5cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gSSdtIGludGVudGlvbmFsbHkgbm90IGNsZWFyaW5nIHRoZSBgcmV0dXJuYCBmaWVsZCBpbiB0aGlzIGxldmVsLiBXZVxuICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZFxuICAgIC8vIHN1YnRyZWUgKGluIGBkZXRhY2hGaWJlck11dGF0aW9uYCkuIEJlc2lkZXMsIGByZXR1cm5gIGJ5IGl0c2VsZiBpcyBub3RcbiAgICAvLyBjeWNsaWNhbCBcdTIwMTQgaXQncyBvbmx5IGN5Y2xpY2FsIHdoZW4gY29tYmluZWQgd2l0aCBgY2hpbGRgLCBgc2libGluZ2AsIGFuZFxuICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuXG5cbiAgICB7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeVxuICAgICAgLy8gZGlzY29ubmVjdGVkIHRoZSBmaWJlciBmcm9tIHRoZSB0cmVlLiBTbyBldmVuIGlmIHNvbWV0aGluZyBsZWFrcyB0aGlzXG4gICAgICAvLyBwYXJ0aWN1bGFyIGZpYmVyLCBpdCB3b24ndCBsZWFrIGFueXRoaW5nIGVsc2VcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGJyYW5jaCBpcyB0byBiZSBzdXBlciBhZ2dyZXNzaXZlIHNvIHdlIGNhbiBtZWFzdXJlXG4gICAgICAvLyBpZiB0aGVyZSdzIGFueSBkaWZmZXJlbmNlIGluIG1lbW9yeSBpbXBhY3QuIElmIHRoZXJlIGlzLCB0aGF0IGNvdWxkXG4gICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC5cbiAgICAgIGZpYmVyLnJldHVybiA9IG51bGw7XG4gICAgICBmaWJlci5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC5cblxuICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhblxuICAgIC8vIHVwIG1vdW50ZWQgbGF5b3V0IGVmZmVjdHMsIGFuZCBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIHRvcG1vc3QgaG9zdCBjaGlsZCBpbiBlYWNoIGJyYW5jaC4gQnV0IHRoZW4gd2VcbiAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlXG4gICAgLy8gY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3byBzZXBhcmF0ZSB0cmF2ZXJzYWxzIGZ1bmN0aW9ucywgd2hlcmUgdGhlIHNlY29uZFxuICAgIC8vIG9uZSBkb2Vzbid0IGluY2x1ZGUgYW55IHJlbW92ZUNoaWxkIGxvZ2ljLiBUaGlzIGlzIG1heWJlIHRoZSBzYW1lXG4gICAgLy8gZnVuY3Rpb24gYXMgXCJkaXNhcHBlYXJMYXlvdXRFZmZlY3RzXCIgKG9yIHdoYXRldmVyIHRoYXQgdHVybnMgaW50byBhZnRlclxuICAgIC8vIHRoZSBsYXlvdXQgcGhhc2UgaXMgcmVmYWN0b3JlZCB0byB1c2UgcmVjdXJzaW9uKS5cbiAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3dcbiAgICAvLyB3aGljaCBpbnN0YW5jZS9jb250YWluZXIgdG8gcmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tLlxuICAgIC8vIFRPRE86IEluc3RlYWQgb2Ygc2VhcmNoaW5nIHVwIHRoZSBmaWJlciByZXR1cm4gcGF0aCBvbiBldmVyeSBkZWxldGlvbiwgd2VcbiAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZVxuICAgIC8vIHRyZWUgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgd291bGQgbWFrZSBpbnNlcnRpb25zIGZhc3RlciwgdG9vLlxuICAgIHZhciBwYXJlbnQgPSByZXR1cm5GaWJlcjtcblxuICAgIGZpbmRQYXJlbnQ6IHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpO1xuICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICB9XG5cbiAgZGV0YWNoRmliZXJNdXRhdGlvbihkZWxldGVkRmliZXIpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7XG4gIC8vIFRPRE86IFVzZSBhIHN0YXRpYyBmbGFnIHRvIHNraXAgdHJlZXMgdGhhdCBkb24ndCBoYXZlIHVubW91bnQgZWZmZWN0c1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikge1xuICBvbkNvbW1pdFVubW91bnQoZGVsZXRlZEZpYmVyKTsgLy8gVGhlIGNhc2VzIGluIHRoaXMgb3V0ZXIgc3dpdGNoIG1vZGlmeSB0aGUgc3RhY2sgYmVmb3JlIHRoZXkgdHJhdmVyc2VcbiAgLy8gaW50byB0aGVpciBzdWJ0cmVlLiBUaGVyZSBhcmUgc2ltcGxlciBjYXNlcyBpbiB0aGUgaW5uZXIgc3dpdGNoXG4gIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay5cblxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9IC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoIHRvIG5leHQgYnJhbmNoXG5cbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIG5lYXJlc3QgaG9zdCBjaGlsZC4gU2V0IHRoZSBob3N0IHBhcmVudFxuICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcmVtb3ZlZC5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIGdvIGludG8gYSBwb3J0YWwsIGl0IGJlY29tZXMgdGhlIHBhcmVudCB0byByZW1vdmUgZnJvbS5cbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBfcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBkZWxldGVkRmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LFxuICAgICAgICAgICAgICAgICAgICB0YWcgPSBfZWZmZWN0LnRhZztcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGRlbGV0ZWRGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlXG4gICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayB0aGF0IGl0J3MgYWxyZWFkeSB1bm1vdW50ZWQgc28gdGhhdCB3ZVxuICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5tb3VudCB0aGUgZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcFxuICAgICAgICAgIC8vIG92ZXIgdGhlIG5lc3RlZCBjaGlsZHJlbiBlbnRpcmVseS4gQW4gZXhjZXB0aW9uIGlzIHdlIGhhdmVuJ3QgeWV0IGZvdW5kXG4gICAgICAgICAgLy8gdGhlIHRvcG1vc3QgaG9zdCBub2RlIHRvIGRlbGV0ZSwgd2hpY2ggd2UgYWxyZWFkeSB0cmFjayBvbiB0aGUgc3RhY2suXG4gICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvd1xuICAgICAgICAgIC8vIGRlZXBseSB0aGV5IGFyZSBuZXN0ZWQuIFdlIHNob3VsZCB1c2UgYSBzdWJ0cmVlIGZsYWcgdG8gdHJhY2sgd2hldGhlciBhXG4gICAgICAgICAgLy8gc3VidHJlZSBpbmNsdWRlcyBhIG5lc3RlZCBwb3J0YWwuXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKSB7XG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0byBwYXNzaXZlIHBoYXNlXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogQ29udGVudFJlc2V0IGdldHMgY2xlYXJlZCBieSB0aGUgY2hpbGRyZW4gZHVyaW5nIHRoZSBjb21taXRcbiAgICAgICAgICAvLyBwaGFzZS4gVGhpcyBpcyBhIHJlZmFjdG9yIGhhemFyZCBiZWNhdXNlIGl0IG1lYW5zIHdlIG11c3QgcmVhZFxuICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47XG4gICAgICAgICAgLy8gdGhlIG9yZGVyIG1hdHRlcnMuIFdlIHNob3VsZCByZWZhY3RvciBzbyB0aGF0IENvbnRlbnRSZXNldCBkb2VzIG5vdFxuICAgICAgICAgIC8vIHJlbHkgb24gbXV0YXRpbmcgdGhlIGZsYWcgZHVyaW5nIGNvbW1pdC4gTGlrZSBieSBzZXR0aW5nIGEgZmxhZ1xuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2U0ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZTQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7IC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRVcGRhdGUoX2luc3RhbmNlNCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuSW5zdGFuY2UgPSBvZmZzY3JlZW5GaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIG5ld1N0YXRlID0gb2Zmc2NyZWVuRmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDsgLy8gVHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgb24gdGhlIE9mZnNjcmVlbiBpbnN0YW5jZSBzbyB3ZSBjYW5cbiAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudFxuXG4gICAgICAgICAgb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBpc0hpZGRlbjtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgdmFyIHdhc0hpZGRlbiA9IG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZSAhPT0gbnVsbCAmJiBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKCF3YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgICAgIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX3dhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnXG4gICAgICAgICBmaW5pc2hlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgLy8gQmVmb3JlIGNvbW1pdHRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayBvbiB0aGUgc3RhY2sgd2hldGhlciB0aGlzXG4gICAgICAgICAgLy8gb2Zmc2NyZWVuIHN1YnRyZWUgd2FzIGFscmVhZHkgaGlkZGVuLCBzbyB0aGF0IHdlIGRvbid0IHVubW91bnQgdGhlXG4gICAgICAgICAgLy8gZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBfd2FzSGlkZGVuO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVmlzaWJpbGl0eSkge1xuICAgICAgICAgIHZhciBfb2Zmc2NyZWVuSW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgIHZhciBfbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICAgIHZhciBfaXNIaWRkZW4gPSBfbmV3U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICB2YXIgb2Zmc2NyZWVuQm91bmRhcnkgPSBmaW5pc2hlZFdvcms7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHN0YXRlIG9uIHRoZSBPZmZzY3JlZW4gaW5zdGFuY2Ugc28gd2UgY2FuXG4gICAgICAgICAgLy8gcmVhZCBpdCBkdXJpbmcgYW4gZXZlbnRcblxuICAgICAgICAgIF9vZmZzY3JlZW5JbnN0YW5jZS5pc0hpZGRlbiA9IF9pc0hpZGRlbjtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChfaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKCFfd2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKChvZmZzY3JlZW5Cb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5Cb3VuZGFyeTtcbiAgICAgICAgICAgICAgICAgIHZhciBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkJvdW5kYXJ5LmNoaWxkO1xuXG4gICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2NyZWVuQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkNoaWxkO1xuICAgICAgICAgICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKG9mZnNjcmVlbkNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5DaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gcnVuIHdoZW5ldmVyIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZVxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgaGlkZGVuIE9mZnNjcmVlbiB0cmVlLlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykge1xuICAvLyBQbGFjZW1lbnQgZWZmZWN0cyAoaW5zZXJ0aW9ucywgcmVvcmRlcnMpIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyXG4gIC8vIHR5cGUuIFRoZXkgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhdmUgZmlyZWQsIGJ1dFxuICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLlxuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9IC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzXG4gICAgLy8gaW5zZXJ0ZWQsIGJlZm9yZSBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXNcbiAgICAvLyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGtpbGwgdGhpcy5cblxuXG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7XG4gIH1cblxuICBpZiAoZmxhZ3MgJiBIeWRyYXRpbmcpIHtcbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gfkh5ZHJhdGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuXG4gIHZhciBpc01vZGVyblJvb3QgPSAoc3VidHJlZVJvb3QubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHtcbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIHN0YWNrJ3Mgc3RhdGUuXG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcblxuICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikge1xuICAgICAgICAvLyBUaGUgT2Zmc2NyZWVuIHRyZWUgaXMgaGlkZGVuLiBTa2lwIG92ZXIgaXRzIGxheW91dCBlZmZlY3RzLlxuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIEFsc28gY2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dE1hc2tcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIHZhciB3YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSB3YXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47IC8vIFRyYXZlcnNlIHRoZSBPZmZzY3JlZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBhcyB0aGUgcm9vdC5cblxuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuICYmICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHNcbiAgICAgICAgICAvLyBiYWNrIG9uLlxuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gZmlyc3RDaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuXG4gICAgICAgICAgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuXG5cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBjdXJyZW50LCBmaWJlciwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKVxuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljXG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhXG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIGFscmVhZHkgaGlkZGVuLiBEb24ndCBkaXNhcHBlYXJcbiAgICAgICAgICAgIC8vIGl0cyBlZmZlY3RzLlxuICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7XG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIHN0aWxsIGhpZGRlbi4gRG9uJ3QgcmUtYXBwZWFyIGl0cyBlZmZlY3RzLlxuICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkge1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBkZWxldGlvbnMgPSBmaWJlci5kZWxldGlvbnM7XG5cbiAgICAgIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXJUb0RlbGV0ZTtcbiAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGZpYmVyVG9EZWxldGUsIGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBIGZpYmVyIHdhcyBkZWxldGVkIGZyb20gdGhpcyBwYXJlbnQgZmliZXIsIGJ1dCBpdCdzIHN0aWxsIHBhcnQgb2ZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKGFsdGVybmF0ZSkgcGFyZW50IGZpYmVyJ3MgbGlzdCBvZiBjaGlsZHJlbi4gQmVjYXVzZVxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgLy8gd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIGRlbGV0ZWQgZmliZXIgdmlhIGl0cyBgYWx0ZXJuYXRlYDpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1hbHRlcm5hdGUtLT4gcHJldmlvdXMgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1zaWJsaW5nLS0+IGRlbGV0ZWQgZmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGNhbid0IGRpc2Nvbm5lY3QgYGFsdGVybmF0ZWAgb24gbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGVsZXRlZFxuICAgICAgICAgIC8vIHlldCwgYnV0IHdlIGNhbiBkaXNjb25uZWN0IHRoZSBgc2libGluZ2AgYW5kIGBjaGlsZGAgcG9pbnRlcnMuXG4gICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkQ2hpbGQgPSBwcmV2aW91c0ZpYmVyLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c0ZpYmVyLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQgPSBkZXRhY2hlZFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaWJlcik7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBEZWxldGlvbiBlZmZlY3RzIGZpcmUgaW4gcGFyZW50IC0+IGNoaWxkIG9yZGVyXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZVxuICAgIC8vIGRvIHRoaXMsIHN0aWxsIG5lZWQgdG8gaGFuZGxlIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgY29ycmVjdGx5LilcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB7XG4gICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZW50aXJlIGRlbGV0ZWQgdHJlZSBhbmQgY2xlYW4gdXAgZmliZXIgZmllbGRzLlxuICAgICAgLy8gVGhpcyBpcyBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiBpZGVhbCwgYW5kIHRoZSBsb25nIHRlcm0gZ29hbCBpcyB0byBvbmx5XG4gICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LlxuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpO1xuXG4gICAgICBpZiAoZmliZXIgPT09IGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgc3dpdGNoIChjdXJyZW50LnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn0gLy8gVE9ETzogUmV1c2UgcmVhcHBlYXJMYXlvdXRFZmZlY3RzIHRyYXZlcnNhbCBoZXJlP1xuXG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1RZUEUgPSAwO1xudmFyIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IDE7XG52YXIgUk9MRV9UWVBFID0gMjtcbnZhciBURVNUX05BTUVfVFlQRSA9IDM7XG52YXIgVEVYVF9UWVBFID0gNDtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpO1xuICBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3MnKTtcbiAgUk9MRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7XG4gIFRFWFRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGV4dCcpO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiAgamVzdElzRGVmaW5lZCAmJiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgIT09IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAge1xuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IEluY2x1ZGUgbGluayB0byByZWxldmFudCBkb2N1bWVudGF0aW9uIHBhZ2UuXG4gICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBDb21taXRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG40O1xudmFyIFJvb3RJblByb2dyZXNzID0gMDtcbnZhciBSb290RmF0YWxFcnJvcmVkID0gMTtcbnZhciBSb290RXJyb3JlZCA9IDI7XG52YXIgUm9vdFN1c3BlbmRlZCA9IDM7XG52YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7XG52YXIgUm9vdENvbXBsZXRlZCA9IDU7XG52YXIgUm9vdERpZE5vdENvbXBsZXRlID0gNjsgLy8gRGVzY3JpYmVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUmVhY3QgZXhlY3V0aW9uIHN0YWNrXG5cbnZhciBleGVjdXRpb25Db250ZXh0ID0gTm9Db250ZXh0OyAvLyBUaGUgcm9vdCB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOyAvLyBUaGUgZmliZXIgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3MgPSBudWxsOyAvLyBUaGUgbGFuZXMgd2UncmUgcmVuZGVyaW5nXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFN0YWNrIHRoYXQgYWxsb3dzIGNvbXBvbmVudHMgdG8gY2hhbmdlIHRoZSByZW5kZXIgbGFuZXMgZm9yIGl0cyBzdWJ0cmVlXG4vLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHlcbi8vIGNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSBgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXNgIGlzIHdoZW4gd2Vcbi8vIGVudGVyIGEgc3VidHJlZSB0aGF0IGlzIGhpZGRlbiBhbmQgbmVlZHMgdG8gYmUgdW5oaWRkZW46IFN1c3BlbnNlIGFuZFxuLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC5cbi8vXG4vLyBNb3N0IHRoaW5ncyBpbiB0aGUgd29yayBsb29wIHNob3VsZCBkZWFsIHdpdGggd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMuXG4vLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuXG5cbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xudmFyIHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOb0xhbmVzKTsgLy8gV2hldGhlciB0byByb290IGNvbXBsZXRlZCwgZXJyb3JlZCwgc3VzcGVuZGVkLCBldGMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7IC8vIEEgZmF0YWwgZXJyb3IsIGlmIG9uZSBpcyB0aHJvd25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsOyAvLyBcIkluY2x1ZGVkXCIgbGFuZXMgcmVmZXIgdG8gbGFuZXMgdGhhdCB3ZXJlIHdvcmtlZCBvbiBkdXJpbmcgdGhpcyByZW5kZXIuIEl0J3Ncbi8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91XG4vLyBlbnRlciBhbmQgZXhpdCBhbiBPZmZzY3JlZW4gdHJlZS4gVGhpcyB2YWx1ZSBpcyB0aGUgY29tYmluYXRpb24gb2YgYWxsIHJlbmRlclxuLy8gbGFuZXMgZm9yIHRoZSBlbnRpcmUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrIGxlZnQgb3ZlciBieSBjb21wb25lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIGR1cmluZyB0aGlzIHJlbmRlci4gT25seVxuLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS5cbi8vIFdlIHdpbGwgbG9nIHRoZW0gb25jZSB0aGUgdHJlZSBjb21taXRzLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsOyAvLyBUaGUgbW9zdCByZWNlbnQgdGltZSB3ZSBjb21taXR0ZWQgYSBmYWxsYmFjay4gVGhpcyBsZXRzIHVzIGVuc3VyZSBhIHRyYWluXG4vLyBtb2RlbCB3aGVyZSB3ZSBkb24ndCBjb21taXQgbmV3IGxvYWRpbmcgc3RhdGVzIGluIHRvbyBxdWljayBzdWNjZXNzaW9uLlxuXG52YXIgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDA7XG52YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nXG4vLyBtb3JlIGFuZCBwcmVmZXIgQ1BVIHN1c3BlbnNlIGhldXJpc3RpY3MgaW5zdGVhZC5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eTsgLy8gSG93IGxvbmcgYSByZW5kZXIgaXMgc3VwcG9zZWQgdG8gdGFrZSBiZWZvcmUgd2Ugc3RhcnQgZm9sbG93aW5nIENQVVxuLy8gc3VzcGVuc2UgaGV1cmlzdGljcyBhbmQgb3B0IG91dCBvZiByZW5kZXJpbmcgbW9yZSBjb250ZW50LlxuXG52YXIgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDA7XG52YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIFJFTkRFUl9USU1FT1VUX01TO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTtcbn1cbnZhciBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG52YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7IC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVByb2ZpbGVyTmVzdGVkVXBkYXRlU2NoZWR1bGVkSG9vayBpcyB0cnVlO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xudmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7IC8vIElmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZSBzaG91bGQgdHJlYXQgdGhlaXJcbi8vIGV2ZW50IHRpbWVzIGFzIHNpbXVsdGFuZW91cywgZXZlbiBpZiB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgaGFzIGFkdmFuY2VkXG4vLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuXG5cbnZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG52YXIgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xudmFyIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290O1xufVxuZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHtcbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIFdlJ3JlIGluc2lkZSBSZWFjdCwgc28gaXQncyBmaW5lIHRvIHJlYWQgdGhlIGFjdHVhbCB0aW1lLlxuICAgIHJldHVybiBub3coKTtcbiAgfSAvLyBXZSdyZSBub3QgaW5zaWRlIFJlYWN0LCBzbyB3ZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJyb3dzZXIgZXZlbnQuXG5cblxuICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHtcbiAgICAvLyBVc2UgdGhlIHNhbWUgc3RhcnQgdGltZSBmb3IgYWxsIHVwZGF0ZXMgdW50aWwgd2UgZW50ZXIgUmVhY3QgYWdhaW4uXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG4gIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBub3coKTtcbiAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG59XG5mdW5jdGlvbiByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcikge1xuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFRoZXNlIGFyZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIFRoZVxuICAgIC8vIG9sZCBiZWhhdmlvciBpcyB0byBnaXZlIHRoaXMgdGhlIHNhbWUgXCJ0aHJlYWRcIiAobGFuZXMpIGFzXG4gICAgLy8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4gU28gaWYgeW91IGNhbGwgYHNldFN0YXRlYCBvbiBhIGNvbXBvbmVudFxuICAgIC8vIHRoYXQgaGFwcGVucyBsYXRlciBpbiB0aGUgc2FtZSByZW5kZXIsIGl0IHdpbGwgZmx1c2guIElkZWFsbHksIHdlIHdhbnQgdG9cbiAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhblxuICAgIC8vIGludGVybGVhdmVkIGV2ZW50LiBSZWdhcmRsZXNzLCB0aGlzIHBhdHRlcm4gaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgb25seSBhIGZhbGxiYWNrLiBUaGUgZmxhZyBvbmx5IGV4aXN0cyB1bnRpbCB3ZSBjYW4gcm9sbFxuICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvblxuICAgIC8vIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjtcblxuICBpZiAoaXNUcmFuc2l0aW9uKSB7XG4gICAgaWYgKCBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gICAgICBpZiAoIXRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5hZGQoZmliZXIpO1xuICAgIH0gLy8gVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIGFuIHVwZGF0ZSB0byBhIGxhbmUgc2hvdWxkIGJlIHN0YWJsZSBmb3IgYWxsXG4gICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZVxuICAgIC8vIGlucHV0cyB0byB0aGUgYWxnb3JpdGhtIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgLy9cbiAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW5cbiAgICAvLyBldmVudC4gVGhlbiByZXNldCB0aGUgY2FjaGVkIHZhbHVlcyBvbmNlIHdlIGNhbiBiZSBzdXJlIHRoZSBldmVudCBpc1xuICAgIC8vIG92ZXIuIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cblxuXG4gICAgaWYgKGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID09PSBOb0xhbmUpIHtcbiAgICAgIC8vIEFsbCB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgYXJlIGFzc2lnbmVkIHRoZSBzYW1lIGxhbmUuXG4gICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lO1xuICB9IC8vIFVwZGF0ZXMgb3JpZ2luYXRpbmcgaW5zaWRlIGNlcnRhaW4gUmVhY3QgbWV0aG9kcywgbGlrZSBmbHVzaFN5bmMsIGhhdmVcbiAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkge1xuICAgIHJldHVybiB1cGRhdGVMYW5lO1xuICB9IC8vIFRoaXMgdXBkYXRlIG9yaWdpbmF0ZWQgb3V0c2lkZSBSZWFjdC4gQXNrIHRoZSBob3N0IGVudmlyb25tZW50IGZvciBhblxuICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7XG4gIHJldHVybiBldmVudExhbmU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RSZXRyeUxhbmUoZmliZXIpIHtcbiAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlXG4gIC8vIFwicmV0cmllc1wiIFx1MjAxNCBhIHNwZWNpYWwgdXBkYXRlIHRoYXQgYXR0ZW1wdHMgdG8gZmxpcCBhIFN1c3BlbnNlIGJvdW5kYXJ5XG4gIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLlxuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfVxuXG4gIHJldHVybiBjbGFpbU5leHRSZXRyeUxhbmUoKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpIHtcbiAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7XG5cbiAge1xuICAgIGlmIChpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QpIHtcbiAgICAgIGVycm9yKCd1c2VJbnNlcnRpb25FZmZlY3QgbXVzdCBub3Qgc2NoZWR1bGUgdXBkYXRlcy4nKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgfVxuICB9IC8vIE1hcmsgdGhhdCB0aGUgcm9vdCBoYXMgYSBwZW5kaW5nIHVwZGF0ZS5cblxuXG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0xhbmVzICYmIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFRoaXMgdXBkYXRlIHdhcyBkaXNwYXRjaGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzIGlzIGEgbWlzdGFrZVxuICAgIC8vIGlmIHRoZSB1cGRhdGUgb3JpZ2luYXRlcyBmcm9tIHVzZXIgc3BhY2UgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBsb2NhbFxuICAgIC8vIGhvb2sgdXBkYXRlcywgd2hpY2ggYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgYW5kIGRvbid0IHJlYWNoIHRoaXNcbiAgICAvLyBmdW5jdGlvbiksIGJ1dCB0aGVyZSBhcmUgc29tZSBpbnRlcm5hbCBSZWFjdCBmZWF0dXJlcyB0aGF0IHVzZSB0aGlzIGFzXG4gICAgLy8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBsaWtlIHNlbGVjdGl2ZSBoeWRyYXRpb24uXG4gICAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpOyAvLyBUcmFjayBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBub3JtYWwgdXBkYXRlLCBzY2hlZHVsZWQgZnJvbSBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuIEZvclxuICAgIC8vIGV4YW1wbGUsIGR1cmluZyBhbiBpbnB1dCBldmVudC5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgYWRkRmliZXJUb0xhbmVzTWFwKHJvb3QsIGZpYmVyLCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpO1xuXG4gICAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgICAgLy8gUmVjZWl2ZWQgYW4gdXBkYXRlIHRvIGEgdHJlZSB0aGF0J3MgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuIE1hcmtcbiAgICAgIC8vIHRoYXQgdGhlcmUgd2FzIGFuIGludGVybGVhdmVkIHVwZGF0ZSB3b3JrIG9uIHRoaXMgcm9vdC4gVW5sZXNzIHRoZVxuICAgICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAgIC8vIHBoYXNlIHVwZGF0ZS4gSW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB0cmVhdCByZW5kZXIgcGhhc2UgdXBkYXRlcyBhcyBpZlxuICAgICAgLy8gdGhleSB3ZXJlIGludGVybGVhdmVkLCBmb3IgYmFja3dhcmRzIGNvbXBhdCByZWFzb25zLlxuICAgICAgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLCBsYW5lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICAgICAgLy8gVGhlIHJvb3QgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB3aGljaCBtZWFucyB0aGlzIHJlbmRlclxuICAgICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgICAgLy8gc3VzcGVuZGVkIG5vdywgcmlnaHQgYmVmb3JlIG1hcmtpbmcgdGhlIGluY29taW5nIHVwZGF0ZS4gVGhpcyBoYXMgdGhlXG4gICAgICAgIC8vIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIGFuZCBzd2l0Y2hpbmcgdG8gdGhlIHVwZGF0ZS5cbiAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgICAvLyBhbHJlYWR5IHN0YXJ0ZWQgcmVuZGVyaW5nLlxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcblxuICAgIGlmIChsYW5lID09PSBTeW5jTGFuZSAmJiBleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBzeW5jaHJvbm91cyB3b3JrIG5vdywgdW5sZXNzIHdlJ3JlIGFscmVhZHkgd29ya2luZyBvciBpbnNpZGVcbiAgICAgIC8vIGEgYmF0Y2guIFRoaXMgaXMgaW50ZW50aW9uYWxseSBpbnNpZGUgc2NoZWR1bGVVcGRhdGVPbkZpYmVyIGluc3RlYWQgb2ZcbiAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAvLyB3aXRob3V0IGltbWVkaWF0ZWx5IGZsdXNoaW5nIGl0LiBXZSBvbmx5IGRvIHRoaXMgZm9yIHVzZXItaW5pdGlhdGVkXG4gICAgICAvLyB1cGRhdGVzLCB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIG9mIGxlZ2FjeSBtb2RlLlxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSkge1xuICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBmb3JrIG9mIHNjaGVkdWxlVXBkYXRlT25GaWJlciB0aGF0IGlzIG9ubHkgdXNlZCB0b1xuICAvLyBzY2hlZHVsZSB0aGUgaW5pdGlhbCBoeWRyYXRpb24gb2YgYSByb290IHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkLiBNb3N0XG4gIC8vIG9mIHRoZSBzdHVmZiBpbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgY2FuIGJlIHNraXBwZWQuXG4gIC8vXG4gIC8vIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBzZXBhcmF0ZSBwYXRoLCB0aG91Z2gsIGlzIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICAvLyBpbml0aWFsIGNoaWxkcmVuIGZyb20gc3Vic2VxdWVudCB1cGRhdGVzLiBJbiBmdWxseSBjbGllbnQtcmVuZGVyZWQgcm9vdHNcbiAgLy8gKGNyZWF0ZVJvb3QgaW5zdGVhZCBvZiBoeWRyYXRlUm9vdCksIGFsbCB0b3AtbGV2ZWwgcmVuZGVycyBhcmUgbW9kZWxlZCBhc1xuICAvLyB1cGRhdGVzLCBidXQgaHlkcmF0aW9uIHJvb3RzIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3RcbiAgLy8gbWF0Y2ggd2hhdCB3YXMgcmVuZGVyZWQgb24gdGhlIHNlcnZlci5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIGN1cnJlbnQubGFuZXMgPSBsYW5lO1xuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5mdW5jdGlvbiBpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIE9ubHkgY2FsbGVkIGJ5IGNsYXNzIGNvbXBvbmVudHMsXG4gIC8vIHdoaWNoIHNwZWNpYWwgKGRlcHJlY2F0ZWQpIGJlaGF2aW9yIGZvciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmUgcHJvcHMuXG4gIHJldHVybiAoLy8gVE9ETzogUmVtb3ZlIG91dGRhdGVkIGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaCBleHBlcmltZW50LiBXZVxuICAgIC8vIGRlY2lkZWQgbm90IHRvIGVuYWJsZSBpdC5cbiAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0XG4gICk7XG59IC8vIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIGEgdGFzayBmb3IgYSByb290LiBUaGVyZSdzIG9ubHkgb25lIHRhc2sgcGVyXG4vLyByb290OyBpZiBhIHRhc2sgd2FzIGFscmVhZHkgc2NoZWR1bGVkLCB3ZSdsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIHByaW9yaXR5XG4vLyBvZiB0aGUgZXhpc3RpbmcgdGFzayBpcyB0aGUgc2FtZSBhcyB0aGUgcHJpb3JpdHkgb2YgdGhlIG5leHQgbGV2ZWwgdGhhdCB0aGVcbi8vIHJvb3QgaGFzIHdvcmsgb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGV2ZXJ5IHVwZGF0ZSwgYW5kIHJpZ2h0IGJlZm9yZVxuLy8gZXhpdGluZyBhIHRhc2suXG5cbmZ1bmN0aW9uIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBjdXJyZW50VGltZSkge1xuICB2YXIgZXhpc3RpbmdDYWxsYmFja05vZGUgPSByb290LmNhbGxiYWNrTm9kZTsgLy8gQ2hlY2sgaWYgYW55IGxhbmVzIGFyZSBiZWluZyBzdGFydmVkIGJ5IG90aGVyIHdvcmsuIElmIHNvLCBtYXJrIHRoZW0gYXNcbiAgLy8gZXhwaXJlZCBzbyB3ZSBrbm93IHRvIHdvcmsgb24gdGhvc2UgbmV4dC5cblxuICBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKTsgLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIGFuZCB0aGVpciBwcmlvcml0eS5cblxuICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgICB9XG5cbiAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSB1c2UgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbGFuZSB0byByZXByZXNlbnQgdGhlIHByaW9yaXR5IG9mIHRoZSBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja1ByaW9yaXR5ID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpOyAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHRhc2suIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIGl0LlxuXG4gIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9PT0gbmV3Q2FsbGJhY2tQcmlvcml0eSAmJiAvLyBTcGVjaWFsIGNhc2UgcmVsYXRlZCB0byBgYWN0YC4gSWYgdGhlIGN1cnJlbnRseSBzY2hlZHVsZWQgdGFzayBpcyBhXG4gIC8vIFNjaGVkdWxlciB0YXNrLCByYXRoZXIgdGhhbiBhbiBgYWN0YCB0YXNrLCBjYW5jZWwgaXQgYW5kIHJlLXNjaGVkdWxlZFxuICAvLyBvbiB0aGUgYGFjdGAgcXVldWUuXG4gICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gZmFrZUFjdENhbGxiYWNrTm9kZSkpIHtcbiAgICB7XG4gICAgICAvLyBJZiB3ZSdyZSBnb2luZyB0byByZS11c2UgYW4gZXhpc3RpbmcgdGFzaywgaXQgbmVlZHMgdG8gZXhpc3QuXG4gICAgICAvLyBBc3N1bWUgdGhhdCBkaXNjcmV0ZSB1cGRhdGUgbWljcm90YXNrcyBhcmUgbm9uLWNhbmNlbGxhYmxlIGFuZCBudWxsLlxuICAgICAgLy8gVE9ETzogVGVtcG9yYXJ5IHVudGlsIHdlIGNvbmZpcm0gdGhpcyB3YXJuaW5nIGlzIG5vdCBmaXJlZC5cbiAgICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSA9PSBudWxsICYmIGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSAhPT0gU3luY0xhbmUpIHtcbiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHNjaGVkdWxlZCBjYWxsYmFjayB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFRoZSBwcmlvcml0eSBoYXNuJ3QgY2hhbmdlZC4gV2UgY2FuIHJldXNlIHRoZSBleGlzdGluZyB0YXNrLiBFeGl0LlxuXG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT0gbnVsbCkge1xuICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgY2FsbGJhY2suIFdlJ2xsIHNjaGVkdWxlIGEgbmV3IG9uZSBiZWxvdy5cbiAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTtcbiAgfSAvLyBTY2hlZHVsZSBhIG5ldyBjYWxsYmFjay5cblxuXG4gIHZhciBuZXdDYWxsYmFja05vZGU7XG5cbiAgaWYgKG5ld0NhbGxiYWNrUHJpb3JpdHkgPT09IFN5bmNMYW5lKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBTeW5jIFJlYWN0IGNhbGxiYWNrcyBhcmUgc2NoZWR1bGVkIG9uIGEgc3BlY2lhbFxuICAgIC8vIGludGVybmFsIHF1ZXVlXG4gICAgaWYgKHJvb3QudGFnID09PSBMZWdhY3lSb290KSB7XG4gICAgICBpZiAoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2hlZHVsZVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gRmx1c2ggdGhlIHF1ZXVlIGluIGEgbWljcm90YXNrLlxuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSW5zaWRlIGBhY3RgLCB1c2Ugb3VyIGludGVybmFsIGBhY3RgIHF1ZXVlIHNvIHRoYXQgdGhlc2UgZ2V0IGZsdXNoZWRcbiAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzY29wZSBldmVuIHdoZW4gdXNpbmcgdGhlIHN5bmMgdmVyc2lvblxuICAgICAgICAvLyBvZiBgYWN0YC5cbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50LnB1c2goZmx1c2hTeW5jQ2FsbGJhY2tzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBJbiBTYWZhcmksIGFwcGVuZGluZyBhbiBpZnJhbWUgZm9yY2VzIG1pY3JvdGFza3MgdG8gcnVuLlxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjI0NTlcbiAgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJ1bm5pbmcgY2FsbGJhY2tzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyXG4gICAgICAgICAgLy8gb3IgY29tbWl0IHNvIHdlIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCB0aGF0LlxuICAgICAgICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdvdWxkIHN0aWxsIHByZW1hdHVyZWx5IGZsdXNoIHRoZSBjYWxsYmFja3NcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaGFwcGVucyBvdXRzaWRlIHJlbmRlciBvciBjb21taXQgcGhhc2UgKGUuZy4gaW4gYW4gZXZlbnQpLlxuICAgICAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsO1xuXG4gICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShuZXh0TGFuZXMpKSB7XG4gICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IEltbWVkaWF0ZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV3Q2FsbGJhY2tOb2RlID0gc2NoZWR1bGVDYWxsYmFjayQxKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAge1xuICAgIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpO1xuICB9IC8vIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gYSBSZWFjdCBldmVudCwgd2UgY2FuIGNsZWFyIHRoZSBjdXJyZW50XG4gIC8vIGV2ZW50IHRpbWUuIFRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNvbXB1dGUgYSBuZXcgZXZlbnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBOb1RpbWVzdGFtcDtcbiAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLicpO1xuICB9IC8vIEZsdXNoIGFueSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBiZWZvcmUgZGVjaWRpbmcgd2hpY2ggbGFuZXMgdG8gd29yayBvbixcbiAgLy8gaW4gY2FzZSB0aGV5IHNjaGVkdWxlIGFkZGl0aW9uYWwgd29yay5cblxuXG4gIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICB2YXIgZGlkRmx1c2hQYXNzaXZlRWZmZWN0cyA9IGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcblxuICBpZiAoZGlkRmx1c2hQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcGFzc2l2ZSBlZmZlY3QgcGhhc2UgbWF5IGhhdmUgY2FuY2VsZWQgdGhlIGN1cnJlbnQgdGFzay5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFzayBub2RlIGZvciB0aGlzIHJvb3Qgd2FzIGNoYW5nZWQuXG4gICAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdGFzayB3YXMgY2FuY2VsZWQuIEV4aXQuIFdlIGRvbid0IG5lZWQgdG8gY2FsbFxuICAgICAgLy8gYGVuc3VyZVJvb3RJc1NjaGVkdWxlZGAgYmVjYXVzZSB0aGUgY2hlY2sgYWJvdmUgaW1wbGllcyBlaXRoZXIgdGhhdFxuICAgICAgLy8gdGhlcmUncyBhIG5ldyB0YXNrLCBvciB0aGF0IHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFdlIGRpc2FibGUgdGltZS1zbGljaW5nIGluIHNvbWUgY2FzZXM6IGlmIHRoZSB3b3JrIGhhcyBiZWVuIENQVS1ib3VuZFxuICAvLyBmb3IgdG9vIGxvbmcgKFwiZXhwaXJlZFwiIHdvcmssIHRvIHByZXZlbnQgc3RhcnZhdGlvbiksIG9yIHdlJ3JlIGluXG4gIC8vIHN5bmMtdXBkYXRlcy1ieS1kZWZhdWx0IG1vZGUuXG4gIC8vIFRPRE86IFdlIG9ubHkgY2hlY2sgYGRpZFRpbWVvdXRgIGRlZmVuc2l2ZWx5LCB0byBhY2NvdW50IGZvciBhIFNjaGVkdWxlclxuICAvLyBidWcgd2UncmUgc3RpbGwgaW52ZXN0aWdhdGluZy4gT25jZSB0aGUgYnVnIGluIFNjaGVkdWxlciBpcyBmaXhlZCxcbiAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSB0cmFjayBleHBpcmF0aW9uIG91cnNlbHZlcy5cblxuXG4gIHZhciBzaG91bGRUaW1lU2xpY2UgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpICYmICFpbmNsdWRlc0V4cGlyZWRMYW5lKHJvb3QsIGxhbmVzKSAmJiAoICFkaWRUaW1lb3V0KTtcbiAgdmFyIGV4aXRTdGF0dXMgPSBzaG91bGRUaW1lU2xpY2UgPyByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgOiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGxcbiAgICAgIC8vIHJlbmRlciBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbFxuICAgICAgLy8gaW5jbHVkZXMgYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyXG4gICAgICAvLyB0aGUgc2Vjb25kIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgICB2YXIgZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgIHRocm93IGZhdGFsRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3REaWROb3RDb21wbGV0ZSkge1xuICAgICAgLy8gVGhlIHJlbmRlciB1bndvdW5kIHdpdGhvdXQgY29tcGxldGluZyB0aGUgdHJlZS4gVGhpcyBoYXBwZW5zIGluIHNwZWNpYWxcbiAgICAgIC8vIGNhc2VzIHdoZXJlIG5lZWQgdG8gZXhpdCB0aGUgY3VycmVudCByZW5kZXIgd2l0aG91dCBwcm9kdWNpbmcgYVxuICAgICAgLy8gY29uc2lzdGVudCB0cmVlIG9yIGNvbW1pdHRpbmcuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIGEgY29uY3VycmVudCByZW5kZXIsIG5vdCBhIGRpc2NyZXRlIG9yXG4gICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGUuIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdGhpcyB3aGVuIHdlXG4gICAgICAvLyB1bndvdW5kIHRoZSBzdGFjay5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIGNvbXBsZXRlZC5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVuZGVyIG1heSBoYXZlIHlpZWxkZWQgdG8gYSBjb25jdXJyZW50IGV2ZW50LCBhbmQgaWYgc28sXG4gICAgICAvLyBjb25maXJtIHRoYXQgYW55IG5ld2x5IHJlbmRlcmVkIHN0b3JlcyBhcmUgY29uc2lzdGVudC5cbiAgICAgIC8vIFRPRE86IEl0J3MgcG9zc2libGUgdGhhdCBldmVuIGEgY29uY3VycmVudCByZW5kZXIgbWF5IG5ldmVyIGhhdmUgeWllbGRlZFxuICAgICAgLy8gdG8gdGhlIG1haW4gdGhyZWFkLCBpZiBpdCB3YXMgZmFzdCBlbm91Z2gsIG9yIGlmIGl0IGV4cGlyZWQuIFdlIGNvdWxkXG4gICAgICAvLyBza2lwIHRoZSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IGNhc2UsIHRvby5cbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIGxhbmVzKTtcbiAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAocmVuZGVyV2FzQ29uY3VycmVudCAmJiAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykpIHtcbiAgICAgICAgLy8gQSBzdG9yZSB3YXMgbXV0YXRlZCBpbiBhbiBpbnRlcmxlYXZlZCBldmVudC4gUmVuZGVyIGFnYWluLFxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5LCB0byBibG9jayBmdXJ0aGVyIG11dGF0aW9ucy5cbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTsgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBpZiBzb21ldGhpbmcgdGhyZXdcblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2Vycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgICAgICAgaWYgKF9lcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgIGxhbmVzID0gX2Vycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBfZXJyb3JSZXRyeUxhbmVzKTsgLy8gV2UgYXNzdW1lIHRoZSB0cmVlIGlzIG5vdyBjb25zaXN0ZW50IGJlY2F1c2Ugd2UgZGlkbid0IHlpZWxkIHRvIGFueVxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBldmVudHMuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgICAgICB2YXIgX2ZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgICAgICAgdGhyb3cgX2ZhdGFsRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIFRoZSBuZXh0IHN0ZXAgaXMgZWl0aGVyIHRvIGNvbW1pdCBpdCxcbiAgICAgIC8vIG9yLCBpZiBzb21ldGhpbmcgc3VzcGVuZGVkLCB3YWl0IHRvIGNvbW1pdCBpdCBhZnRlciBhIHRpbWVvdXQuXG5cblxuICAgICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICByb290LmZpbmlzaGVkTGFuZXMgPSBsYW5lcztcbiAgICAgIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkge1xuICAgIC8vIFRoZSB0YXNrIG5vZGUgc2NoZWR1bGVkIGZvciB0aGlzIHJvb3QgaXMgdGhlIHNhbWUgb25lIHRoYXQnc1xuICAgIC8vIGN1cnJlbnRseSBleGVjdXRlZC4gTmVlZCB0byByZXR1cm4gYSBjb250aW51YXRpb24uXG4gICAgcmV0dXJuIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcykge1xuICAvLyBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLCBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbFxuICAvLyBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cbiAgLy8gQmVmb3JlIHJlbmRlcmluZyBhZ2Fpbiwgc2F2ZSB0aGUgZXJyb3JzIGZyb20gdGhlIHByZXZpb3VzIGF0dGVtcHQuXG4gIHZhciBlcnJvcnNGcm9tRmlyc3RBdHRlbXB0ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcblxuICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgIC8vIFRoZSBzaGVsbCBmYWlsZWQgdG8gaHlkcmF0ZS4gU2V0IGEgZmxhZyB0byBmb3JjZSBhIGNsaWVudCByZW5kZXJpbmdcbiAgICAvLyBkdXJpbmcgdGhlIG5leHQgYXR0ZW1wdC4gVG8gZG8gdGhpcywgd2UgY2FsbCBwcmVwYXJlRnJlc2hTdGFjayBub3dcbiAgICAvLyB0byBjcmVhdGUgdGhlIHJvb3Qgd29yay1pbi1wcm9ncmVzcyBmaWJlci4gVGhpcyBpcyBhIGJpdCB3ZWlyZCBpbiB0ZXJtc1xuICAgIC8vIG9mIGZhY3RvcmluZywgYmVjYXVzZSBpdCByZWxpZXMgb24gcmVuZGVyUm9vdFN5bmMgbm90IGNhbGxpbmdcbiAgICAvLyBwcmVwYXJlRnJlc2hTdGFjayBhZ2FpbiBpbiB0aGUgY2FsbCBiZWxvdywgd2hpY2ggaGFwcGVucyBiZWNhdXNlIHRoZVxuICAgIC8vIHJvb3QgYW5kIGxhbmVzIGhhdmVuJ3QgY2hhbmdlZC5cbiAgICAvL1xuICAgIC8vIFRPRE86IEkgdGhpbmsgd2hhdCB3ZSBzaG91bGQgZG8gaXMgc2V0IEZvcmNlQ2xpZW50UmVuZGVyIGluc2lkZVxuICAgIC8vIHRocm93RXhjZXB0aW9uLCBsaWtlIHdlIGRvIGZvciBuZXN0ZWQgU3VzcGVuc2UgYm91bmRhcmllcy4gVGhlIHJlYXNvblxuICAgIC8vIGl0J3MgaGVyZSBpbnN0ZWFkIGlzIHNvIHdlIGNhbiBzd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHdvcmsgbG9vcCwgdG9vLlxuICAgIC8vIFNvbWV0aGluZyB0byBjb25zaWRlciBmb3IgYSBmdXR1cmUgcmVmYWN0b3IuXG4gICAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgcm9vdFdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyO1xuXG4gICAge1xuICAgICAgZXJyb3JIeWRyYXRpbmdDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG5cbiAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RFcnJvcmVkKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIHJlbmRlcmluZyBvbiByZXRyeVxuICAgIC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgZmFpbGVkIGZpcnN0IGF0dGVtcHQgaGF2ZSBiZWVuIHJlY292ZXJlZC4gQWRkXG4gICAgLy8gdGhlbSB0byB0aGUgY29sbGVjdGlvbiBvZiByZWNvdmVyYWJsZSBlcnJvcnMuIFdlJ2xsIGxvZyB0aGVtIGluIHRoZVxuICAgIC8vIGNvbW1pdCBwaGFzZS5cbiAgICB2YXIgZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yc0Zyb21GaXJzdEF0dGVtcHQ7IC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgc2Vjb25kIGF0dGVtcHQgc2hvdWxkIGJlIHF1ZXVlZCBhZnRlciB0aGUgZXJyb3JzXG4gICAgLy8gZnJvbSB0aGUgZmlyc3QgYXR0ZW1wdCwgdG8gcHJlc2VydmUgdGhlIGNhdXNhbCBzZXF1ZW5jZS5cblxuICAgIGlmIChlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCAhPT0gbnVsbCkge1xuICAgICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXRTdGF0dXM7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoZXJyb3JzKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIGVycm9ycyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcykge1xuICBzd2l0Y2ggKGV4aXRTdGF0dXMpIHtcbiAgICBjYXNlIFJvb3RJblByb2dyZXNzOlxuICAgIGNhc2UgUm9vdEZhdGFsRXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290U3VzcGVuZGVkOlxuICAgICAge1xuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsgLy8gV2UgaGF2ZSBhbiBhY2NlcHRhYmxlIGxvYWRpbmcgc3RhdGUuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB3ZVxuICAgICAgICAvLyBzaG91bGQgaW1tZWRpYXRlbHkgY29tbWl0IGl0IG9yIHdhaXQgYSBiaXQuXG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpICYmIC8vIGRvIG5vdCBkZWxheSBpZiB3ZSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGVcbiAgICAgICAgIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyByZW5kZXIgb25seSBpbmNsdWRlZCByZXRyaWVzLCBubyB1cGRhdGVzLiBUaHJvdHRsZSBjb21taXR0aW5nXG4gICAgICAgICAgLy8gcmV0cmllcyBzbyB0aGF0IHdlIGRvbid0IHNob3cgdG9vIG1hbnkgbG9hZGluZyBzdGF0ZXMgdG9vIHF1aWNrbHkuXG4gICAgICAgICAgdmFyIG1zVW50aWxUaW1lb3V0ID0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArIEZBTExCQUNLX1RIUk9UVExFX01TIC0gbm93KCk7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLlxuXG4gICAgICAgICAgaWYgKG1zVW50aWxUaW1lb3V0ID4gMTApIHtcbiAgICAgICAgICAgIHZhciBuZXh0TGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgICAgICAgLy8gVGhlcmUncyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMoc3VzcGVuZGVkTGFuZXMsIGxhbmVzKSkge1xuICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgcHJlZmVyIHRvIHJlbmRlciB0aGUgZmFsbGJhY2sgb2YgYXQgdGhlIGxhc3RcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGxldmVsLiBQaW5nIHRoZSBsYXN0IHN1c3BlbmRlZCBsZXZlbCB0byB0cnlcbiAgICAgICAgICAgICAgLy8gcmVuZGVyaW5nIGl0IGFnYWluLlxuICAgICAgICAgICAgICAvLyBGSVhNRTogV2hhdCBpZiB0aGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBJZGxlPyBTaG91bGQgbm90IHJlc3RhcnQuXG4gICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICAgIG1hcmtSb290UGluZ2VkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IC8vIFRoZSByZW5kZXIgaXMgc3VzcGVuZGVkLCBpdCBoYXNuJ3QgdGltZWQgb3V0LCBhbmQgdGhlcmUncyBub1xuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgd29yayB0byBkby4gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHksIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuXG5cblxuICAgICAgICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KGNvbW1pdFJvb3QuYmluZChudWxsLCByb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyksIG1zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUaGUgd29yayBleHBpcmVkLiBDb21taXQgaW1tZWRpYXRlbHkuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgX21zVW50aWxUaW1lb3V0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBDb21taXQgdGhlIHBsYWNlaG9sZGVyLlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAge1xuICAgICAgICAvLyBUaGUgd29yayBjb21wbGV0ZWQuIFJlYWR5IHRvIGNvbW1pdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHJvb3QgZXhpdCBzdGF0dXMuJyk7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAvLyBTZWFyY2ggdGhlIHJlbmRlcmVkIHRyZWUgZm9yIGV4dGVybmFsIHN0b3JlIHJlYWRzLCBhbmQgY2hlY2sgd2hldGhlciB0aGVcbiAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZCBpbiBhIGNvbmN1cnJlbnQgZXZlbnQuIEludGVudGlvbmFsbHkgdXNpbmcgYW4gaXRlcmF0aXZlXG4gIC8vIGxvb3AgaW5zdGVhZCBvZiByZWN1cnNpb24gc28gd2UgY2FuIGV4aXQgZWFybHkuXG4gIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKG5vZGUuZmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5KSB7XG4gICAgICB2YXIgdXBkYXRlUXVldWUgPSBub2RlLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IHVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgICAgICBpZiAoY2hlY2tzICE9PSBudWxsKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGVjayA9IGNoZWNrc1tpXTtcbiAgICAgICAgICAgIHZhciBnZXRTbmFwc2hvdCA9IGNoZWNrLmdldFNuYXBzaG90O1xuICAgICAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSBjaGVjay52YWx1ZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCByZW5kZXJlZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluY29uc2lzdGVudCBzdG9yZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIElmIGBnZXRTbmFwc2hvdGAgdGhyb3dzLCByZXR1cm4gYGZhbHNlYC4gVGhpcyB3aWxsIHNjaGVkdWxlXG4gICAgICAgICAgICAgIC8vIGEgcmUtcmVuZGVyLCBhbmQgdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gZHVyaW5nIHJlbmRlci5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAobm9kZS5zdWJ0cmVlRmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5ICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IGNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IGRvZXNuJ3Qga25vdyB0aGlzIGlzIHVucmVhY2hhYmxlLCBidXQgZXNsaW50IGRvZXNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICAvLyBXaGVuIHN1c3BlbmRpbmcsIHdlIHNob3VsZCBhbHdheXMgZXhjbHVkZSBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIG9yIChtb3JlXG4gIC8vIHJhcmVseSwgc2luY2Ugd2UgdHJ5IHRvIGF2b2lkIGl0KSB1cGRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuICAvLyBUT0RPOiBMb2wgbWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gZmFjdG9yIHRoaXMgYmVzaWRlcyB0aGlzXG4gIC8vIG9ibm94aW91c2x5IG5hbWVkIGZ1bmN0aW9uIDopXG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzKTtcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpO1xuICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IGdvXG4vLyB0aHJvdWdoIFNjaGVkdWxlclxuXG5cbmZ1bmN0aW9uIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KSB7XG4gIHtcbiAgICBzeW5jTmVzdGVkVXBkYXRlRmxhZygpO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUobGFuZXMsIFN5bmNMYW5lKSkge1xuICAgIC8vIFRoZXJlJ3Mgbm8gcmVtYWluaW5nIHN5bmMgd29yayBsZWZ0LlxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgLy8gc3luY2hyb25vdXNseSB0byBibG9jayBjb25jdXJyZW50IGRhdGEgbXV0YXRpb25zLCBhbmQgd2UnbGwgaW5jbHVkZXNcbiAgICAvLyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXIgdGhlIHNlY29uZFxuICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG4gICAgdmFyIGVycm9yUmV0cnlMYW5lcyA9IGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpO1xuXG4gICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgbGFuZXMgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTsgLy8gQmVmb3JlIGV4aXRpbmcsIG1ha2Ugc3VyZSB0aGVyZSdzIGEgY2FsbGJhY2sgc2NoZWR1bGVkIGZvciB0aGUgbmV4dFxuICAvLyBwZW5kaW5nIGxldmVsLlxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFJvb3Qocm9vdCwgbGFuZXMpIHtcbiAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbWVyZ2VMYW5lcyhsYW5lcywgU3luY0xhbmUpKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBJZiB0aGVyZSB3ZXJlIGxlZ2FjeSBzeW5jIHVwZGF0ZXMsIGZsdXNoIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgb3V0ZXJcbiAgICAvLyBtb3N0IGJhdGNoZWRVcGRhdGVzLWxpa2UgbWV0aG9kLlxuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAvLyBUcmVhdCBgYWN0YCBhcyBpZiBpdCdzIGluc2lkZSBgYmF0Y2hlZFVwZGF0ZXNgLCBldmVuIGluIGxlZ2FjeSBtb2RlLlxuICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyhmbiwgYSwgYiwgYywgZCkge1xuICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHJldHVybiBmbihhLCBiLCBjLCBkKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgfVxuICB9XG59IC8vIE92ZXJsb2FkIHRoZSBkZWZpbml0aW9uIHRvIHRoZSB0d28gdmFsaWQgc2lnbmF0dXJlcy5cbi8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyhmbikge1xuICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgZmx1c2ggcGVuZGluZyBwYXNzaXZlIGVmZmVjdHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgLy8gbmV4dCBldmVudCwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG9uZS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsICYmIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLnRhZyA9PT0gTGVnYWN5Um9vdCAmJiAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuXG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGhhcHBlbiBldmVuIGlmIGJhdGNoZWRVcGRhdGVzIGlzIGhpZ2hlciB1cFxuICAgIC8vIHRoZSBzdGFjay5cblxuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gaXNBbHJlYWR5UmVuZGVyaW5nKCkge1xuICAvLyBVc2VkIGJ5IHRoZSByZW5kZXJlciB0byBwcmludCBhIHdhcm5pbmcgaWYgY2VydGFpbiBBUElzIGFyZSBjYWxsZWQgZnJvbVxuICAvLyB0aGUgd3JvbmcgY29udGV4dC5cbiAgcmV0dXJuICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoUmVuZGVyTGFuZXMoZmliZXIsIGxhbmVzKSB7XG4gIHB1c2goc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLCBzdWJ0cmVlUmVuZGVyTGFuZXMsIGZpYmVyKTtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhzdWJ0cmVlUmVuZGVyTGFuZXMsIGxhbmVzKTtcbiAgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcG9wUmVuZGVyTGFuZXMoZmliZXIpIHtcbiAgc3VidHJlZVJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yLmN1cnJlbnQ7XG4gIHBvcChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTtcblxuICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7XG4gICAgLy8gVGhlIHJvb3QgcHJldmlvdXMgc3VzcGVuZGVkIGFuZCBzY2hlZHVsZWQgYSB0aW1lb3V0IHRvIGNvbW1pdCBhIGZhbGxiYWNrXG4gICAgLy8gc3RhdGUuIE5vdyB0aGF0IHdlIGhhdmUgYWRkaXRpb25hbCB3b3JrLCBjYW5jZWwgdGhlIHRpbWVvdXQuXG4gICAgcm9vdC50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0OyAvLyAkRmxvd0ZpeE1lIENvbXBsYWlucyBub1RpbWVvdXQgaXMgbm90IGEgVGltZW91dElELCBkZXNwaXRlIHRoZSBjaGVjayBhYm92ZVxuXG4gICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgfVxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIHZhciBpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICB3aGlsZSAoaW50ZXJydXB0ZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGludGVycnVwdGVkV29yay5hbHRlcm5hdGU7XG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGludGVycnVwdGVkV29yayA9IGludGVycnVwdGVkV29yay5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgdmFyIHJvb3RXb3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzID0gcm9vdFdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBsYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcblxuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZGlzY2FyZFBlbmRpbmdXYXJuaW5ncygpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3RXb3JrSW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuXG4gICAgICAgIGlmICh0aHJvd25WYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhyb3duVmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aHJvd25WYWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIHdha2VhYmxlID0gdGhyb3duVmFsdWU7XG4gICAgICAgICAgbWFya0NvbXBvbmVudFN1c3BlbmRlZChlcnJvcmVkV29yaywgd2FrZWFibGUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50RXJyb3JlZChlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvd0V4Y2VwdGlvbihyb290LCBlcnJvcmVkV29yay5yZXR1cm4sIGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgY29tcGxldGVVbml0T2ZXb3JrKGVycm9yZWRXb3JrKTtcbiAgICB9IGNhdGNoICh5ZXRBbm90aGVyVGhyb3duVmFsdWUpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBpbiB0aGUgcmV0dXJuIHBhdGggYWxzbyB0aHJldy5cbiAgICAgIHRocm93blZhbHVlID0geWV0QW5vdGhlclRocm93blZhbHVlO1xuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IGVycm9yZWRXb3JrICYmIGVycm9yZWRXb3JrICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHRoaXMgYm91bmRhcnkgaGFzIGFscmVhZHkgZXJyb3JlZCwgdGhlbiB3ZSBoYWQgdHJvdWJsZSBwcm9jZXNzaW5nXG4gICAgICAgIC8vIHRoZSBlcnJvci4gQnViYmxlIGl0IHRvIHRoZSBuZXh0IGJvdW5kYXJ5LlxuICAgICAgICBlcnJvcmVkV29yayA9IGVycm9yZWRXb3JrLnJldHVybjtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBlcnJvcmVkV29yaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gUmV0dXJuIHRvIHRoZSBub3JtYWwgd29yayBsb29wLlxuXG5cbiAgICByZXR1cm47XG4gIH0gd2hpbGUgKHRydWUpO1xufVxuXG5mdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQ7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIGlmIChwcmV2RGlzcGF0Y2hlciA9PT0gbnVsbCkge1xuICAgIC8vIFRoZSBSZWFjdCBpc29tb3JwaGljIHBhY2thZ2UgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgZGlzcGF0Y2hlci5cbiAgICAvLyBJbnN0ZWFkIHRoZSBmaXJzdCByZW5kZXJlciB3aWxsIGxhemlseSBhdHRhY2ggb25lLCBpbiBvcmRlciB0byBnaXZlXG4gICAgLy8gbmljZXIgZXJyb3IgbWVzc2FnZXMuXG4gICAgcmV0dXJuIENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJldkRpc3BhdGNoZXI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcikge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKSB7XG4gIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSBub3coKTtcbn1cbmZ1bmN0aW9uIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobGFuZSkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBtZXJnZUxhbmVzKGxhbmUsIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyk7XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZDtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheTtcbiAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgdXBkYXRlcyB0aGF0IHdlIHNraXBwZWQgdHJlZSB0aGF0IG1pZ2h0IGhhdmUgdW5ibG9ja2VkXG4gIC8vIHRoaXMgcmVuZGVyLlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gbnVsbCAmJiAoaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpIHx8IGluY2x1ZGVzTm9uSWRsZVdvcmsod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKGVycm9yKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzICE9PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG59IC8vIENhbGxlZCBkdXJpbmcgcmVuZGVyIHRvIGRldGVybWluZSBpZiBhbnl0aGluZyBoYXMgc3VzcGVuZGVkLlxuLy8gUmV0dXJucyBmYWxzZSBpZiB3ZSdyZSBub3Qgc3VyZS5cblxuZnVuY3Rpb24gcmVuZGVySGFzTm90U3VzcGVuZGVkWWV0KCkge1xuICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBvciBjb21wbGV0ZWQsIHdlIGNhbid0IHJlYWxseSBiZSBzdXJlLFxuICAvLyBzbyB0aG9zZSBhcmUgZmFsc2UuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcztcbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICB9XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTtcbiAgfVxuXG4gIGRvIHtcbiAgICB0cnkge1xuICAgICAgd29ya0xvb3BTeW5jKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkge1xuICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpO1xuICAgIH1cbiAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyBhIHN5bmMgcmVuZGVyLCBzbyB3ZSBzaG91bGQgaGF2ZSBmaW5pc2hlZCB0aGUgd2hvbGUgdHJlZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgYW4gaW5jb21wbGV0ZSByb290LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSAnICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVXBkYXRlcnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgICAgIH0gLy8gQXQgdGhpcyBwb2ludCwgbW92ZSBGaWJlcnMgdGhhdCBzY2hlZHVsZWQgdGhlIHVwY29taW5nIHdvcmsgZnJvbSB0aGUgTWFwIHRvIHRoZSBTZXQuXG4gICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuXG4gICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1vdmUgdGhlbSBub3cgaW4gY2FzZSB0aGUgd29yayBzcGF3bnMgbW9yZSB3b3JrIGF0IHRoZSBzYW1lIHByaW9yaXR5IHdpdGggZGlmZmVyZW50IHVwZGF0ZXJzLlxuICAgICAgICAvLyBUaGF0IHdheSB3ZSBjYW4ga2VlcCB0aGUgY3VycmVudCB1cGRhdGUgYW5kIGZ1dHVyZSB1cGRhdGVzIHNlcGFyYXRlLlxuXG5cbiAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpO1xuICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFN0aWxsIHdvcmsgcmVtYWluaW5nLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFJvb3RJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIC8vIENvbXBsZXRlZCB0aGUgdHJlZS5cbiAgICB7XG4gICAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICAgIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFJldHVybiB0aGUgZmluYWwgZXhpdCBzdGF0dXMuXG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgfVxufVxuLyoqIEBub2lubGluZSAqL1xuXG5cbmZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudCgpIHtcbiAgLy8gUGVyZm9ybSB3b3JrIHVudGlsIFNjaGVkdWxlciBhc2tzIHVzIHRvIHlpZWxkXG4gIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCAmJiAhc2hvdWxkWWllbGQoKSkge1xuICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtVW5pdE9mV29yayh1bml0T2ZXb3JrKSB7XG4gIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHlcbiAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICB2YXIgY3VycmVudCA9IHVuaXRPZldvcmsuYWx0ZXJuYXRlO1xuICBzZXRDdXJyZW50RmliZXIodW5pdE9mV29yayk7XG4gIHZhciBuZXh0O1xuXG4gIGlmICggKHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEodW5pdE9mV29yaywgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXNldEN1cnJlbnRGaWJlcigpO1xuICB1bml0T2ZXb3JrLm1lbW9pemVkUHJvcHMgPSB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcztcblxuICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCBzcGF3biBuZXcgd29yaywgY29tcGxldGUgdGhlIGN1cnJlbnQgd29yay5cbiAgICBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yayk7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MgPSBuZXh0O1xuICB9XG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gQXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY3VycmVudCB1bml0IG9mIHdvcmssIHRoZW4gbW92ZSB0byB0aGUgbmV4dFxuICAvLyBzaWJsaW5nLiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzaWJsaW5ncywgcmV0dXJuIHRvIHRoZSBwYXJlbnQgZmliZXIuXG4gIHZhciBjb21wbGV0ZWRXb3JrID0gdW5pdE9mV29yaztcblxuICBkbyB7XG4gICAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAgIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0XG4gICAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLlxuICAgIHZhciBjdXJyZW50ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGU7XG4gICAgdmFyIHJldHVybkZpYmVyID0gY29tcGxldGVkV29yay5yZXR1cm47IC8vIENoZWNrIGlmIHRoZSB3b3JrIGNvbXBsZXRlZCBvciBpZiBzb21ldGhpbmcgdGhyZXcuXG5cbiAgICBpZiAoKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgdmFyIG5leHQgPSB2b2lkIDA7XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgICAgIG5leHQgPSBjb21wbGV0ZVdvcmsoY3VycmVudCwgY29tcGxldGVkV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcihjb21wbGV0ZWRXb3JrKTtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOyAvLyBVcGRhdGUgcmVuZGVyIGR1cmF0aW9uIGFzc3VtaW5nIHdlIGRpZG4ndCBlcnJvci5cblxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgICAgaWYgKG5leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gQ29tcGxldGluZyB0aGlzIGZpYmVyIHNwYXduZWQgbmV3IHdvcmsuIFdvcmsgb24gdGhhdCBuZXh0LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugc29tZXRoaW5nIHRocmV3LiBQb3AgdmFsdWVzIG9mZlxuICAgICAgLy8gdGhlIHN0YWNrIHdpdGhvdXQgZW50ZXJpbmcgdGhlIGNvbXBsZXRlIHBoYXNlLiBJZiB0aGlzIGlzIGEgYm91bmRhcnksXG4gICAgICAvLyBjYXB0dXJlIHZhbHVlcyBpZiBwb3NzaWJsZS5cbiAgICAgIHZhciBfbmV4dCA9IHVud2luZFdvcmsoY3VycmVudCwgY29tcGxldGVkV29yayk7IC8vIEJlY2F1c2UgdGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlLCBkb24ndCByZXNldCBpdHMgbGFuZXMuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgc3VidHJlZSBmbGFncy5cbiAgICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gSW5jb21wbGV0ZTtcbiAgICAgICAgcmV0dXJuRmliZXIuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdlJ3ZlIHVud291bmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QuXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RGlkTm90Q29tcGxldGU7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaWJsaW5nRmliZXIgPSBjb21wbGV0ZWRXb3JrLnNpYmxpbmc7XG5cbiAgICBpZiAoc2libGluZ0ZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gaW4gdGhpcyByZXR1cm5GaWJlciwgZG8gdGhhdCBuZXh0LlxuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nRmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBPdGhlcndpc2UsIHJldHVybiB0byB0aGUgcGFyZW50XG5cblxuICAgIGNvbXBsZXRlZFdvcmsgPSByZXR1cm5GaWJlcjsgLy8gVXBkYXRlIHRoZSBuZXh0IHRoaW5nIHdlJ3JlIHdvcmtpbmcgb24gaW4gY2FzZSBzb21ldGhpbmcgdGhyb3dzLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjb21wbGV0ZWRXb3JrO1xuICB9IHdoaWxlIChjb21wbGV0ZWRXb3JrICE9PSBudWxsKTsgLy8gV2UndmUgcmVhY2hlZCB0aGUgcm9vdC5cblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290Q29tcGxldGVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3Qocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zKSB7XG4gIC8vIFRPRE86IFRoaXMgbm8gbG9uZ2VyIG1ha2VzIGFueSBzZW5zZS4gV2UgYWxyZWFkeSB3cmFwIHRoZSBtdXRhdGlvbiBhbmRcbiAgLy8gbGF5b3V0IHBoYXNlcy4gU2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlLlxuICB2YXIgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gIHRyeSB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICBkbyB7XG4gICAgLy8gYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgY2FsbCBgZmx1c2hTeW5jVXBkYXRlUXVldWVgIGF0IHRoZSBlbmQsIHdoaWNoXG4gICAgLy8gbWVhbnMgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgc29tZXRpbWVzIHJlc3VsdCBpbiBhZGRpdGlvbmFsXG4gICAgLy8gcGFzc2l2ZSBlZmZlY3RzLiBTbyB3ZSBuZWVkIHRvIGtlZXAgZmx1c2hpbmcgaW4gYSBsb29wIHVudGlsIHRoZXJlIGFyZVxuICAgIC8vIG5vIG1vcmUgcGVuZGluZyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1pZ2h0IGJlIGJldHRlciBpZiBgZmx1c2hQYXNzaXZlRWZmZWN0c2AgZGlkIG5vdCBhdXRvbWF0aWNhbGx5XG4gICAgLy8gZmx1c2ggc3luY2hyb25vdXMgd29yayBhdCB0aGUgZW5kLCB0byBhdm9pZCBmYWN0b3JpbmcgaGF6YXJkcyBsaWtlIHRoaXMuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB9IHdoaWxlIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCk7XG5cbiAgZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCk7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICB7XG4gICAgbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgaWYgKGZpbmlzaGVkV29yayA9PT0gbnVsbCkge1xuXG4gICAge1xuICAgICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBpZiAobGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAgICAgZXJyb3IoJ3Jvb3QuZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhICcgKyAnYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSByb290LmN1cnJlbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb21taXQgdGhlIHNhbWUgdHJlZSBhcyBiZWZvcmUuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfSAvLyBjb21taXRSb290IG5ldmVyIHJldHVybnMgYSBjb250aW51YXRpb247IGl0IGFsd2F5cyBmaW5pc2hlcyBzeW5jaHJvbm91c2x5LlxuICAvLyBTbyB3ZSBjYW4gY2xlYXIgdGhlc2Ugbm93IHRvIGFsbG93IGEgbmV3IGNhbGxiYWNrIHRvIGJlIHNjaGVkdWxlZC5cblxuXG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIElmIHRoZXJlIGFyZSBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZW0uXG4gIC8vIERvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUsIHNvIGl0IGlzIHF1ZXVlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0XG4gIC8vIG1pZ2h0IGdldCBzY2hlZHVsZWQgaW4gdGhlIGNvbW1pdCBwaGFzZS4gKFNlZSAjMTY3MTQuKVxuICAvLyBUT0RPOiBEZWxldGUgYWxsIG90aGVyIHBsYWNlcyB0aGF0IHNjaGVkdWxlIHRoZSBwYXNzaXZlIGVmZmVjdCBjYWxsYmFja1xuICAvLyBUaGV5J3JlIHJlZHVuZGFudC5cblxuXG4gIGlmICgoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyB8fCAoZmluaXNoZWRXb3JrLmZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzKSB7XG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgLy8gdG8gc3RvcmUgaXQgaW4gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyB1bnRpbCB0aGV5IGdldCBwcm9jZXNzZWRcbiAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyB0aGlzIHRocm91Z2ggYXMgYW4gYXJndW1lbnQgdG8gY29tbWl0Um9vdFxuICAgICAgLy8gYmVjYXVzZSB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zIG1pZ2h0IGhhdmUgY2hhbmdlZCBiZXR3ZWVuXG4gICAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyIGFuZCBjb21taXQgaWYgd2UgdGhyb3R0bGUgdGhlIGNvbW1pdFxuICAgICAgLy8gd2l0aCBzZXRUaW1lb3V0XG5cbiAgICAgIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9ucztcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7IC8vIFRoaXMgcmVuZGVyIHRyaWdnZXJlZCBwYXNzaXZlIGVmZmVjdHM6IHJlbGVhc2UgdGhlIHJvb3QgY2FjaGUgcG9vbFxuICAgICAgICAvLyAqYWZ0ZXIqIHBhc3NpdmUgZWZmZWN0cyBmaXJlIHRvIGF2b2lkIGZyZWVpbmcgYSBjYWNoZSBwb29sIHRoYXQgbWF5XG4gICAgICAgIC8vIGJlIHJlZmVyZW5jZWQgYnkgYSBub2RlIGluIHRoZSB0cmVlIChIb3N0Um9vdCwgQ2FjaGUgYm91bmRhcnkgZXRjKVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgZWZmZWN0cyBpbiB0aGUgd2hvbGUgdHJlZS5cbiAgLy8gVE9ETzogVGhpcyBpcyBsZWZ0IG92ZXIgZnJvbSB0aGUgZWZmZWN0IGxpc3QgaW1wbGVtZW50YXRpb24sIHdoZXJlIHdlIGhhZFxuICAvLyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBgZmlyc3RFZmZlY3RgIHRvIHNhdGlzZnkgRmxvdy4gSSB0aGluayB0aGVcbiAgLy8gb25seSBvdGhlciByZWFzb24gdGhpcyBvcHRpbWl6YXRpb24gZXhpc3RzIGlzIGJlY2F1c2UgaXQgYWZmZWN0cyBwcm9maWxpbmcuXG4gIC8vIFJlY29uc2lkZXIgd2hldGhlciB0aGlzIGlzIG5lY2Vzc2FyeS5cblxuXG4gIHZhciBzdWJ0cmVlSGFzRWZmZWN0cyA9IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgKEJlZm9yZU11dGF0aW9uTWFzayB8IE11dGF0aW9uTWFzayB8IExheW91dE1hc2sgfCBQYXNzaXZlTWFzaykpICE9PSBOb0ZsYWdzO1xuICB2YXIgcm9vdEhhc0VmZmVjdCA9IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKHN1YnRyZWVIYXNFZmZlY3RzIHx8IHJvb3RIYXNFZmZlY3QpIHtcbiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0OyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIHZhciBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuXG5cbiAgICBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG5cbiAgICByZXNldEFmdGVyQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7IC8vIFRoZSB3b3JrLWluLXByb2dyZXNzIHRyZWUgaXMgbm93IHRoZSBjdXJyZW50IHRyZWUuIFRoaXMgbXVzdCBjb21lIGFmdGVyXG4gICAgLy8gdGhlIG11dGF0aW9uIHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsIGN1cnJlbnQgZHVyaW5nXG4gICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQsIGJ1dCBiZWZvcmUgdGhlIGxheW91dCBwaGFzZSwgc28gdGhhdCB0aGUgZmluaXNoZWRcbiAgICAvLyB3b3JrIGlzIGN1cnJlbnQgZHVyaW5nIGNvbXBvbmVudERpZE1vdW50L1VwZGF0ZS5cblxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gVGhlIG5leHQgcGhhc2UgaXMgdGhlIGxheW91dCBwaGFzZSwgd2hlcmUgd2UgY2FsbCBlZmZlY3RzIHRoYXQgcmVhZFxuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG5cbiAgICBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpO1xuXG4gICAge1xuICAgICAgbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7XG4gICAgfVxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG5cbiAgICByZXF1ZXN0UGFpbnQoKTtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIFJlc2V0IHRoZSBwcmlvcml0eSB0byB0aGUgcHJldmlvdXMgbm9uLXN5bmMgdmFsdWUuXG5cbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gZWZmZWN0cy5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIE1lYXN1cmUgdGhlc2UgYW55d2F5IHNvIHRoZSBmbGFtZWdyYXBoIGV4cGxpY2l0bHkgc2hvd3MgdGhhdCB0aGVyZSB3ZXJlXG4gICAgLy8gbm8gZWZmZWN0cy5cbiAgICAvLyBUT0RPOiBNYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byByZXBvcnQgdGhpcy5cblxuICAgIHtcbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cyA9IHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzO1xuXG4gIGlmIChyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIC8vIFRoaXMgY29tbWl0IGhhcyBwYXNzaXZlIGVmZmVjdHMuIFN0YXNoIGEgcmVmZXJlbmNlIHRvIHRoZW0uIEJ1dCBkb24ndFxuICAgIC8vIHNjaGVkdWxlIGEgY2FsbGJhY2sgdW50aWwgYWZ0ZXIgZmx1c2hpbmcgbGF5b3V0IHdvcmsuXG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IHJvb3Q7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgfSBlbHNlIHtcblxuICAgIHtcbiAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhbiBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzOyAvLyBDaGVjayBpZiB0aGVyZSdzIHJlbWFpbmluZyB3b3JrIG9uIHRoaXMgcm9vdFxuICAvLyBUT0RPOiBUaGlzIGlzIHBhcnQgb2YgdGhlIGBjb21wb25lbnREaWRDYXRjaGAgaW1wbGVtZW50YXRpb24uIEl0cyBwdXJwb3NlXG4gIC8vIGlzIHRvIGRldGVjdCB3aGV0aGVyIHNvbWV0aGluZyBtaWdodCBoYXZlIGNhbGxlZCBzZXRTdGF0ZSBpbnNpZGVcbiAgLy8gYGNvbXBvbmVudERpZENhdGNoYC4gVGhlIG1lY2hhbmlzbSBpcyBrbm93biB0byBiZSBmbGF3ZWQgYmVjYXVzZSBgc2V0U3RhdGVgXG4gIC8vIGluc2lkZSBgY29tcG9uZW50RGlkQ2F0Y2hgIGlzIGl0c2VsZiBmbGF3ZWQgXHUyMDE0IHRoYXQncyB3aHkgd2UgcmVjb21tZW5kXG4gIC8vIGBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3JgIGluc3RlYWQuIEhvd2V2ZXIsIGl0IGNvdWxkIGJlIGltcHJvdmVkIGJ5XG4gIC8vIGNoZWNraW5nIGlmIHJlbWFpbmluZ0xhbmVzIGluY2x1ZGVzIFN5bmMgd29yaywgaW5zdGVhZCBvZiB3aGV0aGVyIHRoZXJlJ3NcbiAgLy8gYW55IHdvcmsgcmVtYWluaW5nIGF0IGFsbCAod2hpY2ggd291bGQgYWxzbyBpbmNsdWRlIHN0dWZmIGxpa2UgU3VzcGVuc2VcbiAgLy8gcmV0cmllcyBvciB0cmFuc2l0aW9ucykuIEl0J3MgYmVlbiBsaWtlIHRoaXMgZm9yIGEgd2hpbGUsIHRob3VnaCwgc28gZml4aW5nXG4gIC8vIGl0IHByb2JhYmx5IGlzbid0IHRoYXQgdXJnZW50LlxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmssIHdlIGNhbiBjbGVhciB0aGUgc2V0IG9mIGFscmVhZHkgZmFpbGVkXG4gICAgLy8gZXJyb3IgYm91bmRhcmllcy5cbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKCFyb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIHJvb3QubWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBvbkNvbW1pdFJvb3QkMSgpO1xuICB9IC8vIEFsd2F5cyBjYWxsIHRoaXMgYmVmb3JlIGV4aXRpbmcgYGNvbW1pdFJvb3RgLCB0byBlbnN1cmUgdGhhdCBhbnlcbiAgLy8gYWRkaXRpb25hbCB3b3JrIG9uIHRoaXMgcm9vdCBpcyBzY2hlZHVsZWQuXG5cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyZWNvdmVyYWJsZUVycm9ycyAhPT0gbnVsbCkge1xuICAgIC8vIFRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHJlY292ZXJlZCBmcm9tIHRoZW0gd2l0aG91dFxuICAgIC8vIG5lZWRpbmcgdG8gc3VyZmFjZSBpdCB0byB0aGUgVUkuIFdlIGxvZyB0aGVtIGhlcmUuXG4gICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IHJvb3Qub25SZWNvdmVyYWJsZUVycm9yO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSByZWNvdmVyYWJsZUVycm9yc1tpXTtcbiAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHJlY292ZXJhYmxlRXJyb3Iuc3RhY2s7XG4gICAgICB2YXIgZGlnZXN0ID0gcmVjb3ZlcmFibGVFcnJvci5kaWdlc3Q7XG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IocmVjb3ZlcmFibGVFcnJvci52YWx1ZSwge1xuICAgICAgICBjb21wb25lbnRTdGFjazogY29tcG9uZW50U3RhY2ssXG4gICAgICAgIGRpZ2VzdDogZGlnZXN0XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTtcbiAgICB2YXIgZXJyb3IkMSA9IGZpcnN0VW5jYXVnaHRFcnJvcjtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yJDE7XG4gIH0gLy8gSWYgdGhlIHBhc3NpdmUgZWZmZWN0cyBhcmUgdGhlIHJlc3VsdCBvZiBhIGRpc2NyZXRlIHJlbmRlciwgZmx1c2ggdGhlbVxuICAvLyBzeW5jaHJvbm91c2x5IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFzayBzbyB0aGF0IHRoZSByZXN1bHQgaXNcbiAgLy8gaW1tZWRpYXRlbHkgb2JzZXJ2YWJsZS4gT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFyZSBub3RcbiAgLy8gb3JkZXItZGVwZW5kZW50IGFuZCBkbyBub3QgbmVlZCB0byBiZSBvYnNlcnZlZCBieSBleHRlcm5hbCBzeXN0ZW1zLCBzbyB3ZVxuICAvLyBjYW4gd2FpdCB1bnRpbCBhZnRlciBwYWludC5cbiAgLy8gVE9ETzogV2UgY2FuIG9wdGltaXplIHRoaXMgYnkgbm90IHNjaGVkdWxpbmcgdGhlIGNhbGxiYWNrIGVhcmxpZXIuIFNpbmNlIHdlXG4gIC8vIGN1cnJlbnRseSBzY2hlZHVsZSB0aGUgY2FsbGJhY2sgaW4gbXVsdGlwbGUgcGxhY2VzLCB3aWxsIHdhaXQgdW50aWwgdGhvc2VcbiAgLy8gYXJlIGNvbnNvbGlkYXRlZC5cblxuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzLCBTeW5jTGFuZSkgJiYgcm9vdC50YWcgIT09IExlZ2FjeVJvb3QpIHtcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gLy8gUmVhZCB0aGlzIGFnYWluLCBzaW5jZSBhIHBhc3NpdmUgZWZmZWN0IG1pZ2h0IGhhdmUgdXBkYXRlZCBpdFxuXG5cbiAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW1haW5pbmdMYW5lcywgU3luY0xhbmUpKSB7XG4gICAge1xuICAgICAgbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpO1xuICAgIH0gLy8gQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm9vdCBzeW5jaHJvbm91c2x5IHJlLXJlbmRlcnMgd2l0aG91dFxuICAgIC8vIGZpbmlzaGluZy4gSWYgdGhlcmUgYXJlIHRvbyBtYW55LCBpdCBpbmRpY2F0ZXMgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AuXG5cblxuICAgIGlmIChyb290ID09PSByb290V2l0aE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IHJvb3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcblxuICB7XG4gICAgbWFya0NvbW1pdFN0b3BwZWQoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgLy8gVE9ETzogQ29tYmluZSB0aGlzIGNoZWNrIHdpdGggdGhlIG9uZSBpbiBmbHVzaFBhc3NpdmVFRmZlY3RzSW1wbC4gV2Ugc2hvdWxkXG4gIC8vIHByb2JhYmx5IGp1c3QgY29tYmluZSB0aGUgdHdvIGZ1bmN0aW9ucy4gSSBiZWxpZXZlIHRoZXkgd2VyZSBvbmx5IHNlcGFyYXRlXG4gIC8vIGluIHRoZSBmaXJzdCBwbGFjZSBiZWNhdXNlIHdlIHVzZWQgdG8gd3JhcCBpdCB3aXRoXG4gIC8vIGBTY2hlZHVsZXIucnVuV2l0aFByaW9yaXR5YCwgd2hpY2ggYWNjZXB0cyBhIGZ1bmN0aW9uLiBCdXQgbm93IHdlIHRyYWNrIHRoZVxuICAvLyBwcmlvcml0eSB3aXRoaW4gUmVhY3QgaXRzZWxmLCBzbyB3ZSBjYW4gbXV0YXRlIHRoZSB2YXJpYWJsZSBkaXJlY3RseS5cbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKSB7XG4gICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMpO1xuICAgIHZhciBwcmlvcml0eSA9IGxvd2VyRXZlbnRQcmlvcml0eShEZWZhdWx0RXZlbnRQcmlvcml0eSwgcmVuZGVyUHJpb3JpdHkpO1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJpb3JpdHkpO1xuICAgICAgcmV0dXJuIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOyAvLyBPbmNlIHBhc3NpdmUgZWZmZWN0cyBoYXZlIHJ1biBmb3IgdGhlIHRyZWUgLSBnaXZpbmcgY29tcG9uZW50cyBhXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmliZXIpIHtcbiAge1xuICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzLnB1c2goZmliZXIpO1xuXG4gICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKSB7XG4gIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBDYWNoZSBhbmQgY2xlYXIgdGhlIHRyYW5zaXRpb25zIGZsYWdcblxuXG4gIHZhciB0cmFuc2l0aW9ucyA9IHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnM7XG4gIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsO1xuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsOyAvLyBUT0RPOiBUaGlzIGlzIHNvbWV0aW1lcyBvdXQgb2Ygc3luYyB3aXRoIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzLlxuICAvLyBGaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBJdCdzIG5vdCBjYXVzaW5nIGFueSBrbm93biBpc3N1ZXMgKHByb2JhYmx5XG4gIC8vIGJlY2F1c2UgaXQncyBvbmx5IHVzZWQgZm9yIHByb2ZpbGluZyksIGJ1dCBpdCdzIGEgcmVmYWN0b3IgaGF6YXJkLlxuXG4gIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIHdoaWxlIGFscmVhZHkgcmVuZGVyaW5nLicpO1xuICB9XG5cbiAge1xuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0O1xuICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMocm9vdC5jdXJyZW50KTtcbiAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCByb290LmN1cnJlbnQsIGxhbmVzLCB0cmFuc2l0aW9ucyk7IC8vIFRPRE86IE1vdmUgdG8gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c1xuXG4gIHtcbiAgICB2YXIgcHJvZmlsZXJFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHM7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvZmlsZXJFZmZlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgX2ZpYmVyID0gcHJvZmlsZXJFZmZlY3RzW2ldO1xuICAgICAgY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhyb290LCBfZmliZXIpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7XG4gIH1cblxuICB7XG4gICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgdHJ1ZSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICAvLyBJZiBhZGRpdGlvbmFsIHBhc3NpdmUgZWZmZWN0cyB3ZXJlIHNjaGVkdWxlZCwgaW5jcmVtZW50IGEgY291bnRlci4gSWYgdGhpc1xuICAgIC8vIGV4Y2VlZHMgdGhlIGxpbWl0LCB3ZSdsbCBmaXJlIGEgd2FybmluZy5cbiAgICBpZiAoZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICB9XG5cbiAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH0gLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cblxuICBvblBvc3RDb21taXRSb290KHJvb3QpO1xuXG4gIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gcm9vdC5jdXJyZW50LnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkICE9PSBudWxsICYmIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmhhcyhpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBtYXJrTGVnYWN5RXJyb3JCb3VuZGFyeUFzRmFpbGVkKGluc3RhbmNlKSB7XG4gIGlmIChsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9PT0gbnVsbCkge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbmV3IFNldChbaW5zdGFuY2VdKTtcbiAgfSBlbHNlIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5hZGQoaW5zdGFuY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcihlcnJvcikge1xuICBpZiAoIWhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gdHJ1ZTtcbiAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuXG52YXIgb25VbmNhdWdodEVycm9yID0gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yO1xuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUocm9vdEZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihzb3VyY2VGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IkMSkge1xuICB7XG4gICAgcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yJDEpO1xuICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gIH1cblxuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZmliZXIgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlciA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3I7XG4gIH1cblxuICB3aGlsZSAoZmliZXIgIT09IG51bGwpIHtcbiAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3QoZmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciQxLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcblxuICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IGZpYmVyLnJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBUT0RPOiBVbnRpbCB3ZSByZS1sYW5kIHNraXBVbm1vdW50ZWRCb3VuZGFyaWVzIChzZWUgIzIwMTQ3KSwgdGhpcyB3YXJuaW5nXG4gICAgLy8gd2lsbCBmaXJlIGZvciBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGJ5IGRlc3Ryb3kgZnVuY3Rpb25zIGluc2lkZSBkZWxldGVkXG4gICAgLy8gdHJlZXMuIFdoYXQgaXQgc2hvdWxkIGluc3RlYWQgZG8gaXMgcHJvcGFnYXRlIHRoZSBlcnJvciB0byB0aGUgcGFyZW50IG9mXG4gICAgLy8gdGhlIGRlbGV0ZWQgdHJlZS4gSW4gdGhlIG1lYW50aW1lLCBkbyBub3QgYWRkIHRoaXMgd2FybmluZyB0byB0aGVcbiAgICAvLyBhbGxvd2xpc3Q7IHRoaXMgaXMgb25seSBmb3Igb3VyIGludGVybmFsIHVzZS5cbiAgICBlcnJvcignSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEF0dGVtcHRlZCB0byBjYXB0dXJlIGEgY29tbWl0IHBoYXNlIGVycm9yICcgKyAnaW5zaWRlIGEgZGV0YWNoZWQgdHJlZS4gVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4gUmVhY3QuIExpa2VseSAnICsgJ2NhdXNlcyBpbmNsdWRlIGRlbGV0aW5nIHRoZSBzYW1lIGZpYmVyIG1vcmUgdGhhbiBvbmNlLCBjb21taXR0aW5nIGFuICcgKyAnYWxyZWFkeS1maW5pc2hlZCB0cmVlLCBvciBhbiBpbmNvbnNpc3RlbnQgcmV0dXJuIHBvaW50ZXIuXFxuXFxuJyArICdFcnJvciBtZXNzYWdlOlxcblxcbiVzJywgZXJyb3IkMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuICB3YXJuSWZTdXNwZW5zZVJlc29sdXRpb25Ob3RXcmFwcGVkV2l0aEFjdERFVihyb290KTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ID09PSByb290ICYmIGlzU3Vic2V0T2ZMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcywgcGluZ2VkTGFuZXMpKSB7XG4gICAgLy8gUmVjZWl2ZWQgYSBwaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseVxuICAgIC8vIHJlbmRlcmluZy4gV2UgbWlnaHQgd2FudCB0byByZXN0YXJ0IHRoaXMgcmVuZGVyLiBUaGlzIHNob3VsZCBtaXJyb3JcbiAgICAvLyB0aGUgbG9naWMgb2Ygd2hldGhlciBvciBub3QgYSByb290IHN1c3BlbmRzIG9uY2UgaXQgY29tcGxldGVzLlxuICAgIC8vIFRPRE86IElmIHdlJ3JlIHJlbmRlcmluZyBzeW5jIGVpdGhlciBkdWUgdG8gU3luYywgQmF0Y2hlZCBvciBleHBpcmVkLFxuICAgIC8vIHdlIHNob3VsZCBwcm9iYWJseSBuZXZlciByZXN0YXJ0LlxuICAgIC8vIElmIHdlJ3JlIHN1c3BlbmRlZCB3aXRoIGRlbGF5LCBvciBpZiBpdCdzIGEgcmV0cnksIHdlJ2xsIGFsd2F5cyBzdXNwZW5kXG4gICAgLy8gc28gd2UgY2FuIGFsd2F5cyByZXN0YXJ0LlxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5IHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgJiYgaW5jbHVkZXNPbmx5UmV0cmllcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcykgJiYgbm93KCkgLSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lIDwgRkFMTEJBQ0tfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFJlc3RhcnQgZnJvbSB0aGUgcm9vdC5cbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSBjYW4ndCByZXN0YXJ0IHJpZ2h0IG5vdywgd2UgbWlnaHQgZ2V0IGFuXG4gICAgICAvLyBvcHBvcnR1bml0eSBsYXRlci4gU28gd2UgbWFyayB0aGlzIHJlbmRlciBhcyBoYXZpbmcgYSBwaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzLCBwaW5nZWRMYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG59XG5cbmZ1bmN0aW9uIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpIHtcbiAgLy8gVGhlIGJvdW5kYXJ5IGZpYmVyIChhIFN1c3BlbnNlIGNvbXBvbmVudCBvciBTdXNwZW5zZUxpc3QgY29tcG9uZW50KVxuICAvLyBwcmV2aW91c2x5IHdhcyByZW5kZXJlZCBpbiBpdHMgZmFsbGJhY2sgc3RhdGUuIE9uZSBvZiB0aGUgcHJvbWlzZXMgdGhhdFxuICAvLyBzdXNwZW5kZWQgaXQgaGFzIHJlc29sdmVkLCB3aGljaCBtZWFucyBhdCBsZWFzdCBwYXJ0IG9mIHRoZSB0cmVlIHdhc1xuICAvLyBsaWtlbHkgdW5ibG9ja2VkLiBUcnkgcmVuZGVyaW5nIGFnYWluLCBhdCBhIG5ldyBsYW5lcy5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgLy8gVE9ETzogQXNzaWduIHRoaXMgdG8gYHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lYD8gdG8gYXZvaWRcbiAgICAvLyB1bm5lY2Vzc2FyeSBlbnRhbmdsZW1lbnQ/XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgcmV0cnlMYW5lLCBldmVudFRpbWUpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlUmV0cnlXYWtlYWJsZShib3VuZGFyeUZpYmVyLCB3YWtlYWJsZSkge1xuICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lOyAvLyBEZWZhdWx0XG5cbiAgdmFyIHJldHJ5Q2FjaGU7XG5cbiAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykge1xuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpbmdlZCB1bmtub3duIHN1c3BlbnNlIGJvdW5kYXJ5IHR5cGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfVxuXG4gIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcmV0cnlDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7XG59IC8vIENvbXB1dGVzIHRoZSBuZXh0IEp1c3QgTm90aWNlYWJsZSBEaWZmZXJlbmNlIChKTkQpIGJvdW5kYXJ5LlxuLy8gVGhlIHRoZW9yeSBpcyB0aGF0IGEgcGVyc29uIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLlxuLy8gVGhlcmVmb3JlLCBpZiB3ZSB3YWl0IGEgYml0IGxvbmdlciB0aGFuIG5lY2Vzc2FyeSB0aGF0IHdvbid0IHRyYW5zbGF0ZSB0byBhIG5vdGljZWFibGVcbi8vIGRpZmZlcmVuY2UgaW4gdGhlIGV4cGVyaWVuY2UuIEhvd2V2ZXIsIHdhaXRpbmcgZm9yIGxvbmdlciBtaWdodCBtZWFuIHRoYXQgd2UgY2FuIGF2b2lkXG4vLyBzaG93aW5nIGFuIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBUaGUgbG9uZ2VyIHdlIGhhdmUgYWxyZWFkeSB3YWl0ZWQsIHRoZSBoYXJkZXIgaXRcbi8vIGlzIHRvIHRlbGwgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS4gVGhlcmVmb3JlLCB0aGUgbG9uZ2VyIHdlJ3ZlIGFscmVhZHkgd2FpdGVkLFxuLy8gdGhlIGxvbmdlciB3ZSBjYW4gd2FpdCBhZGRpdGlvbmFsbHkuIEF0IHNvbWUgcG9pbnQgd2UgaGF2ZSB0byBnaXZlIHVwIHRob3VnaC5cbi8vIFdlIHBpY2sgYSB0cmFpbiBtb2RlbCB3aGVyZSB0aGUgbmV4dCBib3VuZGFyeSBjb21taXRzIGF0IGEgY29uc2lzdGVudCBzY2hlZHVsZS5cbi8vIFRoZXNlIHBhcnRpY3VsYXIgbnVtYmVycyBhcmUgdmFndWUgZXN0aW1hdGVzLiBXZSBleHBlY3QgdG8gYWRqdXN0IHRoZW0gYmFzZWQgb24gcmVzZWFyY2guXG5cbmZ1bmN0aW9uIGpuZCh0aW1lRWxhcHNlZCkge1xuICByZXR1cm4gdGltZUVsYXBzZWQgPCAxMjAgPyAxMjAgOiB0aW1lRWxhcHNlZCA8IDQ4MCA/IDQ4MCA6IHRpbWVFbGFwc2VkIDwgMTA4MCA/IDEwODAgOiB0aW1lRWxhcHNlZCA8IDE5MjAgPyAxOTIwIDogdGltZUVsYXBzZWQgPCAzMDAwID8gMzAwMCA6IHRpbWVFbGFwc2VkIDwgNDMyMCA/IDQzMjAgOiBjZWlsKHRpbWVFbGFwc2VkIC8gMTk2MCkgKiAxOTYwO1xufVxuXG5mdW5jdGlvbiBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKSB7XG4gIGlmIChuZXN0ZWRVcGRhdGVDb3VudCA+IE5FU1RFRF9VUERBVEVfTElNSVQpIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgJ3JlcGVhdGVkbHkgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIGNvbXBvbmVudFdpbGxVcGRhdGUgb3IgJyArICdjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvICcgKyAncHJldmVudCBpbmZpbml0ZSBsb29wcy4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUKSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7XG5cbiAgICAgIGVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArIFwiY2FsbHMgc2V0U3RhdGUgaW5zaWRlIHVzZUVmZmVjdCwgYnV0IHVzZUVmZmVjdCBlaXRoZXIgZG9lc24ndCBcIiArICdoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiAnICsgJ2V2ZXJ5IHJlbmRlci4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCkge1xuICB7XG4gICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZygpO1xuXG4gICAge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKGZpYmVyLCBoYXNQYXNzaXZlRWZmZWN0cykge1xuICB7XG4gICAgLy8gVE9ETyAoU3RyaWN0RWZmZWN0cykgU2hvdWxkIHdlIHNldCBhIG1hcmtlciBvbiB0aGUgcm9vdCBpZiBpdCBjb250YWlucyBzdHJpY3QgZWZmZWN0c1xuICAgIC8vIHNvIHdlIGRvbid0IHRyYXZlcnNlIHVubmVjZXNzYXJpbHk/IHNpbWlsYXIgdG8gc3VidHJlZUZsYWdzIGJ1dCBqdXN0IGF0IHRoZSByb290IGxldmVsLlxuICAgIC8vIE1heWJlIG5vdCBhIGJpZyBkZWFsIHNpbmNlIHRoaXMgaXMgREVWIG9ubHkgYmVoYXZpb3IuXG4gICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0TW91bnRJbkRFVik7XG5cbiAgICBpZiAoaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VFZmZlY3RzSW5EZXYoZmlyc3RDaGlsZCwgZmliZXJGbGFncywgaW52b2tlRWZmZWN0Rm4pIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHZhciBjdXJyZW50ID0gZmlyc3RDaGlsZDtcbiAgICB2YXIgc3VidHJlZVJvb3QgPSBudWxsO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmltYXJ5U3VidHJlZUZsYWcgPSBjdXJyZW50LnN1YnRyZWVGbGFncyAmIGZpYmVyRmxhZ3M7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBzdWJ0cmVlUm9vdCAmJiBjdXJyZW50LmNoaWxkICE9PSBudWxsICYmIHByaW1hcnlTdWJ0cmVlRmxhZyAhPT0gTm9GbGFncykge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIGZpYmVyRmxhZ3MpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgaW52b2tlRWZmZWN0Rm4oY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudC5zaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc2libGluZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50ID0gc3VidHJlZVJvb3QgPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5mdW5jdGlvbiB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAvLyBXZSBsZXQgdGhlIG90aGVyIHdhcm5pbmcgYWJvdXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgZGVhbCB3aXRoIHRoaXMgb25lLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuXG4gICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIGVycm9yKFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gXCIgKyAnVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBhIHNpZGUtZWZmZWN0IGluIHlvdXIgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgJyArICdhc3luY2hyb25vdXNseSBsYXRlciBjYWxscyB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gJyArICd1c2VFZmZlY3QgaW5zdGVhZC4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG52YXIgYmVnaW5Xb3JrJDE7XG5cbntcbiAgdmFyIGR1bW15RmliZXIgPSBudWxsO1xuXG4gIGJlZ2luV29yayQxID0gZnVuY3Rpb24gKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKSB7XG4gICAgLy8gSWYgYSBjb21wb25lbnQgdGhyb3dzIGFuIGVycm9yLCB3ZSByZXBsYXkgaXQgYWdhaW4gaW4gYSBzeW5jaHJvbm91c2x5XG4gICAgLy8gZGlzcGF0Y2hlZCBldmVudCwgc28gdGhhdCB0aGUgZGVidWdnZXIgd2lsbCB0cmVhdCBpdCBhcyBhbiB1bmNhdWdodFxuICAgIC8vIGVycm9yIFNlZSBSZWFjdEVycm9yVXRpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY29weSB0aGUgd29yay1pbi1wcm9ncmVzcyBvbnRvIGEgZHVtbXlcbiAgICAvLyBmaWJlci4gSWYgYmVnaW5Xb3JrIHRocm93cywgd2UnbGwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIHN0YXRlLlxuICAgIHZhciBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSA9IGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKGR1bW15RmliZXIsIHVuaXRPZldvcmspO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiZWdpbldvcmsoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuICAgIH0gY2F0Y2ggKG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkgfHwgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuXG4gICAgICAgIC8vIERvbid0IHJlcGxheSBlcnJvcnMgaWYgd2UgYXJlIGh5ZHJhdGluZyBhbmQgaGF2ZSBhbHJlYWR5IHN1c3BlbmRlZCBvciBoYW5kbGVkIGFuIGVycm9yXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9IC8vIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgd2l0aCBoYW5kbGVFcnJvcjsgYW55IGNoYW5nZXMgaGVyZSBtdXN0IGhhdmVcbiAgICAgIC8vIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0aGVyZS5cblxuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7IC8vIERvbid0IHJlc2V0IGN1cnJlbnQgZGVidWcgZmliZXIsIHNpbmNlIHdlJ3JlIGFib3V0IHRvIHdvcmsgb24gdGhlXG4gICAgICAvLyBzYW1lIGZpYmVyIGFnYWluLlxuICAgICAgLy8gVW53aW5kIHRoZSBmYWlsZWQgc3RhY2sgZnJhbWVcblxuICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIHVuaXRPZldvcmspOyAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIG9mIHRoZSBmaWJlci5cblxuICAgICAgYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodW5pdE9mV29yaywgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkpO1xuXG4gICAgICBpZiAoIHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBwcm9maWxlciB0aW1lci5cbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspO1xuICAgICAgfSAvLyBSdW4gYmVnaW5Xb3JrIGFnYWluLlxuXG5cbiAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBiZWdpbldvcmssIG51bGwsIGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgdmFyIHJlcGxheUVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGF5RXJyb3IgPT09ICdvYmplY3QnICYmIHJlcGxheUVycm9yICE9PSBudWxsICYmIHJlcGxheUVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgIW9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICAgIC8vIElmIHN1cHByZXNzZWQsIGxldCB0aGUgZmxhZyBjYXJyeSBvdmVyIHRvIHRoZSBvcmlnaW5hbCBlcnJvciB3aGljaCBpcyB0aGUgb25lIHdlJ2xsIHJldGhyb3cuXG4gICAgICAgICAgb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBhbHdheXMgdGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yIGluIGNhc2UgdGhlIHNlY29uZCByZW5kZXIgcGFzcyBpcyBub3QgaWRlbXBvdGVudC5cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIG1lbW9pemVkIGZ1bmN0aW9uIG9yIENvbW1vbkpTIG1vZHVsZSBkb2Vzbid0IHRocm93IGFmdGVyIGZpcnN0IGludm9jYXRpb24uXG5cblxuICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IGZhbHNlO1xudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudDtcblxue1xuICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQgPSBuZXcgU2V0KCk7XG59XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaXNSZW5kZXJpbmcgJiYgIWdldElzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2VJbkRFVigpKSB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSA9IHdvcmtJblByb2dyZXNzICYmIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJzsgLy8gRGVkdXBlIGJ5IHRoZSByZW5kZXJpbmcgY29tcG9uZW50IGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQuXG5cbiAgICAgICAgICAgIHZhciBkZWR1cGVLZXkgPSByZW5kZXJpbmdDb21wb25lbnROYW1lO1xuXG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5oYXMoZGVkdXBlS2V5KSkge1xuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuYWRkKGRlZHVwZUtleSk7XG4gICAgICAgICAgICAgIHZhciBzZXRTdGF0ZUNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7XG4gICAgICBtZW1vaXplZFVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxpbmdGaWJlcikge1xuICAgICAgICBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgc2NoZWR1bGluZ0ZpYmVyLCBsYW5lcyk7XG4gICAgICB9KTsgLy8gVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGNsZWFyIG1lbW9pemVkIHVwZGF0ZXJzLlxuICAgICAgLy8gVGhvc2UgbWF5IHN0aWxsIGJlIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IGNvbW1pdFxuICAgICAgLy8gYW5kIGEgZnV0dXJlIG9uZSAoZS5nLiBTdXNwZW5zZSkuXG4gICAgfVxuICB9XG59XG52YXIgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrJDEocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spIHtcbiAge1xuICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYW4gYGFjdGAgc2NvcGUsIGJ5cGFzcyBTY2hlZHVsZXIgYW5kIHB1c2ggdG9cbiAgICAvLyB0aGUgYGFjdGAgcXVldWUgaW5zdGVhZC5cbiAgICB2YXIgYWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQ7XG5cbiAgICBpZiAoYWN0UXVldWUgIT09IG51bGwpIHtcbiAgICAgIGFjdFF1ZXVlLnB1c2goY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGZha2VBY3RDYWxsYmFja05vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2skMShjYWxsYmFja05vZGUpIHtcbiAgaWYgKCBjYWxsYmFja05vZGUgPT09IGZha2VBY3RDYWxsYmFja05vZGUpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gSW4gcHJvZHVjdGlvbiwgYWx3YXlzIGNhbGwgU2NoZWR1bGVyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgc3RyaXBwZWQgb3V0LlxuXG5cbiAgcmV0dXJuIGNhbmNlbENhbGxiYWNrKGNhbGxiYWNrTm9kZSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlVwZGF0ZXNOb3RXcmFwcGVkV2l0aEFjdERFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgaWYgKCFpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWdhY3kgbW9kZSBoYXMgYWRkaXRpb25hbCBjYXNlcyB3aGVyZSB3ZSBzdXBwcmVzcyBhIHdhcm5pbmcuXG4gICAgICBpZiAoIWlzTGVnYWN5QWN0RW52aXJvbm1lbnQoKSkge1xuICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgIT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBMZWdhY3kgbW9kZSBkb2Vzbid0IHdhcm4gaWYgdGhlIHVwZGF0ZSBpcyBiYXRjaGVkLCBpLmUuXG4gICAgICAgIC8vIGJhdGNoZWRVcGRhdGVzIG9yIGZsdXNoU3luYy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmliZXIudGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiBmaWJlci50YWcgIT09IEZvcndhcmRSZWYgJiYgZmliZXIudGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZS1ob29rcyBjb2RlLCBsZWdhY3kgbW9kZSBvbmx5XG4gICAgICAgIC8vIHdhcm5zIGZvciB1cGRhdGVzIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBob29rLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdBbiB1cGRhdGUgdG8gJXMgaW5zaWRlIGEgdGVzdCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpIHtcbiAge1xuICAgIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0Egc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCAnICsgJ3dhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IHJlc29sdmVzIHN1c3BlbmRlZCBkYXRhIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpbmlzaCBsb2FkaW5nIHN1c3BlbmRlZCBkYXRhICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0Jyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChpc1J1bm5pbmcpIHtcbiAge1xuICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGlzUnVubmluZztcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzICovXG52YXIgcmVzb2x2ZUZhbWlseSA9IG51bGw7IC8vICRGbG93Rml4TWUgRmxvdyBnZXRzIGNvbmZ1c2VkIGJ5IGEgV2Vha1NldCBmZWF0dXJlIGNoZWNrIGJlbG93LlxuXG52YXIgZmFpbGVkQm91bmRhcmllcyA9IG51bGw7XG52YXIgc2V0UmVmcmVzaEhhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICB7XG4gICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICAvLyBObyBpbXBsZW1lbnRhdGlvbiBkaWZmZXJlbmNlcy5cbiAgcmV0dXJuIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHJlYWwgZm9yd2FyZFJlZi4gRG9uJ3Qgd2FudCB0byBjcmFzaCBlYXJseS5cbiAgICAgIGlmICh0eXBlICE9PSBudWxsICYmIHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRm9yd2FyZFJlZiBpcyBzcGVjaWFsIGJlY2F1c2UgaXRzIHJlc29sdmVkIC50eXBlIGlzIGFuIG9iamVjdCxcbiAgICAgICAgLy8gYnV0IGl0J3MgcG9zc2libGUgdGhhdCB3ZSBvbmx5IGhhdmUgaXRzIGlubmVyIHJlbmRlciBmdW5jdGlvbiBpbiB0aGUgbWFwLlxuICAgICAgICAvLyBJZiB0aGF0IGlubmVyIHJlbmRlciBmdW5jdGlvbiBpcyBkaWZmZXJlbnQsIHdlJ2xsIGJ1aWxkIGEgbmV3IGZvcndhcmRSZWYgdHlwZS5cbiAgICAgICAgdmFyIGN1cnJlbnRSZW5kZXIgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZS5yZW5kZXIpO1xuXG4gICAgICAgIGlmICh0eXBlLnJlbmRlciAhPT0gY3VycmVudFJlbmRlcikge1xuICAgICAgICAgIHZhciBzeW50aGV0aWNUeXBlID0ge1xuICAgICAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgICAgICAgICByZW5kZXI6IGN1cnJlbnRSZW5kZXJcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3ludGhldGljVHlwZS5kaXNwbGF5TmFtZSA9IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN5bnRoZXRpY1R5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi5cblxuXG4gICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoZmliZXIsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBwcmV2VHlwZSA9IGZpYmVyLmVsZW1lbnRUeXBlO1xuICAgIHZhciBuZXh0VHlwZSA9IGVsZW1lbnQudHlwZTsgLy8gSWYgd2UgZ290IGhlcmUsIHdlIGtub3cgdHlwZXMgYXJlbid0ID09PSBlcXVhbC5cblxuICAgIHZhciBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IGZhbHNlO1xuICAgIHZhciAkJHR5cGVvZk5leHRUeXBlID0gdHlwZW9mIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSAhPT0gbnVsbCA/IG5leHRUeXBlLiQkdHlwZW9mIDogbnVsbDtcblxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGlubmVyIHR5cGUgeWV0LlxuICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhlIGxhenkgaW5uZXIgdHlwZSBpcyBzdGFibGUsXG4gICAgICAgICAgICAvLyBhbmQgc28gaXQgaXMgc3VmZmljaWVudCB0byBhdm9pZCByZWNvbmNpbGluZyBpdCBhd2F5LlxuICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHVud3JhcCBvciBhY3R1YWxseSB1c2UgdGhlIG5ldyBsYXp5IHR5cGUuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IGlmIGl0IHdhcyBidXQgY2FuIG5vIGxvbmdlciBiZSBzaW1wbGUsXG4gICAgICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgc2V0IHRoaXMuXG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBDaGVjayBpZiBib3RoIHR5cGVzIGhhdmUgYSBmYW1pbHkgYW5kIGl0J3MgdGhlIHNhbWUgb25lLlxuXG5cbiAgICBpZiAobmVlZHNDb21wYXJlRmFtaWxpZXMpIHtcbiAgICAgIC8vIE5vdGU6IG1lbW8oKSBhbmQgZm9yd2FyZFJlZigpIHdlJ2xsIGNvbXBhcmUgb3V0ZXIgcmF0aGVyIHRoYW4gaW5uZXIgdHlwZS5cbiAgICAgIC8vIFRoaXMgbWVhbnMgYm90aCBvZiB0aGVtIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCB0byBwcmVzZXJ2ZSBzdGF0ZS5cbiAgICAgIC8vIElmIHdlIHVud3JhcHBlZCBhbmQgY29tcGFyZWQgdGhlIGlubmVyIHR5cGVzIGZvciB3cmFwcGVycyBpbnN0ZWFkLFxuICAgICAgLy8gdGhlbiB3ZSB3b3VsZCByaXNrIGZhbHNlbHkgc2F5aW5nIHR3byBzZXBhcmF0ZSBtZW1vKEZvbylcbiAgICAgIC8vIGNhbGxzIGFyZSBlcXVpdmFsZW50IGJlY2F1c2UgdGhleSB3cmFwIHRoZSBzYW1lIEZvbyBmdW5jdGlvbi5cbiAgICAgIHZhciBwcmV2RmFtaWx5ID0gcmVzb2x2ZUZhbWlseShwcmV2VHlwZSk7XG5cbiAgICAgIGlmIChwcmV2RmFtaWx5ICE9PSB1bmRlZmluZWQgJiYgcHJldkZhbWlseSA9PT0gcmVzb2x2ZUZhbWlseShuZXh0VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcikge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBXZWFrU2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgPT09IG51bGwpIHtcbiAgICAgIGZhaWxlZEJvdW5kYXJpZXMgPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cblxuICAgIGZhaWxlZEJvdW5kYXJpZXMuYWRkKGZpYmVyKTtcbiAgfVxufVxudmFyIHNjaGVkdWxlUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCB1cGRhdGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdGFsZUZhbWlsaWVzID0gdXBkYXRlLnN0YWxlRmFtaWxpZXMsXG4gICAgICAgIHVwZGF0ZWRGYW1pbGllcyA9IHVwZGF0ZS51cGRhdGVkRmFtaWxpZXM7XG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9KTtcbiAgfVxufTtcbnZhciBzY2hlZHVsZVJvb3QgPSBmdW5jdGlvbiAocm9vdCwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJvb3QuY29udGV4dCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICAvLyBTdXBlciBlZGdlIGNhc2U6IHJvb3QgaGFzIGEgbGVnYWN5IF9yZW5kZXJTdWJ0cmVlIGNvbnRleHRcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSBwYXJlbnRDb21wb25lbnQgc28gd2UgY2FuJ3QgcGFzcyBpdC5cbiAgICAgIC8vIEp1c3QgaWdub3JlLiBXZSdsbCBkZWxldGUgdGhpcyB3aXRoIF9yZW5kZXJTdWJ0cmVlIGNvZGUgcGF0aCBsYXRlci5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCByb290LCBudWxsLCBudWxsKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShmaWJlciwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlLFxuICAgICAgICBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc29sdmVGYW1pbHkgdG8gYmUgc2V0IGR1cmluZyBob3QgcmVsb2FkLicpO1xuICAgIH1cblxuICAgIHZhciBuZWVkc1JlbmRlciA9IGZhbHNlO1xuICAgIHZhciBuZWVkc1JlbW91bnQgPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseShjYW5kaWRhdGVUeXBlKTtcblxuICAgICAgaWYgKGZhbWlseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChzdGFsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh1cGRhdGVkRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBpZiAodGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVlZHNSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzICE9PSBudWxsKSB7XG4gICAgICBpZiAoZmFpbGVkQm91bmRhcmllcy5oYXMoZmliZXIpIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBmYWlsZWRCb3VuZGFyaWVzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCkge1xuICAgICAgZmliZXIuX2RlYnVnTmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50IHx8IG5lZWRzUmVuZGVyKSB7XG4gICAgICB2YXIgX3Jvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgICAgaWYgKF9yb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihfcm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsICYmICFuZWVkc1JlbW91bnQpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoY2hpbGQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoc2libGluZywgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCA9IGZ1bmN0aW9uIChyb290LCBmYW1pbGllcykge1xuICB7XG4gICAgdmFyIGhvc3RJbnN0YW5jZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHR5cGVzID0gbmV3IFNldChmYW1pbGllcy5tYXAoZnVuY3Rpb24gKGZhbWlseSkge1xuICAgICAgcmV0dXJuIGZhbWlseS5jdXJyZW50O1xuICAgIH0pKTtcbiAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgcmV0dXJuIGhvc3RJbnN0YW5jZXM7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShmaWJlciwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkLFxuICAgICAgICBzaWJsaW5nID0gZmliZXIuc2libGluZyxcbiAgICAgICAgdGFnID0gZmliZXIudGFnLFxuICAgICAgICB0eXBlID0gZmliZXIudHlwZTtcbiAgICB2YXIgY2FuZGlkYXRlVHlwZSA9IG51bGw7XG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBkaWRNYXRjaCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIGlmICh0eXBlcy5oYXMoY2FuZGlkYXRlVHlwZSkpIHtcbiAgICAgICAgZGlkTWF0Y2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaWRNYXRjaCkge1xuICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoLiBUaGlzIG9ubHkgZHJpbGxzIGRvd24gdG8gdGhlIGNsb3Nlc3QgaG9zdCBjb21wb25lbnRzLlxuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaCBkZWVwZXIgYmVjYXVzZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZ2l2aW5nXG4gICAgICAvLyB2aXN1YWwgZmVlZGJhY2ssIFwiZmxhc2hpbmdcIiBvdXRlcm1vc3QgcGFyZW50IHJlY3RhbmdsZXMgaXMgc3VmZmljaWVudC5cbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIG1hdGNoLCBtYXliZSB0aGVyZSB3aWxsIGJlIG9uZSBmdXJ0aGVyIGRvd24gaW4gdGhlIGNoaWxkIHRyZWUuXG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGNoaWxkLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShzaWJsaW5nLCB0eXBlcywgaG9zdEluc3RhbmNlcyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpO1xuXG4gICAgaWYgKGZvdW5kSG9zdEluc3RhbmNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55IGhvc3QgY2hpbGRyZW4sIGZhbGxiYWNrIHRvIGNsb3Nlc3QgaG9zdCBwYXJlbnQuXG5cblxuICAgIHZhciBub2RlID0gZmliZXI7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byByZWFjaCByb290IGZpcnN0LicpO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIC8vIFdlIGdvdCBhIG1hdGNoLlxuICAgICAgICBmb3VuZEhvc3RJbnN0YW5jZXMgPSB0cnVlO1xuICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7IC8vIFRoZXJlIG1heSBzdGlsbCBiZSBtb3JlLCBzbyBrZWVwIHNlYXJjaGluZy5cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgPT09IGZpYmVyKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaWJlcikge1xuICAgICAgICAgIHJldHVybiBmb3VuZEhvc3RJbnN0YW5jZXM7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgaGFzQmFkTWFwUG9seWZpbGw7XG5cbntcbiAgaGFzQmFkTWFwUG9seWZpbGwgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cblxuICAgIG5ldyBNYXAoW1tub25FeHRlbnNpYmxlT2JqZWN0LCBudWxsXV0pO1xuICAgIG5ldyBTZXQoW25vbkV4dGVuc2libGVPYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBhYm91dCBiYWQgcG9seWZpbGxzXG4gICAgaGFzQmFkTWFwUG9seWZpbGwgPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gIC8vIEluc3RhbmNlXG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmtleSA9IGtleTtcbiAgdGhpcy5lbGVtZW50VHlwZSA9IG51bGw7XG4gIHRoaXMudHlwZSA9IG51bGw7XG4gIHRoaXMuc3RhdGVOb2RlID0gbnVsbDsgLy8gRmliZXJcblxuICB0aGlzLnJldHVybiA9IG51bGw7XG4gIHRoaXMuY2hpbGQgPSBudWxsO1xuICB0aGlzLnNpYmxpbmcgPSBudWxsO1xuICB0aGlzLmluZGV4ID0gMDtcbiAgdGhpcy5yZWYgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcztcbiAgdGhpcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHRoaXMubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHRoaXMuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgdGhpcy5tb2RlID0gbW9kZTsgLy8gRWZmZWN0c1xuXG4gIHRoaXMuZmxhZ3MgPSBOb0ZsYWdzO1xuICB0aGlzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuZGVsZXRpb25zID0gbnVsbDtcbiAgdGhpcy5sYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuYWx0ZXJuYXRlID0gbnVsbDtcblxuICB7XG4gICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuXG4gICAgLy9cbiAgICAvLyBJbml0aWFsaXppbmcgdGhlIGZpZWxkcyBiZWxvdyB0byBzbWlzIGFuZCBsYXRlciB1cGRhdGluZyB0aGVtIHdpdGhcbiAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IvYnVnIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBPYmplY3QucHJldmVudEV4dGVuc2lvbigpLlxuICAgIC8vIEZvcnR1bmF0ZWx5IHRoaXMgb25seSBpbXBhY3RzIERFViBidWlsZHMuXG4gICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy5cbiAgICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCBpbml0aWFsaXplIHRoZSBmaWVsZHMgYmVsb3cgd2l0aCBkb3VibGVzLlxuICAgIC8vXG4gICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDM2NVxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTg1MzhcbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IE51bWJlci5OYU47XG4gICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOOyAvLyBJdCdzIG9rYXkgdG8gcmVwbGFjZSB0aGUgaW5pdGlhbCBkb3VibGVzIHdpdGggc21pcyBhZnRlciBpbml0aWFsaXphdGlvbi5cbiAgICAvLyBUaGlzIHdvbid0IHRyaWdnZXIgdGhlIHBlcmZvcm1hbmNlIGNsaWZmIG1lbnRpb25lZCBhYm92ZSxcbiAgICAvLyBhbmQgaXQgc2ltcGxpZmllcyBvdGhlciBwcm9maWxlciBjb2RlIChpbmNsdWRpbmcgRGV2VG9vbHMpLlxuXG4gICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgLy8gVGhpcyBpc24ndCBkaXJlY3RseSB1c2VkIGJ1dCBpcyBoYW5keSBmb3IgZGVidWdnaW5nIGludGVybmFsczpcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfSAvLyBSZXNldCBhbGwgZWZmZWN0cyBleGNlcHQgc3RhdGljIG9uZXMuXG4gIC8vIFN0YXRpYyBlZmZlY3RzIGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiBTdGF0aWNNYXNrO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dFxuICB9OyAvLyBUaGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gZHVyaW5nIHRoZSBwYXJlbnQncyByZWNvbmNpbGlhdGlvblxuXG4gIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gIHdvcmtJblByb2dyZXNzLmluZGV4ID0gY3VycmVudC5pbmRleDtcbiAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgPSBjdXJyZW50Ll9kZWJ1Z05lZWRzUmVtb3VudDtcblxuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59IC8vIFVzZWQgdG8gcmV1c2UgYSBGaWJlciBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyByZXNldHMgdGhlIEZpYmVyIHRvIHdoYXQgY3JlYXRlRmliZXIgb3IgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGRcbiAgLy8gaGF2ZSBzZXQgdGhlIHZhbHVlcyB0byBiZWZvcmUgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJZGVhbGx5IHRoaXMgd291bGRuJ3RcbiAgLy8gYmUgbmVjZXNzYXJ5IGJ1dCB1bmZvcnR1bmF0ZWx5IG1hbnkgY29kZSBwYXRocyByZWFkcyBmcm9tIHRoZSB3b3JrSW5Qcm9ncmVzc1xuICAvLyB3aGVuIHRoZXkgc2hvdWxkIGJlIHJlYWRpbmcgZnJvbSBjdXJyZW50IGFuZCB3cml0aW5nIHRvIHdvcmtJblByb2dyZXNzLlxuICAvLyBXZSBhc3N1bWUgcGVuZGluZ1Byb3BzLCBpbmRleCwga2V5LCByZWYsIHJldHVybiBhcmUgc3RpbGwgdW50b3VjaGVkIHRvXG4gIC8vIGF2b2lkIGRvaW5nIGFub3RoZXIgcmVjb25jaWxpYXRpb24uXG4gIC8vIFJlc2V0IHRoZSBlZmZlY3QgZmxhZ3MgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gU3RhdGljTWFzayB8IFBsYWNlbWVudDsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBudWxsO1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlc2V0IHRvIHRoZSBjbG9uZWQgdmFsdWVzIHRoYXQgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGQndmUuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlKSB7XG4gIHZhciBtb2RlO1xuXG4gIGlmICh0YWcgPT09IENvbmN1cnJlbnRSb290KSB7XG4gICAgbW9kZSA9IENvbmN1cnJlbnRNb2RlO1xuXG4gICAgaWYgKGlzU3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICB7XG4gICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG1vZGUgPSBOb01vZGU7XG4gIH1cblxuICBpZiAoIGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgLy8gQWx3YXlzIGNvbGxlY3QgcHJvZmlsZSB0aW1pbmdzIHdoZW4gRGV2VG9vbHMgYXJlIHByZXNlbnQuXG4gICAgLy8gVGhpcyBlbmFibGVzIERldlRvb2xzIHRvIHN0YXJ0IGNhcHR1cmluZyB0aW1pbmcgYXQgYW55IHBvaW50XHUyMDEzXG4gICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLlxuICAgIG1vZGUgfD0gUHJvZmlsZU1vZGU7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlRmliZXIoSG9zdFJvb3QsIG51bGwsIG51bGwsIG1vZGUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIC8vIFJlYWN0JEVsZW1lbnRUeXBlXG5rZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7IC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LlxuXG4gIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSkge1xuICAgICAgZmliZXJUYWcgPSBDbGFzc0NvbXBvbmVudDtcblxuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgZmliZXJUYWcgPSBIb3N0Q29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGdldFRhZzogc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlO1xuXG4gICAgICAgIGlmICggKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgIC8vIFN0cmljdCBlZmZlY3RzIHNob3VsZCBuZXZlciBydW4gb24gbGVnYWN5IHJvb3RzXG4gICAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX09GRlNDUkVFTl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9TQ09QRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9DQUNIRV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0UHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dENvbnN1bWVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBGb3J3YXJkUmVmO1xuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBNZW1vQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIFwiICsgJ25hbWVkIGltcG9ydHMuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lcikgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluICcgKyAnY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSAnICsgKFwiYnV0IGdvdDogXCIgKyAodHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlKSArIFwiLlwiICsgaW5mbykpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoZmliZXJUYWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSB0eXBlO1xuICBmaWJlci50eXBlID0gcmVzb2x2ZWRUeXBlO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG93bmVyO1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykge1xuICB2YXIgb3duZXIgPSBudWxsO1xuXG4gIHtcbiAgICBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IGVsZW1lbnQucHJvcHM7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKTtcblxuICB7XG4gICAgZmliZXIuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50cywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihGcmFnbWVudCwgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIHBlbmRpbmdQcm9wcy5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdQcm9maWxlciBtdXN0IHNwZWNpZnkgYW4gXCJpZFwiIG9mIHR5cGUgYHN0cmluZ2AgYXMgYSBwcm9wLiBSZWNlaXZlZCB0aGUgdHlwZSBgJXNgIGluc3RlYWQuJywgdHlwZW9mIHBlbmRpbmdQcm9wcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICAgIGVmZmVjdER1cmF0aW9uOiAwLFxuICAgICAgcGFzc2l2ZUVmZmVjdER1cmF0aW9uOiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUxpc3RDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoT2Zmc2NyZWVuQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfT0ZGU0NSRUVOX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHZhciBwcmltYXJ5Q2hpbGRJbnN0YW5jZSA9IHtcbiAgICBpc0hpZGRlbjogZmFsc2VcbiAgfTtcbiAgZmliZXIuc3RhdGVOb2RlID0gcHJpbWFyeUNoaWxkSW5zdGFuY2U7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVRleHQoY29udGVudCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFRleHQsIGNvbnRlbnQsIG51bGwsIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChkZWh5ZHJhdGVkTm9kZSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihEZWh5ZHJhdGVkRnJhZ21lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykge1xuICB2YXIgcGVuZGluZ1Byb3BzID0gcG9ydGFsLmNoaWxkcmVuICE9PSBudWxsID8gcG9ydGFsLmNoaWxkcmVuIDogW107XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RQb3J0YWwsIHBlbmRpbmdQcm9wcywgcG9ydGFsLmtleSwgbW9kZSk7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHtcbiAgICBjb250YWluZXJJbmZvOiBwb3J0YWwuY29udGFpbmVySW5mbyxcbiAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsXG4gICAgLy8gVXNlZCBieSBwZXJzaXN0ZW50IHVwZGF0ZXNcbiAgICBpbXBsZW1lbnRhdGlvbjogcG9ydGFsLmltcGxlbWVudGF0aW9uXG4gIH07XG4gIHJldHVybiBmaWJlcjtcbn0gLy8gVXNlZCBmb3Igc3Rhc2hpbmcgV0lQIHByb3BlcnRpZXMgdG8gcmVwbGF5IGZhaWxlZCB3b3JrIGluIERFVi5cblxuZnVuY3Rpb24gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHRhcmdldCA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgRmliZXIncyBpbml0aWFsIHByb3BlcnRpZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4uXG4gICAgLy8gV2Ugb25seSB1c2UgYSBGaWJlciB0byBlbnN1cmUgdGhlIHNhbWUgaGlkZGVuIGNsYXNzIHNvIERFViBpc24ndCBzbG93LlxuICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIH0gLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IHdyaXR0ZW4gYXMgYSBsaXN0IG9mIGFsbCBwcm9wZXJ0aWVzLlxuICAvLyBXZSB0cmllZCB0byB1c2UgT2JqZWN0LmFzc2lnbigpIGluc3RlYWQgYnV0IHRoaXMgaXMgY2FsbGVkIGluXG4gIC8vIHRoZSBob3R0ZXN0IHBhdGgsIGFuZCBPYmplY3QuYXNzaWduKCkgd2FzIHRvbyBzbG93OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTAyXG4gIC8vIFRoaXMgY29kZSBpcyBERVYtb25seSBzbyBzaXplIGlzIG5vdCBhIGNvbmNlcm4uXG5cblxuICB0YXJnZXQudGFnID0gc291cmNlLnRhZztcbiAgdGFyZ2V0LmtleSA9IHNvdXJjZS5rZXk7XG4gIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTtcbiAgdGFyZ2V0LnR5cGUgPSBzb3VyY2UudHlwZTtcbiAgdGFyZ2V0LnN0YXRlTm9kZSA9IHNvdXJjZS5zdGF0ZU5vZGU7XG4gIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuO1xuICB0YXJnZXQuY2hpbGQgPSBzb3VyY2UuY2hpbGQ7XG4gIHRhcmdldC5zaWJsaW5nID0gc291cmNlLnNpYmxpbmc7XG4gIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDtcbiAgdGFyZ2V0LnJlZiA9IHNvdXJjZS5yZWY7XG4gIHRhcmdldC5wZW5kaW5nUHJvcHMgPSBzb3VyY2UucGVuZGluZ1Byb3BzO1xuICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzO1xuICB0YXJnZXQudXBkYXRlUXVldWUgPSBzb3VyY2UudXBkYXRlUXVldWU7XG4gIHRhcmdldC5tZW1vaXplZFN0YXRlID0gc291cmNlLm1lbW9pemVkU3RhdGU7XG4gIHRhcmdldC5kZXBlbmRlbmNpZXMgPSBzb3VyY2UuZGVwZW5kZW5jaWVzO1xuICB0YXJnZXQubW9kZSA9IHNvdXJjZS5tb2RlO1xuICB0YXJnZXQuZmxhZ3MgPSBzb3VyY2UuZmxhZ3M7XG4gIHRhcmdldC5zdWJ0cmVlRmxhZ3MgPSBzb3VyY2Uuc3VidHJlZUZsYWdzO1xuICB0YXJnZXQuZGVsZXRpb25zID0gc291cmNlLmRlbGV0aW9ucztcbiAgdGFyZ2V0LmxhbmVzID0gc291cmNlLmxhbmVzO1xuICB0YXJnZXQuY2hpbGRMYW5lcyA9IHNvdXJjZS5jaGlsZExhbmVzO1xuICB0YXJnZXQuYWx0ZXJuYXRlID0gc291cmNlLmFsdGVybmF0ZTtcblxuICB7XG4gICAgdGFyZ2V0LmFjdHVhbER1cmF0aW9uID0gc291cmNlLmFjdHVhbER1cmF0aW9uO1xuICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lO1xuICAgIHRhcmdldC5zZWxmQmFzZUR1cmF0aW9uID0gc291cmNlLnNlbGZCYXNlRHVyYXRpb247XG4gICAgdGFyZ2V0LnRyZWVCYXNlRHVyYXRpb24gPSBzb3VyY2UudHJlZUJhc2VEdXJhdGlvbjtcbiAgfVxuXG4gIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlO1xuICB0YXJnZXQuX2RlYnVnT3duZXIgPSBzb3VyY2UuX2RlYnVnT3duZXI7XG4gIHRhcmdldC5fZGVidWdOZWVkc1JlbW91bnQgPSBzb3VyY2UuX2RlYnVnTmVlZHNSZW1vdW50O1xuICB0YXJnZXQuX2RlYnVnSG9va1R5cGVzID0gc291cmNlLl9kZWJ1Z0hvb2tUeXBlcztcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5jb250YWluZXJJbmZvID0gY29udGFpbmVySW5mbztcbiAgdGhpcy5wZW5kaW5nQ2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICB0aGlzLnBpbmdDYWNoZSA9IG51bGw7XG4gIHRoaXMuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgdGhpcy50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0O1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLnBlbmRpbmdDb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja05vZGUgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7XG4gIHRoaXMuZXZlbnRUaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7XG4gIHRoaXMuZXhwaXJhdGlvblRpbWVzID0gY3JlYXRlTGFuZU1hcChOb1RpbWVzdGFtcCk7XG4gIHRoaXMucGVuZGluZ0xhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMucGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmV4cGlyZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMubXV0YWJsZVJlYWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuZW50YW5nbGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlbWVudHMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmlkZW50aWZpZXJQcmVmaXggPSBpZGVudGlmaWVyUHJlZml4O1xuICB0aGlzLm9uUmVjb3ZlcmFibGVFcnJvciA9IG9uUmVjb3ZlcmFibGVFcnJvcjtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmVmZmVjdER1cmF0aW9uID0gMDtcbiAgICB0aGlzLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICB7XG4gICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gdGhpcy5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gW107XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgVG90YWxMYW5lczsgX2krKykge1xuICAgICAgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcC5wdXNoKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIENvbmN1cnJlbnRSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlUm9vdCgpJyA6ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gaHlkcmF0ZSA/ICdoeWRyYXRlKCknIDogJ3JlbmRlcigpJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGluaXRpYWxDaGlsZHJlbiwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIC8vIFRPRE86IFdlIGhhdmUgc2V2ZXJhbCBvZiB0aGVzZSBhcmd1bWVudHMgdGhhdCBhcmUgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlXG4vLyBob3N0IGNvbmZpZywgYnV0IGJlY2F1c2UgdGhleSBhcmUgcGFzc2VkIGluIGF0IHJ1bnRpbWUsIHdlIGhhdmUgdG8gdGhyZWFkXG4vLyB0aGVtIHRocm91Z2ggdGhlIHJvb3QgY29uc3RydWN0b3IuIFBlcmhhcHMgd2Ugc2hvdWxkIHB1dCB0aGVtIGFsbCBpbnRvIGFcbi8vIHNpbmdsZSB0eXBlLCBsaWtlIGEgRHluYW1pY0hvc3RDb25maWcgdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSByZW5kZXJlci5cbmlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgcm9vdCA9IG5ldyBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbiAgLy8gc3RhdGVOb2RlIGlzIGFueS5cblxuXG4gIHZhciB1bmluaXRpYWxpemVkRmliZXIgPSBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcblxuICB7XG4gICAgdmFyIF9pbml0aWFsU3RhdGUgPSB7XG4gICAgICBlbGVtZW50OiBpbml0aWFsQ2hpbGRyZW4sXG4gICAgICBpc0RlaHlkcmF0ZWQ6IGh5ZHJhdGUsXG4gICAgICBjYWNoZTogbnVsbCxcbiAgICAgIC8vIG5vdCBlbmFibGVkIHlldFxuICAgICAgdHJhbnNpdGlvbnM6IG51bGwsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBudWxsXG4gICAgfTtcbiAgICB1bmluaXRpYWxpemVkRmliZXIubWVtb2l6ZWRTdGF0ZSA9IF9pbml0aWFsU3RhdGU7XG4gIH1cblxuICBpbml0aWFsaXplVXBkYXRlUXVldWUodW5pbml0aWFsaXplZEZpYmVyKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTguMy4xJztcblxuZnVuY3Rpb24gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXJJbmZvLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLlxuaW1wbGVtZW50YXRpb24pIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbnVsbDtcblxuICB7XG4gICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihrZXkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvdyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgUG9ydGFsXG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BPUlRBTF9UWVBFLFxuICAgIGtleToga2V5ID09IG51bGwgPyBudWxsIDogJycgKyBrZXksXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sXG4gICAgaW1wbGVtZW50YXRpb246IGltcGxlbWVudGF0aW9uXG4gIH07XG59XG5cbnZhciBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzO1xudmFyIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlO1xuXG57XG4gIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGUgPSB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gIGlmICghcGFyZW50Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChwYXJlbnRDb21wb25lbnQpO1xuICB2YXIgcGFyZW50Q29udGV4dCA9IGZpbmRDdXJyZW50VW5tYXNrZWRDb250ZXh0KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgIHZhciBDb21wb25lbnQgPSBmaWJlci50eXBlO1xuXG4gICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCBDb21wb25lbnQsIHBhcmVudENvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJlbnRDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50LCBtZXRob2ROYW1lKSB7XG4gIHtcbiAgICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudCkuam9pbignLCcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIGtleXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaG9zdEZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIGh5ZHJhdGUgPSBmYWxzZTtcbiAgdmFyIGluaXRpYWxDaGlsZHJlbiA9IG51bGw7XG4gIHJldHVybiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpO1xufVxuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgLy8gVE9ETzogUmVtb3ZlIGBjYWxsYmFja2Agd2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUuXG5jYWxsYmFjaywgY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gdHJ1ZTtcbiAgdmFyIHJvb3QgPSBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpOyAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gRmliZXJSb290IGNvbnN0cnVjdG9yXG5cbiAgcm9vdC5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7IC8vIFNjaGVkdWxlIHRoZSBpbml0aWFsIHJlbmRlci4gSW4gYSBoeWRyYXRpb24gcm9vdCwgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbVxuICAvLyBhIHJlZ3VsYXIgdXBkYXRlIGJlY2F1c2UgdGhlIGluaXRpYWwgcmVuZGVyIG11c3QgbWF0Y2ggd2FzIHdhcyByZW5kZXJlZFxuICAvLyBvbiB0aGUgc2VydmVyLlxuICAvLyBOT1RFOiBUaGlzIHVwZGF0ZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQuIFdlJ3JlIG9ubHkgdXNpbmdcbiAgLy8gdGhlIHVwZGF0ZSB0byBzY2hlZHVsZSB3b3JrIG9uIHRoZSByb290IGZpYmVyIChhbmQsIGZvciBsZWdhY3kgcm9vdHMsIHRvXG4gIC8vIGVucXVldWUgdGhlIGNhbGxiYWNrIGlmIG9uZSBpcyBwcm92aWRlZCkuXG5cbiAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCk7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCA/IGNhbGxiYWNrIDogbnVsbDtcbiAgZW5xdWV1ZVVwZGF0ZShjdXJyZW50LCB1cGRhdGUsIGxhbmUpO1xuICBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQkMSk7XG5cbiAge1xuICAgIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSk7XG4gIH1cblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkgfHwgJ1Vua25vd24nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHVwZGF0ZS5wYXlsb2FkID0ge1xuICAgIGVsZW1lbnQ6IGVsZW1lbnRcbiAgfTtcbiAgY2FsbGJhY2sgPSBjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrO1xuXG4gIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBjdXJyZW50JDEsIGxhbmUpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEoZmliZXIpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIEZsdXNoIHRoZSBmaXJzdCBzY2hlZHVsZWQgXCJ1cGRhdGVcIi5cbiAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgICAgZmx1c2hSb290KHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7IC8vIElmIHdlJ3JlIHN0aWxsIGJsb2NrZWQgYWZ0ZXIgdGhpcywgd2UgbmVlZCB0byBpbmNyZWFzZVxuICAgICAgICAvLyB0aGUgcHJpb3JpdHkgb2YgYW55IHByb21pc2VzIHJlc29sdmluZyB3aXRoaW4gdGhpc1xuICAgICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgICAgdmFyIHJldHJ5TGFuZSA9IFN5bmNMYW5lO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBhbmQgdGhleSBzaG91bGQgbm90IHN1c3BlbmQgb24gSS9PLFxuICAgIC8vIHNpbmNlIHlvdSBoYXZlIHRvIHdyYXAgYW55dGhpbmcgdGhhdCBtaWdodCBzdXNwZW5kIGluXG4gICAgLy8gU3VzcGVuc2UuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxuXG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9XG5cbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuLyogZ2xvYmFsIHJlcG9ydEVycm9yICovXG5cbnZhciBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yID0gdHlwZW9mIHJlcG9ydEVycm9yID09PSAnZnVuY3Rpb24nID8gLy8gSW4gbW9kZXJuIGJyb3dzZXJzLCByZXBvcnRFcnJvciB3aWxsIGRpc3BhdGNoIGFuIGVycm9yIGV2ZW50LFxuLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuXG5yZXBvcnRFcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAvLyBJbiBvbGRlciBicm93c2VycyBhbmQgdGVzdCBlbnZpcm9ubWVudHMsIGZhbGxiYWNrIHRvIGNvbnNvbGUuZXJyb3IuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgY29uc29sZVsnZXJyb3InXShlcnJvcik7XG59O1xuXG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkQ29udGFpbmVyKGFyZ3VtZW50c1sxXSkpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gJyArIFwiWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIHNlY29uZCBhcmd1bWVudCB0byByb290LnJlbmRlciguLi4pIGJ1dCBpdCBvbmx5IGFjY2VwdHMgJyArICdvbmUgYXJndW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7XG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIHtcbiAgICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG4gIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcXG5cXG4nICsgJyAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcztcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHJldHVybiBuZXcgUmVhY3RET01Sb290KHJvb3QpO1xufVxuXG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVIeWRyYXRpb24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIH1cbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbiA9IHNjaGVkdWxlSHlkcmF0aW9uO1xuZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2h5ZHJhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG5cbiAge1xuICAgIGlmIChpbml0aWFsQ2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ011c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gJyArICdFeGFtcGxlIHVzYWdlOiBoeWRyYXRlUm9vdChkb21Db250YWluZXIsIDxBcHAgLz4pJyk7XG4gICAgfVxuICB9IC8vIEZvciBub3cgd2UgcmV1c2UgdGhlIHdob2xlIGJhZyBvZiBvcHRpb25zIHNpbmNlIHRoZXkgY29udGFpblxuICAvLyB0aGUgaHlkcmF0aW9uIGNhbGxiYWNrcy5cblxuXG4gIHZhciBoeWRyYXRpb25DYWxsYmFja3MgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogbnVsbDsgLy8gVE9ETzogRGVsZXRlIHRoaXMgb3B0aW9uXG5cbiAgdmFyIG11dGFibGVTb3VyY2VzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0ZWRTb3VyY2VzIHx8IG51bGw7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgbnVsbCwgY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOyAvLyBUaGlzIGNhbid0IGJlIGEgY29tbWVudCBub2RlIHNpbmNlIGh5ZHJhdGlvbiBkb2Vzbid0IHdvcmsgb24gY29tbWVudCBub2RlcyBhbnl3YXkuXG5cbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhY3RET01IeWRyYXRpb25Sb290KHJvb3QpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8ICFkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgICkpO1xufSAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGljaCBhbHNvIGluY2x1ZGVzIGNvbW1lbnQgbm9kZXMuXG4vLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC5cblxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcignY3JlYXRlUm9vdCgpOiBDcmVhdGluZyByb290cyBkaXJlY3RseSB3aXRoIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSB1c2luZyBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0ICcgKyAnaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gY3JlYXRlUm9vdCgpIGJlZm9yZS4gSW5zdGVhZCwgY2FsbCAnICsgJ3Jvb3QucmVuZGVyKCkgb24gdGhlIGV4aXN0aW5nIHJvb3QgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byB1cGRhdGUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0ID0gISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEocm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG5cbiAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQgJiYgIWlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGVcbiAgLy8gbGVnYWN5IEFQSS5cbn1cblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSByb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgIGZsdXNoU3luYygpO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICAgIHZhciByb290U2libGluZztcblxuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9vcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2UoX3Jvb3QpO1xuXG4gICAgICAgIF9vcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3Jvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcblxuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gX3Jvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuXG4gICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG5cbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBfcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF9yb290O1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzKGNvbnRhaW5lcik7XG4gICAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG5cbiAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICB2YXIgcm9vdDtcblxuICBpZiAoIW1heWJlUm9vdCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTtcbiAgfSBlbHNlIHtcbiAgICByb290ID0gbWF5YmVSb290O1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfSAvLyBVcGRhdGVcblxuXG4gICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG59XG5cbnZhciBkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSA9IGZhbHNlO1xuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmRET01Ob2RlKSB7XG4gICAgICBkaWRXYXJuQWJvdXRGaW5kRE9NTm9kZSA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdmaW5kRE9NTm9kZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgJyArICdyZWxlYXNlLiBJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgJyArICd0byByZWZlcmVuY2UuIExlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJyk7XG4gICAgfVxuXG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHdhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcjtcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLmh5ZHJhdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGh5ZHJhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLmh5ZHJhdGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT9cblxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIHRydWUsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgXCJ0aGUgY3JlYXRlUm9vdCBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzIGlmIGl0J3MgcnVubmluZyBSZWFjdCBcIiArICcxNy4gTGVhcm4gbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyTm9kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwgfHwgIWhhcyhwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbnZhciBkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlID0gZmFsc2U7XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlKSB7XG4gICAgICBkaWRXYXJuQWJvdXRVbm1vdW50Q29tcG9uZW50QXROb2RlID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ3VubW91bnRDb21wb25lbnRBdE5vZGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSAnICsgJ25leHQgbWFqb3IgcmVsZWFzZS4gU3dpdGNoIHRvIHRoZSBjcmVhdGVSb290IEFQSS4gTGVhcm4gJyArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnVubW91bnQoKT8nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHtcbiAgICB7XG4gICAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICB2YXIgcmVuZGVyZWRCeURpZmZlcmVudFJlYWN0ID0gcm9vdEVsICYmICFnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG5cbiAgICAgIGlmIChyZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFVubW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLlxuXG5cbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbnVsbCwgY29udGFpbmVyLCBmYWxzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgc2hvdWxkIHByb2JhYmx5IHVzZSBgZGVsZXRlIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyYFxuICAgICAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgfSk7IC8vIElmIHlvdSBjYWxsIHVubW91bnRDb21wb25lbnRBdE5vZGUgdHdpY2UgaW4gcXVpY2sgc3VjY2Vzc2lvbiwgeW91J2xsXG4gICAgLy8gZ2V0IGB0cnVlYCB0d2ljZS4gVGhhdCdzIHByb2JhYmx5IGZpbmU/XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB2YXIgX3Jvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShfcm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUoX3Jvb3RFbCkpOyAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS5cblxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIucGFyZW50Tm9kZSkgJiYgISFjb250YWluZXIucGFyZW50Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gICAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQpIHtcbiAgICAgICAgZXJyb3IoXCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgXCIgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKTtcbnNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkpO1xuc2V0QXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocnVuV2l0aFByaW9yaXR5KTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzLCBmbHVzaFN5bmMpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH0gLy8gVE9ETzogcGFzcyBSZWFjdERPTSBwb3J0YWwgaW1wbGVtZW50YXRpb24gYXMgdGhpcmQgYXJndW1lbnRcbiAgLy8gJEZsb3dGaXhNZSBUaGUgRmxvdyB0eXBlIGlzIG9wYXF1ZSBidXQgdGhlcmUncyBubyB3YXkgdG8gYWN0dWFsbHkgY3JlYXRlIGl0LlxuXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVyLCBudWxsLCBrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgdXNpbmdDbGllbnRFbnRyeVBvaW50OiBmYWxzZSxcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMuXG4gIC8vIFRoaXMgaXMgYW4gYXJyYXkgZm9yIGJldHRlciBtaW5pZmljYXRpb24uXG4gIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUsIGdldE5vZGVGcm9tSW5zdGFuY2UsIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBiYXRjaGVkVXBkYXRlcyQxXVxufTtcblxuZnVuY3Rpb24gY3JlYXRlUm9vdCQxKGNvbnRhaW5lciwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGNyZWF0ZVJvb3QgZnJvbSBcInJlYWN0LWRvbVwiIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHNob3VsZCBpbnN0ZWFkIGltcG9ydCBpdCBmcm9tIFwicmVhY3QtZG9tL2NsaWVudFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVSb290JDEoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAge1xuICAgIGlmICghSW50ZXJuYWxzLnVzaW5nQ2xpZW50RW50cnlQb2ludCAmJiAhZmFsc2UpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGltcG9ydGluZyBoeWRyYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgaW5pdGlhbENoaWxkcmVuLCBvcHRpb25zKTtcbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5mdW5jdGlvbiBmbHVzaFN5bmMkMShmbikge1xuICB7XG4gICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7XG4gICAgICBlcnJvcignZmx1c2hTeW5jIHdhcyBjYWxsZWQgZnJvbSBpbnNpZGUgYSBsaWZlY3ljbGUgbWV0aG9kLiBSZWFjdCBjYW5ub3QgJyArICdmbHVzaCB3aGVuIFJlYWN0IGlzIGFscmVhZHkgcmVuZGVyaW5nLiBDb25zaWRlciBtb3ZpbmcgdGhpcyBjYWxsIHRvICcgKyAnYSBzY2hlZHVsZXIgdGFzayBvciBtaWNybyB0YXNrLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmbHVzaFN5bmMoZm4pO1xufVxudmFyIGZvdW5kRGV2VG9vbHMgPSBpbmplY3RJbnRvRGV2VG9vbHMoe1xuICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsXG4gIGJ1bmRsZVR5cGU6ICAxICxcbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuICByZW5kZXJlclBhY2thZ2VOYW1lOiAncmVhY3QtZG9tJ1xufSk7XG5cbntcbiAgaWYgKCFmb3VuZERldlRvb2xzICYmIGNhblVzZURPTSAmJiB3aW5kb3cudG9wID09PSB3aW5kb3cuc2VsZikge1xuICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgIHZhciBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbDsgLy8gRG9uJ3Qgd2FybiBpbiBleG90aWMgY2FzZXMgbGlrZSBjaHJvbWUtZXh0ZW5zaW9uOi8vLlxuXG4gICAgICBpZiAoL14oaHR0cHM/fGZpbGUpOiQvLnRlc3QocHJvdG9jb2wpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgICAgICAgY29uc29sZS5pbmZvKCclY0Rvd25sb2FkIHRoZSBSZWFjdCBEZXZUb29scyAnICsgJ2ZvciBhIGJldHRlciBkZXZlbG9wbWVudCBleHBlcmllbmNlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycgKyAocHJvdG9jb2wgPT09ICdmaWxlOicgPyAnXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzLWZhcScgOiAnJyksICdmb250LXdlaWdodDpib2xkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBJbnRlcm5hbHM7XG5leHBvcnRzLmNyZWF0ZVBvcnRhbCA9IGNyZWF0ZVBvcnRhbCQxO1xuZXhwb3J0cy5jcmVhdGVSb290ID0gY3JlYXRlUm9vdCQxO1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IGZpbmRET01Ob2RlO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmMkMTtcbmV4cG9ydHMuaHlkcmF0ZSA9IGh5ZHJhdGU7XG5leHBvcnRzLmh5ZHJhdGVSb290ID0gaHlkcmF0ZVJvb3QkMTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIG0gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IG0uY3JlYXRlUm9vdDtcbiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IG0uaHlkcmF0ZVJvb3Q7XG59IGVsc2Uge1xuICB2YXIgaSA9IG0uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG4gIGV4cG9ydHMuY3JlYXRlUm9vdCA9IGZ1bmN0aW9uKGMsIG8pIHtcbiAgICBpLnVzaW5nQ2xpZW50RW50cnlQb2ludCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtLmNyZWF0ZVJvb3QoYywgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gZnVuY3Rpb24oYywgaCwgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uaHlkcmF0ZVJvb3QoYywgaCwgbyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gZmFsc2U7XG4gICAgfVxuICB9O1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHVzZS1zeW5jLWV4dGVybmFsLXN0b3JlLXNoaW0uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgICAgcmV0dXJuICh4ID09PSB5ICYmICgwICE9PSB4IHx8IDEgLyB4ID09PSAxIC8geSkpIHx8ICh4ICE9PSB4ICYmIHkgIT09IHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSQyKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpIHtcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gUmVhY3Quc3RhcnRUcmFuc2l0aW9uIHx8XG4gICAgICAgICgoZGlkV2Fybk9sZDE4QWxwaGEgPSAhMCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgYXJlIHVzaW5nIGFuIG91dGRhdGVkLCBwcmUtcmVsZWFzZSBhbHBoYSBvZiBSZWFjdCAxOCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdXNlU3luY0V4dGVybmFsU3RvcmUuIFRoZSB1c2Utc3luYy1leHRlcm5hbC1zdG9yZSBzaGltIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LiBVcGdyYWRlIHRvIGEgbmV3ZXIgcHJlLXJlbGVhc2UuXCJcbiAgICAgICAgKSk7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkVmFsdWUgPSBnZXRTbmFwc2hvdCgpO1xuICAgICAgICBvYmplY3RJcyh2YWx1ZSwgY2FjaGVkVmFsdWUpIHx8XG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlRoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjYWNoZWRWYWx1ZSA9IHVzZVN0YXRlKHtcbiAgICAgICAgaW5zdDogeyB2YWx1ZTogdmFsdWUsIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdCB9XG4gICAgICB9KTtcbiAgICAgIHZhciBpbnN0ID0gY2FjaGVkVmFsdWVbMF0uaW5zdCxcbiAgICAgICAgZm9yY2VVcGRhdGUgPSBjYWNoZWRWYWx1ZVsxXTtcbiAgICAgIHVzZUxheW91dEVmZmVjdChcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICAgICAgY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSAmJiBmb3JjZVVwZGF0ZSh7IGluc3Q6IGluc3QgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtzdWJzY3JpYmUsIHZhbHVlLCBnZXRTbmFwc2hvdF1cbiAgICAgICk7XG4gICAgICB1c2VFZmZlY3QoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlVXBkYXRlKHsgaW5zdDogaW5zdCB9KTtcbiAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiYgZm9yY2VVcGRhdGUoeyBpbnN0OiBpbnN0IH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBbc3Vic2NyaWJlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHtcbiAgICAgIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7XG4gICAgICBpbnN0ID0gaW5zdC52YWx1ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgICAgICByZXR1cm4gIW9iamVjdElzKGluc3QsIG5leHRWYWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZVN5bmNFeHRlcm5hbFN0b3JlJDEoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCkge1xuICAgICAgcmV0dXJuIGdldFNuYXBzaG90KCk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpLFxuICAgICAgb2JqZWN0SXMgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBPYmplY3QuaXMgPyBPYmplY3QuaXMgOiBpcyxcbiAgICAgIHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUsXG4gICAgICB1c2VFZmZlY3QgPSBSZWFjdC51c2VFZmZlY3QsXG4gICAgICB1c2VMYXlvdXRFZmZlY3QgPSBSZWFjdC51c2VMYXlvdXRFZmZlY3QsXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZSxcbiAgICAgIGRpZFdhcm5PbGQxOEFscGhhID0gITEsXG4gICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9ICExLFxuICAgICAgc2hpbSA9XG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudCB8fFxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICA/IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDFcbiAgICAgICAgICA6IHVzZVN5bmNFeHRlcm5hbFN0b3JlJDI7XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9XG4gICAgICB2b2lkIDAgIT09IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlID8gUmVhY3QudXNlU3luY0V4dGVybmFsU3RvcmUgOiBzaGltO1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAgIHJldHVybiAoeCA9PT0geSAmJiAoMCAhPT0geCB8fCAxIC8geCA9PT0gMSAvIHkpKSB8fCAoeCAhPT0geCAmJiB5ICE9PSB5KTtcbiAgICB9XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChFcnJvcigpKTtcbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIiksXG4gICAgICBzaGltID0gcmVxdWlyZShcInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlL3NoaW1cIiksXG4gICAgICBvYmplY3RJcyA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIE9iamVjdC5pcyA/IE9iamVjdC5pcyA6IGlzLFxuICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmUgPSBzaGltLnVzZVN5bmNFeHRlcm5hbFN0b3JlLFxuICAgICAgdXNlUmVmID0gUmVhY3QudXNlUmVmLFxuICAgICAgdXNlRWZmZWN0ID0gUmVhY3QudXNlRWZmZWN0LFxuICAgICAgdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8sXG4gICAgICB1c2VEZWJ1Z1ZhbHVlID0gUmVhY3QudXNlRGVidWdWYWx1ZTtcbiAgICBleHBvcnRzLnVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yID0gZnVuY3Rpb24gKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdCxcbiAgICAgIHNlbGVjdG9yLFxuICAgICAgaXNFcXVhbFxuICAgICkge1xuICAgICAgdmFyIGluc3RSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgICBpZiAobnVsbCA9PT0gaW5zdFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHZhciBpbnN0ID0geyBoYXNWYWx1ZTogITEsIHZhbHVlOiBudWxsIH07XG4gICAgICAgIGluc3RSZWYuY3VycmVudCA9IGluc3Q7XG4gICAgICB9IGVsc2UgaW5zdCA9IGluc3RSZWYuY3VycmVudDtcbiAgICAgIGluc3RSZWYgPSB1c2VNZW1vKFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZnVuY3Rpb24gbWVtb2l6ZWRTZWxlY3RvcihuZXh0U25hcHNob3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzTWVtbykge1xuICAgICAgICAgICAgICBoYXNNZW1vID0gITA7XG4gICAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3Q7XG4gICAgICAgICAgICAgIG5leHRTbmFwc2hvdCA9IHNlbGVjdG9yKG5leHRTbmFwc2hvdCk7XG4gICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGlzRXF1YWwgJiYgaW5zdC5oYXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gaW5zdC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbChjdXJyZW50U2VsZWN0aW9uLCBuZXh0U25hcHNob3QpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChtZW1vaXplZFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGlvbiA9IG1lbW9pemVkU2VsZWN0aW9uO1xuICAgICAgICAgICAgaWYgKG9iamVjdElzKG1lbW9pemVkU25hcHNob3QsIG5leHRTbmFwc2hvdCkpXG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgdmFyIG5leHRTZWxlY3Rpb24gPSBzZWxlY3RvcihuZXh0U25hcHNob3QpO1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaXNFcXVhbCAmJiBpc0VxdWFsKGN1cnJlbnRTZWxlY3Rpb24sIG5leHRTZWxlY3Rpb24pKVxuICAgICAgICAgICAgICByZXR1cm4gKG1lbW9pemVkU25hcHNob3QgPSBuZXh0U25hcHNob3QpLCBjdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgbWVtb2l6ZWRTbmFwc2hvdCA9IG5leHRTbmFwc2hvdDtcbiAgICAgICAgICAgIHJldHVybiAobWVtb2l6ZWRTZWxlY3Rpb24gPSBuZXh0U2VsZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGhhc01lbW8gPSAhMSxcbiAgICAgICAgICAgIG1lbW9pemVkU25hcHNob3QsXG4gICAgICAgICAgICBtZW1vaXplZFNlbGVjdGlvbixcbiAgICAgICAgICAgIG1heWJlR2V0U2VydmVyU25hcHNob3QgPVxuICAgICAgICAgICAgICB2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90ID8gbnVsbCA6IGdldFNlcnZlclNuYXBzaG90O1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBtZW1vaXplZFNlbGVjdG9yKGdldFNuYXBzaG90KCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG51bGwgPT09IG1heWJlR2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRTZWxlY3RvcihtYXliZUdldFNlcnZlclNuYXBzaG90KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICBdO1xuICAgICAgICB9LFxuICAgICAgICBbZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90LCBzZWxlY3RvciwgaXNFcXVhbF1cbiAgICAgICk7XG4gICAgICB2YXIgdmFsdWUgPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGluc3RSZWZbMF0sIGluc3RSZWZbMV0pO1xuICAgICAgdXNlRWZmZWN0KFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdC5oYXNWYWx1ZSA9ICEwO1xuICAgICAgICAgIGluc3QudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgW3ZhbHVlXVxuICAgICAgKTtcbiAgICAgIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PVxuICAgICAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wICYmXG4gICAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AoRXJyb3IoKSk7XG4gIH0pKCk7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2Nqcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS1zaGltL3dpdGgtc2VsZWN0b3IucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9janMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS93aXRoLXNlbGVjdG9yLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIiwgIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwgInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG4iLCAidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2U7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHtcbiAgICBkYXRhLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTtcbiAgfVxuICAtLXRoaXMuc2l6ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlRGVsZXRlO1xuIiwgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLCAidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iLCAidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGxpc3QgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgICsrdGhpcy5zaXplO1xuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9IGVsc2Uge1xuICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlU2V0O1xuIiwgInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG4iLCAidmFyIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIFN0YWNrXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrQ2xlYXI7XG4iLCAiLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrRGVsZXRlO1xuIiwgIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsICIvKipcbiAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrSGFzO1xuIiwgIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsICJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG52YXIgY29yZUpzRGF0YSA9IHJvb3RbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcmVKc0RhdGE7XG4iLCAidmFyIGNvcmVKc0RhdGEgPSByZXF1aXJlKCcuL19jb3JlSnNEYXRhJyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBtZXRob2RzIG1hc3F1ZXJhZGluZyBhcyBuYXRpdmUuICovXG52YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgcmV0dXJuIHVpZCA/ICgnU3ltYm9sKHNyYylfMS4nICsgdWlkKSA6ICcnO1xufSgpKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNNYXNrZWQ7XG4iLCAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwgInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCAiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmFsdWU7XG4iLCAidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlQ3JlYXRlO1xuIiwgInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaENsZWFyO1xuIiwgIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsICJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoR2V0O1xuIiwgInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hIYXM7XG4iLCAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwgInZhciBoYXNoQ2xlYXIgPSByZXF1aXJlKCcuL19oYXNoQ2xlYXInKSxcbiAgICBoYXNoRGVsZXRlID0gcmVxdWlyZSgnLi9faGFzaERlbGV0ZScpLFxuICAgIGhhc2hHZXQgPSByZXF1aXJlKCcuL19oYXNoR2V0JyksXG4gICAgaGFzaEhhcyA9IHJlcXVpcmUoJy4vX2hhc2hIYXMnKSxcbiAgICBoYXNoU2V0ID0gcmVxdWlyZSgnLi9faGFzaFNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoYXNoIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gSGFzaChlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbkhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyO1xuSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG5IYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzO1xuSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwgInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gKHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nKVxuICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXlhYmxlO1xuIiwgInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iLCAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwgInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVIYXM7XG4iLCAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiIsICJ2YXIgbWFwQ2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX21hcENhY2hlQ2xlYXInKSxcbiAgICBtYXBDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX21hcENhY2hlRGVsZXRlJyksXG4gICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZUdldCcpLFxuICAgIG1hcENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVIYXMnKSxcbiAgICBtYXBDYWNoZVNldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwgInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBNYXAgPSByZXF1aXJlKCcuL19NYXAnKSxcbiAgICBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgc2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgIHZhciBwYWlycyA9IGRhdGEuX19kYXRhX187XG4gICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgdGhpcy5zaXplID0gKytkYXRhLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xuICB9XG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YWNrU2V0O1xuIiwgInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwgIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUVhY2g7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTtcbiAgICBmdW5jKHt9LCAnJywge30pO1xuICAgIHJldHVybiBmdW5jO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZpbmVQcm9wZXJ0eTtcbiIsICJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gKiB2YWx1ZSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHtcbiAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgJ3ZhbHVlJzogdmFsdWUsXG4gICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VBc3NpZ25WYWx1ZTtcbiIsICJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gIGlmICghKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGVxKG9ialZhbHVlLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduVmFsdWU7XG4iLCAidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKTtcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weU9iamVjdDtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUaW1lcztcbiIsICIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLCAidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCAiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSW5kZXg7XG4iLCAiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbnZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xudHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG50eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG50eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG50eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG50eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG50eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG50eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG50eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG50eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG50eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzVHlwZWRBcnJheWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNUeXBlZEFycmF5O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCAidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iLCAidmFyIGJhc2VJc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19iYXNlSXNUeXBlZEFycmF5JyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgbm9kZVV0aWwgPSByZXF1aXJlKCcuL19ub2RlVXRpbCcpO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCAidmFyIGJhc2VUaW1lcyA9IHJlcXVpcmUoJy4vX2Jhc2VUaW1lcycpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5Jyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgYXJyYXktbGlrZSBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgIGlzQXJnID0gIWlzQXJyICYmIGlzQXJndW1lbnRzKHZhbHVlKSxcbiAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICBza2lwSW5kZXhlcyA9IGlzQXJyIHx8IGlzQXJnIHx8IGlzQnVmZiB8fCBpc1R5cGUsXG4gICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS5cbiAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHxcbiAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICApKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUxpa2VLZXlzO1xuIiwgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwgInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5cztcbiIsICJ2YXIgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXMgPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5cztcbiIsICJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsICJ2YXIgYXJyYXlMaWtlS2V5cyA9IHJlcXVpcmUoJy4vX2FycmF5TGlrZUtleXMnKSxcbiAgICBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXM7XG4iLCAidmFyIGNvcHlPYmplY3QgPSByZXF1aXJlKCcuL19jb3B5T2JqZWN0JyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbjtcbiIsICIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZVxuICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKVxuICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIGlmIChvYmplY3QgIT0gbnVsbCkge1xuICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuYXRpdmVLZXlzSW47XG4iLCAidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwgInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUFzc2lnbkluO1xuIiwgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICBidWZmZXIuY29weShyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQnVmZmVyO1xuIiwgIi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXG4gIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlBcnJheTtcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlGaWx0ZXI7XG4iLCAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTtcbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICogLy8gPT4gW1tdLCBbXV1cbiAqXG4gKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHViQXJyYXk7XG4iLCAidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiIsICJ2YXIgY29weU9iamVjdCA9IHJlcXVpcmUoJy4vX2NvcHlPYmplY3QnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpO1xuXG4vKipcbiAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHM7XG4iLCAiLyoqXG4gKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UHVzaDtcbiIsICJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UHJvdG90eXBlO1xuIiwgInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIHN0dWJBcnJheSA9IHJlcXVpcmUoJy4vc3R1YkFycmF5Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKG9iamVjdCkge1xuICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9sc0luO1xuIiwgInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGdldFN5bWJvbHNJbiA9IHJlcXVpcmUoJy4vX2dldFN5bWJvbHNJbicpO1xuXG4vKipcbiAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bWJvbHNJbjtcbiIsICJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCAidmFyIGJhc2VHZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUdldEFsbEtleXMnKSxcbiAgICBnZXRTeW1ib2xzID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9scycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbGxLZXlzO1xuIiwgInZhciBiYXNlR2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRBbGxLZXlzJyksXG4gICAgZ2V0U3ltYm9sc0luID0gcmVxdWlyZSgnLi9fZ2V0U3ltYm9sc0luJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNJbiwgZ2V0U3ltYm9sc0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbGxLZXlzSW47XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYXRhVmlldztcbiIsICJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuIiwgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gV2Vha01hcDtcbiIsICJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAqL1xuZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7XG4gICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbml0Q2xvbmVBcnJheTtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgVWludDhBcnJheSA9IHJvb3QuVWludDhBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5O1xuIiwgInZhciBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVBcnJheUJ1ZmZlcjtcbiIsICJ2YXIgY2xvbmVBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQXJyYXlCdWZmZXInKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGRhdGEgdmlldy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7XG4gIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZURhdGFWaWV3O1xuIiwgIi8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHJlZ2V4cC5cbiAqL1xuZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gIHZhciByZXN1bHQgPSBuZXcgcmVnZXhwLmNvbnN0cnVjdG9yKHJlZ2V4cC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhyZWdleHApKTtcbiAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVSZWdFeHA7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHtcbiAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVTeW1ib2w7XG4iLCAidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwgInZhciBjbG9uZUFycmF5QnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVBcnJheUJ1ZmZlcicpLFxuICAgIGNsb25lRGF0YVZpZXcgPSByZXF1aXJlKCcuL19jbG9uZURhdGFWaWV3JyksXG4gICAgY2xvbmVSZWdFeHAgPSByZXF1aXJlKCcuL19jbG9uZVJlZ0V4cCcpLFxuICAgIGNsb25lU3ltYm9sID0gcmVxdWlyZSgnLi9fY2xvbmVTeW1ib2wnKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXG4gICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHtcbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBhcnJheUJ1ZmZlclRhZzpcbiAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICBjYXNlIGJvb2xUYWc6XG4gICAgY2FzZSBkYXRlVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgIHJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCwgaXNEZWVwKTtcblxuICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgIGNhc2UgaW50OFRhZzogY2FzZSBpbnQxNlRhZzogY2FzZSBpbnQzMlRhZzpcbiAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOlxuICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHJldHVybiBuZXcgQ3RvcjtcblxuICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpO1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIHJldHVybiBjbG9uZVN5bWJvbChvYmplY3QpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lQnlUYWc7XG4iLCAidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG4iLCAidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwgInZhciBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXSc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNNYXA7XG4iLCAidmFyIGJhc2VJc01hcCA9IHJlcXVpcmUoJy4vX2Jhc2VJc01hcCcpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNNYXAobmV3IE1hcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSBpc01hcDtcbiIsICJ2YXIgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzU2V0O1xuIiwgInZhciBiYXNlSXNTZXQgPSByZXF1aXJlKCcuL19iYXNlSXNTZXQnKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU2V0KG5ldyBTZXQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTZXQobmV3IFdlYWtTZXQpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzU2V0ID0gbm9kZUlzU2V0ID8gYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBiYXNlSXNTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTZXQ7XG4iLCAidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhcnJheUVhY2ggPSByZXF1aXJlKCcuL19hcnJheUVhY2gnKSxcbiAgICBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZUFzc2lnbiA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ24nKSxcbiAgICBiYXNlQXNzaWduSW4gPSByZXF1aXJlKCcuL19iYXNlQXNzaWduSW4nKSxcbiAgICBjbG9uZUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2Nsb25lQnVmZmVyJyksXG4gICAgY29weUFycmF5ID0gcmVxdWlyZSgnLi9fY29weUFycmF5JyksXG4gICAgY29weVN5bWJvbHMgPSByZXF1aXJlKCcuL19jb3B5U3ltYm9scycpLFxuICAgIGNvcHlTeW1ib2xzSW4gPSByZXF1aXJlKCcuL19jb3B5U3ltYm9sc0luJyksXG4gICAgZ2V0QWxsS2V5cyA9IHJlcXVpcmUoJy4vX2dldEFsbEtleXMnKSxcbiAgICBnZXRBbGxLZXlzSW4gPSByZXF1aXJlKCcuL19nZXRBbGxLZXlzSW4nKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpbml0Q2xvbmVBcnJheSA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZUFycmF5JyksXG4gICAgaW5pdENsb25lQnlUYWcgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVCeVRhZycpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZU9iamVjdCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc01hcCA9IHJlcXVpcmUoJy4vaXNNYXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1NldCA9IHJlcXVpcmUoJy4vaXNTZXQnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xudmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbmNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG5jbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbmNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbmNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbmNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG5jbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG5jbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbmNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG5jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbmNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIERlZXAgY2xvbmVcbiAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICogIDQgLSBDbG9uZSBzeW1ib2xzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgcGFyZW50IG9iamVjdCBvZiBgdmFsdWVgLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICB2YXIgcmVzdWx0LFxuICAgICAgaXNEZWVwID0gYml0bWFzayAmIENMT05FX0RFRVBfRkxBRyxcbiAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gIGlmIChjdXN0b21pemVyKSB7XG4gICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICB9XG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gIGlmIChpc0Fycikge1xuICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICBpZiAoaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgfVxuICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBpc0ZsYXRcbiAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdCA/IHZhbHVlIDoge307XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gIGlmIChzdGFja2VkKSB7XG4gICAgcmV0dXJuIHN0YWNrZWQ7XG4gIH1cbiAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBrZXlzRnVuYyA9IGlzRnVsbFxuICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7XG4gIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgIGlmIChwcm9wcykge1xuICAgICAga2V5ID0gc3ViVmFsdWU7XG4gICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUNsb25lO1xuIiwgInZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuL19iYXNlQ2xvbmUnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKVxuICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZFxuICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lRGVlcFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAqXG4gKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZTtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsICIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwgInZhciBjcmVhdGVCYXNlRm9yID0gcmVxdWlyZSgnLi9fY3JlYXRlQmFzZUZvcicpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xudmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUZvcjtcbiIsICJ2YXIgYmFzZUZvciA9IHJlcXVpcmUoJy4vX2Jhc2VGb3InKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgJiYgYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRm9yT3duO1xuIiwgInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRWFjaDtcbiIsICJ2YXIgYmFzZUZvck93biA9IHJlcXVpcmUoJy4vX2Jhc2VGb3JPd24nKSxcbiAgICBjcmVhdGVCYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKi9cbnZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VFYWNoO1xuIiwgIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gKlxuICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG4iLCAidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGNhc3QgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicgPyB2YWx1ZSA6IGlkZW50aXR5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RGdW5jdGlvbjtcbiIsICJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYFxuICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAYWxpYXMgZWFjaFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAqIH0pO1xuICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gKlxuICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICogICBjb25zb2xlLmxvZyhrZXkpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZm9yRWFjaCcpO1xuIiwgInZhciBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsdGVyYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmlsdGVyO1xuIiwgIi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBhZGRcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQGFsaWFzIHB1c2hcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlQWRkO1xuIiwgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUhhcztcbiIsICJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG5TZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcblNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRDYWNoZTtcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5U29tZTtcbiIsICIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYWNoZUhhcztcbiIsICJ2YXIgU2V0Q2FjaGUgPSByZXF1aXJlKCcuL19TZXRDYWNoZScpLFxuICAgIGFycmF5U29tZSA9IHJlcXVpcmUoJy4vX2FycmF5U29tZScpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgYXJyYXlzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYGFycmF5YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTtcbiAgaWYgKGFyclN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwgIi8qKlxuICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqL1xuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVG9BcnJheTtcbiIsICIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG4iLCAidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgZXF1YWxBcnJheXMgPSByZXF1aXJlKCcuL19lcXVhbEFycmF5cycpLFxuICAgIG1hcFRvQXJyYXkgPSByZXF1aXJlKCcuL19tYXBUb0FycmF5JyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbEJ5VGFnO1xuIiwgInZhciBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbE9iamVjdHM7XG4iLCAidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBlcXVhbEFycmF5cyA9IHJlcXVpcmUoJy4vX2VxdWFsQXJyYXlzJyksXG4gICAgZXF1YWxCeVRhZyA9IHJlcXVpcmUoJy4vX2VxdWFsQnlUYWcnKSxcbiAgICBlcXVhbE9iamVjdHMgPSByZXF1aXJlKCcuL19lcXVhbE9iamVjdHMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICB2YXIgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvdGhlcik7XG5cbiAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXIob2JqZWN0KSkge1xuICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICBvYmpJc09iaiA9IGZhbHNlO1xuICB9XG4gIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICByZXR1cm4gKG9iaklzQXJyIHx8IGlzVHlwZWRBcnJheShvYmplY3QpKVxuICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gIH1cbiAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7XG5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICB9XG4gIGlmICghaXNTYW1lVGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gIHJldHVybiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzRXF1YWxEZWVwO1xuIiwgInZhciBiYXNlSXNFcXVhbERlZXAgPSByZXF1aXJlKCcuL19iYXNlSXNFcXVhbERlZXAnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAqIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICogIDEgLSBVbm9yZGVyZWQgY29tcGFyaXNvblxuICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgfVxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbDtcbiIsICJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGJhc2VJc0VxdWFsID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWwnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTWF0Y2g7XG4iLCAidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpY3RDb21wYXJhYmxlO1xuIiwgInZhciBpc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19pc1N0cmljdENvbXBhcmFibGUnKSxcbiAgICBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hdGNoRGF0YTtcbiIsICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgbWF0Y2hlc1Byb3BlcnR5YCBmb3Igc291cmNlIHZhbHVlcyBzdWl0YWJsZVxuICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAoc3JjVmFsdWUgIT09IHVuZGVmaW5lZCB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCAidmFyIGJhc2VJc01hdGNoID0gcmVxdWlyZSgnLi9fYmFzZUlzTWF0Y2gnKSxcbiAgICBnZXRNYXRjaERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXRjaERhdGEnKSxcbiAgICBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSA9IHJlcXVpcmUoJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xuICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzO1xuIiwgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsICJ2YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNLZXk7XG4iLCAidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemU7XG4iLCAidmFyIG1lbW9pemUgPSByZXF1aXJlKCcuL21lbW9pemUnKTtcblxuLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xudmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24nc1xuICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICB2YXIgcmVzdWx0ID0gbWVtb2l6ZShmdW5jLCBmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkge1xuICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG5cbiAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVDYXBwZWQ7XG4iLCAidmFyIG1lbW9pemVDYXBwZWQgPSByZXF1aXJlKCcuL19tZW1vaXplQ2FwcGVkJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb1BhdGg7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheU1hcDtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCAidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCAidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgc3RyaW5nVG9QYXRoID0gcmVxdWlyZSgnLi9fc3RyaW5nVG9QYXRoJyksXG4gICAgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG5mdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaXNLZXkodmFsdWUsIG9iamVjdCkgPyBbdmFsdWVdIDogc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FzdFBhdGg7XG4iLCAidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsICJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5nZXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IDAsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbdG9LZXkocGF0aFtpbmRleCsrXSldO1xuICB9XG4gIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0O1xuIiwgInZhciBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXNJbjtcbiIsICJ2YXIgY2FzdFBhdGggPSByZXF1aXJlKCcuL19jYXN0UGF0aCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUGF0aDtcbiIsICJ2YXIgYmFzZUhhc0luID0gcmVxdWlyZSgnLi9fYmFzZUhhc0luJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc0luO1xuIiwgInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyksXG4gICAgZ2V0ID0gcmVxdWlyZSgnLi9nZXQnKSxcbiAgICBoYXNJbiA9IHJlcXVpcmUoJy4vaGFzSW4nKSxcbiAgICBpc0tleSA9IHJlcXVpcmUoJy4vX2lzS2V5JyksXG4gICAgaXNTdHJpY3RDb21wYXJhYmxlID0gcmVxdWlyZSgnLi9faXNTdHJpY3RDb21wYXJhYmxlJyksXG4gICAgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgPSByZXF1aXJlKCcuL19tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gIGlmIChpc0tleShwYXRoKSAmJiBpc1N0cmljdENvbXBhcmFibGUoc3JjVmFsdWUpKSB7XG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICA/IGhhc0luKG9iamVjdCwgcGF0aClcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNYXRjaGVzUHJvcGVydHk7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUHJvcGVydHk7XG4iLCAidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQcm9wZXJ0eURlZXA7XG4iLCAidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpLFxuICAgIGJhc2VQcm9wZXJ0eURlZXAgPSByZXF1aXJlKCcuL19iYXNlUHJvcGVydHlEZWVwJyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHRvS2V5ID0gcmVxdWlyZSgnLi9fdG9LZXknKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbXG4gKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAqIF07XG4gKlxuICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICogLy8gPT4gWzIsIDFdXG4gKlxuICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAqIC8vID0+IFsxLCAyXVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3BlcnR5O1xuIiwgInZhciBiYXNlTWF0Y2hlcyA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzJyksXG4gICAgYmFzZU1hdGNoZXNQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VNYXRjaGVzUHJvcGVydHknKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgcHJvcGVydHkgPSByZXF1aXJlKCcuL3Byb3BlcnR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSlcbiAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICB9XG4gIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUl0ZXJhdGVlO1xuIiwgInZhciBhcnJheUZpbHRlciA9IHJlcXVpcmUoJy4vX2FycmF5RmlsdGVyJyksXG4gICAgYmFzZUZpbHRlciA9IHJlcXVpcmUoJy4vX2Jhc2VGaWx0ZXInKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gKiBAc2VlIF8ucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICogXTtcbiAqXG4gKiBfLmZpbHRlcih1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIENvbWJpbmluZyBzZXZlcmFsIHByZWRpY2F0ZXMgdXNpbmcgYF8ub3ZlckV2ZXJ5YCBvciBgXy5vdmVyU29tZWAuXG4gKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAnYmFybmV5J11cbiAqL1xuZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXI7XG4iLCAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VIYXM7XG4iLCAidmFyIGJhc2VIYXMgPSByZXF1aXJlKCcuL19iYXNlSGFzJyksXG4gICAgaGFzUGF0aCA9IHJlcXVpcmUoJy4vX2hhc1BhdGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07XG4gKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXMob2JqZWN0LCAnYScpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EuYicpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXMob3RoZXIsICdhJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzO1xuIiwgInZhciBiYXNlS2V5cyA9IHJlcXVpcmUoJy4vX2Jhc2VLZXlzJyksXG4gICAgZ2V0VGFnID0gcmVxdWlyZSgnLi9fZ2V0VGFnJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAqXG4gKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAqIHByb3BlcnRpZXMuXG4gKlxuICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gKiBTaW1pbGFybHksIG1hcHMgYW5kIHNldHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYHNpemVgIG9mIGAwYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRW1wdHkobnVsbCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KHRydWUpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSgxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgIChpc0FycmF5KHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgfVxuICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiAhdmFsdWUuc2l6ZTtcbiAgfVxuICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgcmV0dXJuICFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRW1wdHk7XG4iLCAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVW5kZWZpbmVkO1xuIiwgInZhciBiYXNlRWFjaCA9IHJlcXVpcmUoJy4vX2Jhc2VFYWNoJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1hcDtcbiIsICJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdXG4gKlxuICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAqIF07XG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICovXG5mdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXA7XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gIH1cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5UmVkdWNlO1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmVkdWNlO1xuIiwgInZhciBhcnJheVJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5UmVkdWNlJyksXG4gICAgYmFzZUVhY2ggPSByZXF1aXJlKCcuL19iYXNlRWFjaCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VSZWR1Y2UgPSByZXF1aXJlKCcuL19iYXNlUmVkdWNlJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gKiBhbmQgYHNvcnRCeWBcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAqICAgcmV0dXJuIHN1bSArIG47XG4gKiB9LCAwKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiAgIHJldHVybiByZXN1bHQ7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZHVjZTtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCAidmFyIGJhc2VQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2Jhc2VQcm9wZXJ0eScpO1xuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbnZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzY2lpU2l6ZTtcbiIsICIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNVbmljb2RlO1xuIiwgIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7XG4gICAgKytyZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB1bmljb2RlU2l6ZTtcbiIsICJ2YXIgYXNjaWlTaXplID0gcmVxdWlyZSgnLi9fYXNjaWlTaXplJyksXG4gICAgaGFzVW5pY29kZSA9IHJlcXVpcmUoJy4vX2hhc1VuaWNvZGUnKSxcbiAgICB1bmljb2RlU2l6ZSA9IHJlcXVpcmUoJy4vX3VuaWNvZGVTaXplJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1NpemU7XG4iLCAidmFyIGJhc2VLZXlzID0gcmVxdWlyZSgnLi9fYmFzZUtleXMnKSxcbiAgICBnZXRUYWcgPSByZXF1aXJlKCcuL19nZXRUYWcnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc1N0cmluZyA9IHJlcXVpcmUoJy4vaXNTdHJpbmcnKSxcbiAgICBzdHJpbmdTaXplID0gcmVxdWlyZSgnLi9fc3RyaW5nU2l6ZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XSc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5zaXplKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5zaXplKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gKiAvLyA9PiAyXG4gKlxuICogXy5zaXplKCdwZWJibGVzJyk7XG4gKiAvLyA9PiA3XG4gKi9cbmZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbikge1xuICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICB9XG4gIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplO1xuICB9XG4gIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2l6ZTtcbiIsICJ2YXIgYXJyYXlFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXlFYWNoJyksXG4gICAgYmFzZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX2Jhc2VDcmVhdGUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqXG4gKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gKiBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIHRocnUgYGl0ZXJhdGVlYCwgd2l0aCBlYWNoIGludm9jYXRpb25cbiAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4zLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAqIH0sIFtdKTtcbiAqIC8vID0+IFs0LCA5XVxuICpcbiAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAqIH0sIHt9KTtcbiAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkge1xuICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhY2N1bXVsYXRvciA9IHt9O1xuICAgIH1cbiAgfVxuICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYW5zZm9ybTtcbiIsICJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcHJlYWRhYmxlU3ltYm9sID0gU3ltYm9sID8gU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZsYXR0ZW5hYmxlIGBhcmd1bWVudHNgIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0ZsYXR0ZW5hYmxlKHZhbHVlKSB7XG4gIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHxcbiAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZsYXR0ZW5hYmxlO1xuIiwgInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsICIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCAidmFyIGFwcGx5ID0gcmVxdWlyZSgnLi9fYXBwbHknKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyUmVzdDtcbiIsICJ2YXIgY29uc3RhbnQgPSByZXF1aXJlKCcuL2NvbnN0YW50JyksXG4gICAgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19kZWZpbmVQcm9wZXJ0eScpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlU2V0VG9TdHJpbmc7XG4iLCAiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwgInZhciBiYXNlU2V0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19iYXNlU2V0VG9TdHJpbmcnKSxcbiAgICBzaG9ydE91dCA9IHJlcXVpcmUoJy4vX3Nob3J0T3V0Jyk7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9TdHJpbmc7XG4iLCAidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpLFxuICAgIG92ZXJSZXN0ID0gcmVxdWlyZSgnLi9fb3ZlclJlc3QnKSxcbiAgICBzZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX3NldFRvU3RyaW5nJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VSZXN0O1xuIiwgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaW5kSW5kZXg7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYU47XG4iLCAiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmljdEluZGV4T2Y7XG4iLCAidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUlzTmFOID0gcmVxdWlyZSgnLi9fYmFzZUlzTmFOJyksXG4gICAgc3RyaWN0SW5kZXhPZiA9IHJlcXVpcmUoJy4vX3N0cmljdEluZGV4T2YnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSW5kZXhPZjtcbiIsICJ2YXIgYmFzZUluZGV4T2YgPSByZXF1aXJlKCcuL19iYXNlSW5kZXhPZicpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5SW5jbHVkZXM7XG4iLCAiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiIsICIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5vb3A7XG4iLCAidmFyIFNldCA9IHJlcXVpcmUoJy4vX1NldCcpLFxuICAgIG5vb3AgPSByZXF1aXJlKCcuL25vb3AnKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gKi9cbnZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVNldDtcbiIsICJ2YXIgU2V0Q2FjaGUgPSByZXF1aXJlKCcuL19TZXRDYWNoZScpLFxuICAgIGFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheUluY2x1ZGVzJyksXG4gICAgYXJyYXlJbmNsdWRlc1dpdGggPSByZXF1aXJlKCcuL19hcnJheUluY2x1ZGVzV2l0aCcpLFxuICAgIGNhY2hlSGFzID0gcmVxdWlyZSgnLi9fY2FjaGVIYXMnKSxcbiAgICBjcmVhdGVTZXQgPSByZXF1aXJlKCcuL19jcmVhdGVTZXQnKSxcbiAgICBzZXRUb0FycmF5ID0gcmVxdWlyZSgnLi9fc2V0VG9BcnJheScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICByZXN1bHQgPSBbXSxcbiAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gIH1cbiAgZWxzZSBpZiAobGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICBpZiAoc2V0KSB7XG4gICAgICByZXR1cm4gc2V0VG9BcnJheShzZXQpO1xuICAgIH1cbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIGluY2x1ZGVzID0gY2FjaGVIYXM7XG4gICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgfVxuICBlbHNlIHtcbiAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgfVxuICBvdXRlcjpcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLmxlbmd0aDtcbiAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgaWYgKHNlZW4gIT09IHJlc3VsdCkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmlxO1xuIiwgInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iLCAidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgYmFzZVVuaXEgPSByZXF1aXJlKCcuL19iYXNlVW5pcScpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqL1xudmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmlvbjtcbiIsICJ2YXIgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuXG4gKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAqIG9mIGBwcm9wc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7XG4gIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVmFsdWVzO1xuIiwgInZhciBiYXNlVmFsdWVzID0gcmVxdWlyZSgnLi9fYmFzZVZhbHVlcycpLFxuICAgIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWVzO1xuIiwgIi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIGxvZGFzaDtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBsb2Rhc2ggPSB7XG4gICAgICBjbG9uZTogcmVxdWlyZShcImxvZGFzaC9jbG9uZVwiKSxcbiAgICAgIGNvbnN0YW50OiByZXF1aXJlKFwibG9kYXNoL2NvbnN0YW50XCIpLFxuICAgICAgZWFjaDogcmVxdWlyZShcImxvZGFzaC9lYWNoXCIpLFxuICAgICAgZmlsdGVyOiByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKSxcbiAgICAgIGhhczogIHJlcXVpcmUoXCJsb2Rhc2gvaGFzXCIpLFxuICAgICAgaXNBcnJheTogcmVxdWlyZShcImxvZGFzaC9pc0FycmF5XCIpLFxuICAgICAgaXNFbXB0eTogcmVxdWlyZShcImxvZGFzaC9pc0VtcHR5XCIpLFxuICAgICAgaXNGdW5jdGlvbjogcmVxdWlyZShcImxvZGFzaC9pc0Z1bmN0aW9uXCIpLFxuICAgICAgaXNVbmRlZmluZWQ6IHJlcXVpcmUoXCJsb2Rhc2gvaXNVbmRlZmluZWRcIiksXG4gICAgICBrZXlzOiByZXF1aXJlKFwibG9kYXNoL2tleXNcIiksXG4gICAgICBtYXA6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwXCIpLFxuICAgICAgcmVkdWNlOiByZXF1aXJlKFwibG9kYXNoL3JlZHVjZVwiKSxcbiAgICAgIHNpemU6IHJlcXVpcmUoXCJsb2Rhc2gvc2l6ZVwiKSxcbiAgICAgIHRyYW5zZm9ybTogcmVxdWlyZShcImxvZGFzaC90cmFuc2Zvcm1cIiksXG4gICAgICB1bmlvbjogcmVxdWlyZShcImxvZGFzaC91bmlvblwiKSxcbiAgICAgIHZhbHVlczogcmVxdWlyZShcImxvZGFzaC92YWx1ZXNcIilcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuICB9XG59XG5cbmlmICghbG9kYXNoKSB7XG4gIGxvZGFzaCA9IHdpbmRvdy5fO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZGFzaDtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JhcGg7XG5cbnZhciBERUZBVUxUX0VER0VfTkFNRSA9IFwiXFx4MDBcIjtcbnZhciBHUkFQSF9OT0RFID0gXCJcXHgwMFwiO1xudmFyIEVER0VfS0VZX0RFTElNID0gXCJcXHgwMVwiO1xuXG4vLyBJbXBsZW1lbnRhdGlvbiBub3Rlczpcbi8vXG4vLyAgKiBOb2RlIGlkIHF1ZXJ5IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHN0cmluZyBpZHMgZm9yIHRoZSBub2Rlc1xuLy8gICogRWRnZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBcImVkZ2VPYmpcIiwgZWRnZSBvYmplY3QsIHRoYXQgaXNcbi8vICAgIGNvbXBvc2VkIG9mIGVub3VnaCBpbmZvcm1hdGlvbiB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBlZGdlOiB7diwgdywgbmFtZX0uXG4vLyAgKiBJbnRlcm5hbGx5IHdlIHVzZSBhbiBcImVkZ2VJZFwiLCBhIHN0cmluZ2lmaWVkIGZvcm0gb2YgdGhlIGVkZ2VPYmosIHRvXG4vLyAgICByZWZlcmVuY2UgZWRnZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIGEgcGVyZm9ybWFudCB3YXkgdG8gbG9vayB0aGVzZVxuLy8gICAgZWRnZXMgdXAgYW5kLCBvYmplY3QgcHJvcGVydGllcywgd2hpY2ggaGF2ZSBzdHJpbmcga2V5cywgYXJlIHRoZSBjbG9zZXN0XG4vLyAgICB3ZSdyZSBnb2luZyB0byBnZXQgdG8gYSBwZXJmb3JtYW50IGhhc2h0YWJsZSBpbiBKYXZhU2NyaXB0LlxuXG5mdW5jdGlvbiBHcmFwaChvcHRzKSB7XG4gIHRoaXMuX2lzRGlyZWN0ZWQgPSBfLmhhcyhvcHRzLCBcImRpcmVjdGVkXCIpID8gb3B0cy5kaXJlY3RlZCA6IHRydWU7XG4gIHRoaXMuX2lzTXVsdGlncmFwaCA9IF8uaGFzKG9wdHMsIFwibXVsdGlncmFwaFwiKSA/IG9wdHMubXVsdGlncmFwaCA6IGZhbHNlO1xuICB0aGlzLl9pc0NvbXBvdW5kID0gXy5oYXMob3B0cywgXCJjb21wb3VuZFwiKSA/IG9wdHMuY29tcG91bmQgOiBmYWxzZTtcblxuICAvLyBMYWJlbCBmb3IgdGhlIGdyYXBoIGl0c2VsZlxuICB0aGlzLl9sYWJlbCA9IHVuZGVmaW5lZDtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBub2RlXG4gIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBlZGdlXG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IF8uY29uc3RhbnQodW5kZWZpbmVkKTtcblxuICAvLyB2IC0+IGxhYmVsXG4gIHRoaXMuX25vZGVzID0ge307XG5cbiAgaWYgKHRoaXMuX2lzQ29tcG91bmQpIHtcbiAgICAvLyB2IC0+IHBhcmVudFxuICAgIHRoaXMuX3BhcmVudCA9IHt9O1xuXG4gICAgLy8gdiAtPiBjaGlsZHJlblxuICAgIHRoaXMuX2NoaWxkcmVuID0ge307XG4gICAgdGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV0gPSB7fTtcbiAgfVxuXG4gIC8vIHYgLT4gZWRnZU9ialxuICB0aGlzLl9pbiA9IHt9O1xuXG4gIC8vIHUgLT4gdiAtPiBOdW1iZXJcbiAgdGhpcy5fcHJlZHMgPSB7fTtcblxuICAvLyB2IC0+IGVkZ2VPYmpcbiAgdGhpcy5fb3V0ID0ge307XG5cbiAgLy8gdiAtPiB3IC0+IE51bWJlclxuICB0aGlzLl9zdWNzID0ge307XG5cbiAgLy8gZSAtPiBlZGdlT2JqXG4gIHRoaXMuX2VkZ2VPYmpzID0ge307XG5cbiAgLy8gZSAtPiBsYWJlbFxuICB0aGlzLl9lZGdlTGFiZWxzID0ge307XG59XG5cbi8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqL1xuR3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQgPSAwO1xuXG4vKiBOdW1iZXIgb2YgZWRnZXMgaW4gdGhlIGdyYXBoLiBTaG91bGQgb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4gKi9cbkdyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50ID0gMDtcblxuXG4vKiA9PT0gR3JhcGggZnVuY3Rpb25zID09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuaXNEaXJlY3RlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5faXNEaXJlY3RlZDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9pc0NvbXBvdW5kO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldEdyYXBoID0gZnVuY3Rpb24obGFiZWwpIHtcbiAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZ3JhcGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2xhYmVsO1xufTtcblxuXG4vKiA9PT0gTm9kZSBmdW5jdGlvbnMgPT09PT09PT09PSAqL1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHtcbiAgaWYgKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpIHtcbiAgICBuZXdEZWZhdWx0ID0gXy5jb25zdGFudChuZXdEZWZhdWx0KTtcbiAgfVxuICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBuZXdEZWZhdWx0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVDb3VudDtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5ub2RlcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zb3VyY2VzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLmlzRW1wdHkoc2VsZi5faW5bdl0pO1xuICB9KTtcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zaW5rcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHJldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gXy5pc0VtcHR5KHNlbGYuX291dFt2XSk7XG4gIH0pO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnNldE5vZGVzID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIF8uZWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0Tm9kZSh2KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zZXROb2RlID0gZnVuY3Rpb24odiwgdmFsdWUpIHtcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fbm9kZXNbdl0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9ub2Rlc1t2XSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7XG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdGhpcy5fcGFyZW50W3ZdID0gR1JBUEhfTk9ERTtcbiAgICB0aGlzLl9jaGlsZHJlblt2XSA9IHt9O1xuICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdID0gdHJ1ZTtcbiAgfVxuICB0aGlzLl9pblt2XSA9IHt9O1xuICB0aGlzLl9wcmVkc1t2XSA9IHt9O1xuICB0aGlzLl9vdXRbdl0gPSB7fTtcbiAgdGhpcy5fc3Vjc1t2XSA9IHt9O1xuICArK3RoaXMuX25vZGVDb3VudDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIHRoaXMuX25vZGVzW3ZdO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmhhc05vZGUgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiBfLmhhcyh0aGlzLl9ub2Rlcywgdik7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZSA9ICBmdW5jdGlvbih2KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKF8uaGFzKHRoaXMuX25vZGVzLCB2KSkge1xuICAgIHZhciByZW1vdmVFZGdlID0gZnVuY3Rpb24oZSkgeyBzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pOyB9O1xuICAgIGRlbGV0ZSB0aGlzLl9ub2Rlc1t2XTtcbiAgICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgICAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gICAgICBkZWxldGUgdGhpcy5fcGFyZW50W3ZdO1xuICAgICAgXy5lYWNoKHRoaXMuY2hpbGRyZW4odiksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgIHNlbGYuc2V0UGFyZW50KGNoaWxkKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdO1xuICAgIH1cbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSwgcmVtb3ZlRWRnZSk7XG4gICAgZGVsZXRlIHRoaXMuX2luW3ZdO1xuICAgIGRlbGV0ZSB0aGlzLl9wcmVkc1t2XTtcbiAgICBfLmVhY2goXy5rZXlzKHRoaXMuX291dFt2XSksIHJlbW92ZUVkZ2UpO1xuICAgIGRlbGV0ZSB0aGlzLl9vdXRbdl07XG4gICAgZGVsZXRlIHRoaXMuX3N1Y3Nbdl07XG4gICAgLS10aGlzLl9ub2RlQ291bnQ7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24odiwgcGFyZW50KSB7XG4gIGlmICghdGhpcy5faXNDb21wb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoXCIpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyZW50KSkge1xuICAgIHBhcmVudCA9IEdSQVBIX05PREU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29lcmNlIHBhcmVudCB0byBzdHJpbmdcbiAgICBwYXJlbnQgKz0gXCJcIjtcbiAgICBmb3IgKHZhciBhbmNlc3RvciA9IHBhcmVudDtcbiAgICAgICFfLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTtcbiAgICAgIGFuY2VzdG9yID0gdGhpcy5wYXJlbnQoYW5jZXN0b3IpKSB7XG4gICAgICBpZiAoYW5jZXN0b3IgPT09IHYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0dGluZyBcIiArIHBhcmVudCsgXCIgYXMgcGFyZW50IG9mIFwiICsgdiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiB3b3VsZCBjcmVhdGUgYSBjeWNsZVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldE5vZGUocGFyZW50KTtcbiAgfVxuXG4gIHRoaXMuc2V0Tm9kZSh2KTtcbiAgdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7XG4gIHRoaXMuX3BhcmVudFt2XSA9IHBhcmVudDtcbiAgdGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCA9IGZ1bmN0aW9uKHYpIHtcbiAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24odikge1xuICBpZiAodGhpcy5faXNDb21wb3VuZCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJlbnRbdl07XG4gICAgaWYgKHBhcmVudCAhPT0gR1JBUEhfTk9ERSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHYpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQodikpIHtcbiAgICB2ID0gR1JBUEhfTk9ERTtcbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW5bdl07XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gXy5rZXlzKGNoaWxkcmVuKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodiA9PT0gR1JBUEhfTk9ERSkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5oYXNOb2RlKHYpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgcHJlZHNWID0gdGhpcy5fcHJlZHNbdl07XG4gIGlmIChwcmVkc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHByZWRzVik7XG4gIH1cbn07XG5cbkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzID0gZnVuY3Rpb24odikge1xuICB2YXIgc3Vjc1YgPSB0aGlzLl9zdWNzW3ZdO1xuICBpZiAoc3Vjc1YpIHtcbiAgICByZXR1cm4gXy5rZXlzKHN1Y3NWKTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm5laWdoYm9ycyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIHByZWRzID0gdGhpcy5wcmVkZWNlc3NvcnModik7XG4gIGlmIChwcmVkcykge1xuICAgIHJldHVybiBfLnVuaW9uKHByZWRzLCB0aGlzLnN1Y2Nlc3NvcnModikpO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaXNMZWFmID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIG5laWdoYm9ycztcbiAgaWYgKHRoaXMuaXNEaXJlY3RlZCgpKSB7XG4gICAgbmVpZ2hib3JzID0gdGhpcy5zdWNjZXNzb3JzKHYpO1xuICB9IGVsc2Uge1xuICAgIG5laWdoYm9ycyA9IHRoaXMubmVpZ2hib3JzKHYpO1xuICB9XG4gIHJldHVybiBuZWlnaGJvcnMubGVuZ3RoID09PSAwO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gIHZhciBjb3B5ID0gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgIGRpcmVjdGVkOiB0aGlzLl9pc0RpcmVjdGVkLFxuICAgIG11bHRpZ3JhcGg6IHRoaXMuX2lzTXVsdGlncmFwaCxcbiAgICBjb21wb3VuZDogdGhpcy5faXNDb21wb3VuZFxuICB9KTtcblxuICBjb3B5LnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBfLmVhY2godGhpcy5fbm9kZXMsIGZ1bmN0aW9uKHZhbHVlLCB2KSB7XG4gICAgaWYgKGZpbHRlcih2KSkge1xuICAgICAgY29weS5zZXROb2RlKHYsIHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZWFjaCh0aGlzLl9lZGdlT2JqcywgZnVuY3Rpb24oZSkge1xuICAgIGlmIChjb3B5Lmhhc05vZGUoZS52KSAmJiBjb3B5Lmhhc05vZGUoZS53KSkge1xuICAgICAgY29weS5zZXRFZGdlKGUsIHNlbGYuZWRnZShlKSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcGFyZW50cyA9IHt9O1xuICBmdW5jdGlvbiBmaW5kUGFyZW50KHYpIHtcbiAgICB2YXIgcGFyZW50ID0gc2VsZi5wYXJlbnQodik7XG4gICAgaWYgKHBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IGNvcHkuaGFzTm9kZShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnRzW3ZdID0gcGFyZW50O1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9IGVsc2UgaWYgKHBhcmVudCBpbiBwYXJlbnRzKSB7XG4gICAgICByZXR1cm4gcGFyZW50c1twYXJlbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7XG4gICAgXy5lYWNoKGNvcHkubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgICAgY29weS5zZXRQYXJlbnQodiwgZmluZFBhcmVudCh2KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbi8qID09PSBFZGdlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovXG5cbkdyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsID0gZnVuY3Rpb24obmV3RGVmYXVsdCkge1xuICBpZiAoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkge1xuICAgIG5ld0RlZmF1bHQgPSBfLmNvbnN0YW50KG5ld0RlZmF1bHQpO1xuICB9XG4gIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fZWRnZUNvdW50O1xufTtcblxuR3JhcGgucHJvdG90eXBlLmVkZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyk7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuc2V0UGF0aCA9IGZ1bmN0aW9uKHZzLCB2YWx1ZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICBfLnJlZHVjZSh2cywgZnVuY3Rpb24odiwgdykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuc2V0RWRnZSh2LCB3KTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qXG4gKiBzZXRFZGdlKHYsIHcsIFt2YWx1ZSwgW25hbWVdXSlcbiAqIHNldEVkZ2UoeyB2LCB3LCBbbmFtZV0gfSwgW3ZhbHVlXSlcbiAqL1xuR3JhcGgucHJvdG90eXBlLnNldEVkZ2UgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHYsIHcsIG5hbWUsIHZhbHVlO1xuICB2YXIgdmFsdWVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgdmFyIGFyZzAgPSBhcmd1bWVudHNbMF07XG5cbiAgaWYgKHR5cGVvZiBhcmcwID09PSBcIm9iamVjdFwiICYmIGFyZzAgIT09IG51bGwgJiYgXCJ2XCIgaW4gYXJnMCkge1xuICAgIHYgPSBhcmcwLnY7XG4gICAgdyA9IGFyZzAudztcbiAgICBuYW1lID0gYXJnMC5uYW1lO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICB2YWx1ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdiA9IGFyZzA7XG4gICAgdyA9IGFyZ3VtZW50c1sxXTtcbiAgICBuYW1lID0gYXJndW1lbnRzWzNdO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICB2YWx1ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdiA9IFwiXCIgKyB2O1xuICB3ID0gXCJcIiArIHc7XG4gIGlmICghXy5pc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIG5hbWUgPSBcIlwiICsgbmFtZTtcbiAgfVxuXG4gIHZhciBlID0gZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpO1xuICBpZiAoXy5oYXModGhpcy5fZWRnZUxhYmVscywgZSkpIHtcbiAgICBpZiAodmFsdWVTcGVjaWZpZWQpIHtcbiAgICAgIHRoaXMuX2VkZ2VMYWJlbHNbZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQobmFtZSkgJiYgIXRoaXMuX2lzTXVsdGlncmFwaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2VcIik7XG4gIH1cblxuICAvLyBJdCBkaWRuJ3QgZXhpc3QsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGl0LlxuICAvLyBGaXJzdCBlbnN1cmUgdGhlIG5vZGVzIGV4aXN0LlxuICB0aGlzLnNldE5vZGUodik7XG4gIHRoaXMuc2V0Tm9kZSh3KTtcblxuICB0aGlzLl9lZGdlTGFiZWxzW2VdID0gdmFsdWVTcGVjaWZpZWQgPyB2YWx1ZSA6IHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LCB3LCBuYW1lKTtcblxuICB2YXIgZWRnZU9iaiA9IGVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7XG4gIC8vIEVuc3VyZSB3ZSBhZGQgdW5kaXJlY3RlZCBlZGdlcyBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuICB2ID0gZWRnZU9iai52O1xuICB3ID0gZWRnZU9iai53O1xuXG4gIE9iamVjdC5mcmVlemUoZWRnZU9iaik7XG4gIHRoaXMuX2VkZ2VPYmpzW2VdID0gZWRnZU9iajtcbiAgaW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sIHYpO1xuICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9zdWNzW3ZdLCB3KTtcbiAgdGhpcy5faW5bd11bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9vdXRbdl1bZV0gPSBlZGdlT2JqO1xuICB0aGlzLl9lZGdlQ291bnQrKztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuZWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV07XG59O1xuXG5HcmFwaC5wcm90b3R5cGUuaGFzRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHtcbiAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKVxuICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsIGUpO1xufTtcblxuR3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7XG4gIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSlcbiAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7XG4gIHZhciBlZGdlID0gdGhpcy5fZWRnZU9ianNbZV07XG4gIGlmIChlZGdlKSB7XG4gICAgdiA9IGVkZ2UudjtcbiAgICB3ID0gZWRnZS53O1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdO1xuICAgIGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTtcbiAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpO1xuICAgIGRlbGV0ZSB0aGlzLl9pblt3XVtlXTtcbiAgICBkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO1xuICAgIHRoaXMuX2VkZ2VDb3VudC0tO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuR3JhcGgucHJvdG90eXBlLmluRWRnZXMgPSBmdW5jdGlvbih2LCB1KSB7XG4gIHZhciBpblYgPSB0aGlzLl9pblt2XTtcbiAgaWYgKGluVikge1xuICAgIHZhciBlZGdlcyA9IF8udmFsdWVzKGluVik7XG4gICAgaWYgKCF1KSB7XG4gICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIHJldHVybiBfLmZpbHRlcihlZGdlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gZWRnZS52ID09PSB1OyB9KTtcbiAgfVxufTtcblxuR3JhcGgucHJvdG90eXBlLm91dEVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgb3V0ViA9IHRoaXMuX291dFt2XTtcbiAgaWYgKG91dFYpIHtcbiAgICB2YXIgZWRnZXMgPSBfLnZhbHVlcyhvdXRWKTtcbiAgICBpZiAoIXcpIHtcbiAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgcmV0dXJuIF8uZmlsdGVyKGVkZ2VzLCBmdW5jdGlvbihlZGdlKSB7IHJldHVybiBlZGdlLncgPT09IHc7IH0pO1xuICB9XG59O1xuXG5HcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzID0gZnVuY3Rpb24odiwgdykge1xuICB2YXIgaW5FZGdlcyA9IHRoaXMuaW5FZGdlcyh2LCB3KTtcbiAgaWYgKGluRWRnZXMpIHtcbiAgICByZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LCB3KSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCwgaykge1xuICBpZiAobWFwW2tdKSB7XG4gICAgbWFwW2tdKys7XG4gIH0gZWxzZSB7XG4gICAgbWFwW2tdID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KG1hcCwgaykge1xuICBpZiAoIS0tbWFwW2tdKSB7IGRlbGV0ZSBtYXBba107IH1cbn1cblxuZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgcmV0dXJuIHYgKyBFREdFX0tFWV9ERUxJTSArIHcgKyBFREdFX0tFWV9ERUxJTSArXG4gICAgICAgICAgICAgKF8uaXNVbmRlZmluZWQobmFtZSkgPyBERUZBVUxUX0VER0VfTkFNRSA6IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkge1xuICB2YXIgdiA9IFwiXCIgKyB2XztcbiAgdmFyIHcgPSBcIlwiICsgd187XG4gIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykge1xuICAgIHZhciB0bXAgPSB2O1xuICAgIHYgPSB3O1xuICAgIHcgPSB0bXA7XG4gIH1cbiAgdmFyIGVkZ2VPYmogPSAgeyB2OiB2LCB3OiB3IH07XG4gIGlmIChuYW1lKSB7XG4gICAgZWRnZU9iai5uYW1lID0gbmFtZTtcbiAgfVxuICByZXR1cm4gZWRnZU9iajtcbn1cblxuZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCwgZWRnZU9iaikge1xuICByZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmoudiwgZWRnZU9iai53LCBlZGdlT2JqLm5hbWUpO1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0gJzIuMS44JztcbiIsICIvLyBJbmNsdWRlcyBvbmx5IHRoZSBcImNvcmVcIiBvZiBncmFwaGxpYlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBoOiByZXF1aXJlKFwiLi9ncmFwaFwiKSxcbiAgdmVyc2lvbjogcmVxdWlyZShcIi4vdmVyc2lvblwiKVxufTtcbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd3JpdGU6IHdyaXRlLFxuICByZWFkOiByZWFkXG59O1xuXG5mdW5jdGlvbiB3cml0ZShnKSB7XG4gIHZhciBqc29uID0ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGRpcmVjdGVkOiBnLmlzRGlyZWN0ZWQoKSxcbiAgICAgIG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCksXG4gICAgICBjb21wb3VuZDogZy5pc0NvbXBvdW5kKClcbiAgICB9LFxuICAgIG5vZGVzOiB3cml0ZU5vZGVzKGcpLFxuICAgIGVkZ2VzOiB3cml0ZUVkZ2VzKGcpXG4gIH07XG4gIGlmICghXy5pc1VuZGVmaW5lZChnLmdyYXBoKCkpKSB7XG4gICAganNvbi52YWx1ZSA9IF8uY2xvbmUoZy5ncmFwaCgpKTtcbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZnVuY3Rpb24gd3JpdGVOb2RlcyhnKSB7XG4gIHJldHVybiBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZVZhbHVlID0gZy5ub2RlKHYpO1xuICAgIHZhciBwYXJlbnQgPSBnLnBhcmVudCh2KTtcbiAgICB2YXIgbm9kZSA9IHsgdjogdiB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gbm9kZVZhbHVlO1xuICAgIH1cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyZW50KSkge1xuICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVFZGdlcyhnKSB7XG4gIHJldHVybiBfLm1hcChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZVZhbHVlID0gZy5lZGdlKGUpO1xuICAgIHZhciBlZGdlID0geyB2OiBlLnYsIHc6IGUudyB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlLm5hbWUpKSB7XG4gICAgICBlZGdlLm5hbWUgPSBlLm5hbWU7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlZGdlVmFsdWUpKSB7XG4gICAgICBlZGdlLnZhbHVlID0gZWRnZVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlYWQoanNvbikge1xuICB2YXIgZyA9IG5ldyBHcmFwaChqc29uLm9wdGlvbnMpLnNldEdyYXBoKGpzb24udmFsdWUpO1xuICBfLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBnLnNldE5vZGUoZW50cnkudiwgZW50cnkudmFsdWUpO1xuICAgIGlmIChlbnRyeS5wYXJlbnQpIHtcbiAgICAgIGcuc2V0UGFyZW50KGVudHJ5LnYsIGVudHJ5LnBhcmVudCk7XG4gICAgfVxuICB9KTtcbiAgXy5lYWNoKGpzb24uZWRnZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZy5zZXRFZGdlKHsgdjogZW50cnkudiwgdzogZW50cnkudywgbmFtZTogZW50cnkubmFtZSB9LCBlbnRyeS52YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gZztcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcG9uZW50cztcblxuZnVuY3Rpb24gY29tcG9uZW50cyhnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG4gIHZhciBjbXB0cyA9IFtdO1xuICB2YXIgY21wdDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIGNtcHQucHVzaCh2KTtcbiAgICBfLmVhY2goZy5zdWNjZXNzb3JzKHYpLCBkZnMpO1xuICAgIF8uZWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBjbXB0ID0gW107XG4gICAgZGZzKHYpO1xuICAgIGlmIChjbXB0Lmxlbmd0aCkge1xuICAgICAgY21wdHMucHVzaChjbXB0KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjbXB0cztcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJpb3JpdHlRdWV1ZTtcblxuLyoqXG4gKiBBIG1pbi1wcmlvcml0eSBxdWV1ZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBhbGdvcml0aG0gaXMgZGVyaXZlZCBmcm9tIENvcm1lbixcbiAqIGV0IGFsLiwgXCJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtc1wiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eVxuICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluXG4gKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuXG4gKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS5cbiAqL1xuZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHtcbiAgdGhpcy5fYXJyID0gW107XG4gIHRoaXMuX2tleUluZGljZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJyLmxlbmd0aDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2V5cyB0aGF0IGFyZSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKG4pYCB0aW1lLlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgua2V5OyB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LlxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsIGtleSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZVxuICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldO1xuICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5O1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGlzIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXNcbiAqIGVtcHR5IHRoaXMgZnVuY3Rpb24gdGhyb3dzIGFuIEVycm9yLiBUYWtlcyBgTygxKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlF1ZXVlIHVuZGVyZmxvd1wiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTtcbn07XG5cbi8qKlxuICogSW5zZXJ0cyBhIG5ldyBrZXkgaW50byB0aGUgcHJpb3JpdHkgcXVldWUuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW5cbiAqIHRoZSBxdWV1ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYDsgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIGB0cnVlYC5cbiAqIFRha2VzIGBPKG4pYCB0aW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSB0byBhZGRcbiAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgaW5pdGlhbCBwcmlvcml0eSBmb3IgdGhlIGtleVxuICovXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBrZXlJbmRpY2VzID0gdGhpcy5fa2V5SW5kaWNlcztcbiAga2V5ID0gU3RyaW5nKGtleSk7XG4gIGlmICghXy5oYXMoa2V5SW5kaWNlcywga2V5KSkge1xuICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDtcbiAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDtcbiAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pO1xuICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIHNtYWxsZXN0IGtleSBpbiB0aGUgcXVldWUuIFRha2VzIGBPKGxvZyBuKWAgdGltZS5cbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3N3YXAoMCwgdGhpcy5fYXJyLmxlbmd0aCAtIDEpO1xuICB2YXIgbWluID0gdGhpcy5fYXJyLnBvcCgpO1xuICBkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTtcbiAgdGhpcy5faGVhcGlmeSgwKTtcbiAgcmV0dXJuIG1pbi5rZXk7XG59O1xuXG4vKipcbiAqIERlY3JlYXNlcyB0aGUgcHJpb3JpdHkgZm9yICoqa2V5KiogdG8gKipwcmlvcml0eSoqLiBJZiB0aGUgbmV3IHByaW9yaXR5IGlzXG4gKiBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIHByaW9yaXR5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IGZvciB3aGljaCB0byByYWlzZSBwcmlvcml0eVxuICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBuZXcgcHJpb3JpdHkgZm9yIHRoZSBrZXlcbiAqL1xuUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbihrZXksIHByaW9yaXR5KSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX2tleUluZGljZXNba2V5XTtcbiAgaWYgKHByaW9yaXR5ID4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gXCIgK1xuICAgICAgICBcIktleTogXCIgKyBrZXkgKyBcIiBPbGQ6IFwiICsgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSArIFwiIE5ldzogXCIgKyBwcmlvcml0eSk7XG4gIH1cbiAgdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICB0aGlzLl9kZWNyZWFzZShpbmRleCk7XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeSA9IGZ1bmN0aW9uKGkpIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGwgPSAyICogaTtcbiAgdmFyIHIgPSBsICsgMTtcbiAgdmFyIGxhcmdlc3QgPSBpO1xuICBpZiAobCA8IGFyci5sZW5ndGgpIHtcbiAgICBsYXJnZXN0ID0gYXJyW2xdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gbCA6IGxhcmdlc3Q7XG4gICAgaWYgKHIgPCBhcnIubGVuZ3RoKSB7XG4gICAgICBsYXJnZXN0ID0gYXJyW3JdLnByaW9yaXR5IDwgYXJyW2xhcmdlc3RdLnByaW9yaXR5ID8gciA6IGxhcmdlc3Q7XG4gICAgfVxuICAgIGlmIChsYXJnZXN0ICE9PSBpKSB7XG4gICAgICB0aGlzLl9zd2FwKGksIGxhcmdlc3QpO1xuICAgICAgdGhpcy5faGVhcGlmeShsYXJnZXN0KTtcbiAgICB9XG4gIH1cbn07XG5cblByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7XG4gIHZhciBhcnIgPSB0aGlzLl9hcnI7XG4gIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7XG4gIHZhciBwYXJlbnQ7XG4gIHdoaWxlIChpbmRleCAhPT0gMCkge1xuICAgIHBhcmVudCA9IGluZGV4ID4+IDE7XG4gICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpO1xuICAgIGluZGV4ID0gcGFyZW50O1xuICB9XG59O1xuXG5Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcCA9IGZ1bmN0aW9uKGksIGopIHtcbiAgdmFyIGFyciA9IHRoaXMuX2FycjtcbiAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzO1xuICB2YXIgb3JpZ0FyckkgPSBhcnJbaV07XG4gIHZhciBvcmlnQXJySiA9IGFycltqXTtcbiAgYXJyW2ldID0gb3JpZ0Fycko7XG4gIGFycltqXSA9IG9yaWdBcnJJO1xuICBrZXlJbmRpY2VzW29yaWdBcnJKLmtleV0gPSBpO1xuICBrZXlJbmRpY2VzW29yaWdBcnJJLmtleV0gPSBqO1xufTtcbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRpamtzdHJhO1xuXG52YXIgREVGQVVMVF9XRUlHSFRfRlVOQyA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICByZXR1cm4gcnVuRGlqa3N0cmEoZywgU3RyaW5nKHNvdXJjZSksXG4gICAgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRlVOQyxcbiAgICBlZGdlRm4gfHwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5vdXRFZGdlcyh2KTsgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikge1xuICB2YXIgcmVzdWx0cyA9IHt9O1xuICB2YXIgcHEgPSBuZXcgUHJpb3JpdHlRdWV1ZSgpO1xuICB2YXIgdiwgdkVudHJ5O1xuXG4gIHZhciB1cGRhdGVOZWlnaGJvcnMgPSBmdW5jdGlvbihlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgIT09IHYgPyBlZGdlLnYgOiBlZGdlLnc7XG4gICAgdmFyIHdFbnRyeSA9IHJlc3VsdHNbd107XG4gICAgdmFyIHdlaWdodCA9IHdlaWdodEZuKGVkZ2UpO1xuICAgIHZhciBkaXN0YW5jZSA9IHZFbnRyeS5kaXN0YW5jZSArIHdlaWdodDtcblxuICAgIGlmICh3ZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIkJhZCBlZGdlOiBcIiArIGVkZ2UgKyBcIiBXZWlnaHQ6IFwiICsgd2VpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoZGlzdGFuY2UgPCB3RW50cnkuZGlzdGFuY2UpIHtcbiAgICAgIHdFbnRyeS5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgd0VudHJ5LnByZWRlY2Vzc29yID0gdjtcbiAgICAgIHBxLmRlY3JlYXNlKHcsIGRpc3RhbmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIHZhciBkaXN0YW5jZSA9IHYgPT09IHNvdXJjZSA/IDAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgcmVzdWx0c1t2XSA9IHsgZGlzdGFuY2U6IGRpc3RhbmNlIH07XG4gICAgcHEuYWRkKHYsIGRpc3RhbmNlKTtcbiAgfSk7XG5cbiAgd2hpbGUgKHBxLnNpemUoKSA+IDApIHtcbiAgICB2ID0gcHEucmVtb3ZlTWluKCk7XG4gICAgdkVudHJ5ID0gcmVzdWx0c1t2XTtcbiAgICBpZiAodkVudHJ5LmRpc3RhbmNlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGVkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiIsICJ2YXIgZGlqa3N0cmEgPSByZXF1aXJlKFwiLi9kaWprc3RyYVwiKTtcbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkaWprc3RyYUFsbDtcblxuZnVuY3Rpb24gZGlqa3N0cmFBbGwoZywgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpIHtcbiAgcmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSwgZnVuY3Rpb24oYWNjLCB2KSB7XG4gICAgYWNjW3ZdID0gZGlqa3N0cmEoZywgdiwgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpO1xuICB9LCB7fSk7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRhcmphbjtcblxuZnVuY3Rpb24gdGFyamFuKGcpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciB2aXNpdGVkID0ge307IC8vIG5vZGUgaWQgLT4geyBvblN0YWNrLCBsb3dsaW5rLCBpbmRleCB9XG4gIHZhciByZXN1bHRzID0gW107XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgZW50cnkgPSB2aXNpdGVkW3ZdID0ge1xuICAgICAgb25TdGFjazogdHJ1ZSxcbiAgICAgIGxvd2xpbms6IGluZGV4LFxuICAgICAgaW5kZXg6IGluZGV4KytcbiAgICB9O1xuICAgIHN0YWNrLnB1c2godik7XG5cbiAgICBnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KSB7XG4gICAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHcpKSB7XG4gICAgICAgIGRmcyh3KTtcbiAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10ubG93bGluayk7XG4gICAgICB9IGVsc2UgaWYgKHZpc2l0ZWRbd10ub25TdGFjaykge1xuICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5pbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZW50cnkubG93bGluayA9PT0gZW50cnkuaW5kZXgpIHtcbiAgICAgIHZhciBjbXB0ID0gW107XG4gICAgICB2YXIgdztcbiAgICAgIGRvIHtcbiAgICAgICAgdyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2aXNpdGVkW3ddLm9uU3RhY2sgPSBmYWxzZTtcbiAgICAgICAgY21wdC5wdXNoKHcpO1xuICAgICAgfSB3aGlsZSAodiAhPT0gdyk7XG4gICAgICByZXN1bHRzLnB1c2goY21wdCk7XG4gICAgfVxuICB9XG5cbiAgZy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICAgIGRmcyh2KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRzO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciB0YXJqYW4gPSByZXF1aXJlKFwiLi90YXJqYW5cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZEN5Y2xlcztcblxuZnVuY3Rpb24gZmluZEN5Y2xlcyhnKSB7XG4gIHJldHVybiBfLmZpbHRlcih0YXJqYW4oZyksIGZ1bmN0aW9uKGNtcHQpIHtcbiAgICByZXR1cm4gY21wdC5sZW5ndGggPiAxIHx8IChjbXB0Lmxlbmd0aCA9PT0gMSAmJiBnLmhhc0VkZ2UoY21wdFswXSwgY21wdFswXSkpO1xuICB9KTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZmxveWRXYXJzaGFsbDtcblxudmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBfLmNvbnN0YW50KDEpO1xuXG5mdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHtcbiAgcmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyxcbiAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DLFxuICAgIGVkZ2VGbiB8fCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm91dEVkZ2VzKHYpOyB9KTtcbn1cblxuZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLCB3ZWlnaHRGbiwgZWRnZUZuKSB7XG4gIHZhciByZXN1bHRzID0ge307XG4gIHZhciBub2RlcyA9IGcubm9kZXMoKTtcblxuICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcbiAgICByZXN1bHRzW3ZdID0ge307XG4gICAgcmVzdWx0c1t2XVt2XSA9IHsgZGlzdGFuY2U6IDAgfTtcbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpIHtcbiAgICAgIGlmICh2ICE9PSB3KSB7XG4gICAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKSB7XG4gICAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjtcbiAgICAgIHZhciBkID0gd2VpZ2h0Rm4oZWRnZSk7XG4gICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogZCwgcHJlZGVjZXNzb3I6IHYgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgdmFyIHJvd0sgPSByZXN1bHRzW2tdO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgdmFyIHJvd0kgPSByZXN1bHRzW2ldO1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKSB7XG4gICAgICAgIHZhciBpayA9IHJvd0lba107XG4gICAgICAgIHZhciBraiA9IHJvd0tbal07XG4gICAgICAgIHZhciBpaiA9IHJvd0lbal07XG4gICAgICAgIHZhciBhbHREaXN0YW5jZSA9IGlrLmRpc3RhbmNlICsga2ouZGlzdGFuY2U7XG4gICAgICAgIGlmIChhbHREaXN0YW5jZSA8IGlqLmRpc3RhbmNlKSB7XG4gICAgICAgICAgaWouZGlzdGFuY2UgPSBhbHREaXN0YW5jZTtcbiAgICAgICAgICBpai5wcmVkZWNlc3NvciA9IGtqLnByZWRlY2Vzc29yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvcHNvcnQ7XG50b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uID0gQ3ljbGVFeGNlcHRpb247XG5cbmZ1bmN0aW9uIHRvcHNvcnQoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlKSB7XG4gICAgaWYgKF8uaGFzKHN0YWNrLCBub2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyh2aXNpdGVkLCBub2RlKSkge1xuICAgICAgc3RhY2tbbm9kZV0gPSB0cnVlO1xuICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7XG4gICAgICBfLmVhY2goZy5wcmVkZWNlc3NvcnMobm9kZSksIHZpc2l0KTtcbiAgICAgIGRlbGV0ZSBzdGFja1tub2RlXTtcbiAgICAgIHJlc3VsdHMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cblxuICBfLmVhY2goZy5zaW5rcygpLCB2aXNpdCk7XG5cbiAgaWYgKF8uc2l6ZSh2aXNpdGVkKSAhPT0gZy5ub2RlQ291bnQoKSkge1xuICAgIHRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbigpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCkge31cbkN5Y2xlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOyAvLyBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEVycm9yIHRvIHBhc3MgdGVzdGluZyIsICJ2YXIgdG9wc29ydCA9IHJlcXVpcmUoXCIuL3RvcHNvcnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBY3ljbGljO1xuXG5mdW5jdGlvbiBpc0FjeWNsaWMoZykge1xuICB0cnkge1xuICAgIHRvcHNvcnQoZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGZzO1xuXG4vKlxuICogQSBoZWxwZXIgdGhhdCBwcmVmb3JtcyBhIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb24gdGhlIGlucHV0IGdyYXBoXG4gKiBhbmQgcmV0dXJucyB0aGUgbm9kZXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSB2aXNpdGVkLiBJZiB0aGUgZ3JhcGggaXNcbiAqIHVuZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIG5laWdoYm9ycy4gSWYgdGhlIGdyYXBoXG4gKiBpcyBkaXJlY3RlZCB0aGVuIHRoaXMgYWxnb3JpdGhtIHdpbGwgbmF2aWdhdGUgdXNpbmcgc3VjY2Vzc29ycy5cbiAqXG4gKiBPcmRlciBtdXN0IGJlIG9uZSBvZiBcInByZVwiIG9yIFwicG9zdFwiLlxuICovXG5mdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7XG4gIGlmICghXy5pc0FycmF5KHZzKSkge1xuICAgIHZzID0gW3ZzXTtcbiAgfVxuXG4gIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7XG5cbiAgdmFyIGFjYyA9IFtdO1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICBfLmVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuaGFzTm9kZSh2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiBcIiArIHYpO1xuICAgIH1cblxuICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSBcInBvc3RcIiwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgfSk7XG4gIHJldHVybiBhY2M7XG59XG5cbmZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7XG4gIGlmICghXy5oYXModmlzaXRlZCwgdikpIHtcbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcblxuICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gICAgXy5lYWNoKG5hdmlnYXRpb24odiksIGZ1bmN0aW9uKHcpIHtcbiAgICAgIGRvRGZzKGcsIHcsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKTtcbiAgICB9KTtcbiAgICBpZiAocG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9XG4gIH1cbn1cbiIsICJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc3RvcmRlcjtcblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcsIHZzKSB7XG4gIHJldHVybiBkZnMoZywgdnMsIFwicG9zdFwiKTtcbn1cbiIsICJ2YXIgZGZzID0gcmVxdWlyZShcIi4vZGZzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByZW9yZGVyO1xuXG5mdW5jdGlvbiBwcmVvcmRlcihnLCB2cykge1xuICByZXR1cm4gZGZzKGcsIHZzLCBcInByZVwiKTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhcIik7XG52YXIgUHJpb3JpdHlRdWV1ZSA9IHJlcXVpcmUoXCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByaW07XG5cbmZ1bmN0aW9uIHByaW0oZywgd2VpZ2h0RnVuYykge1xuICB2YXIgcmVzdWx0ID0gbmV3IEdyYXBoKCk7XG4gIHZhciBwYXJlbnRzID0ge307XG4gIHZhciBwcSA9IG5ldyBQcmlvcml0eVF1ZXVlKCk7XG4gIHZhciB2O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKSB7XG4gICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7XG4gICAgdmFyIHByaSA9IHBxLnByaW9yaXR5KHcpO1xuICAgIGlmIChwcmkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHRGdW5jKGVkZ2UpO1xuICAgICAgaWYgKGVkZ2VXZWlnaHQgPCBwcmkpIHtcbiAgICAgICAgcGFyZW50c1t3XSA9IHY7XG4gICAgICAgIHBxLmRlY3JlYXNlKHcsIGVkZ2VXZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChnLm5vZGVDb3VudCgpID09PSAwKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF8uZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBwcS5hZGQodiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICByZXN1bHQuc2V0Tm9kZSh2KTtcbiAgfSk7XG5cbiAgLy8gU3RhcnQgZnJvbSBhbiBhcmJpdHJhcnkgbm9kZVxuICBwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sIDApO1xuXG4gIHZhciBpbml0ID0gZmFsc2U7XG4gIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7XG4gICAgdiA9IHBxLnJlbW92ZU1pbigpO1xuICAgIGlmIChfLmhhcyhwYXJlbnRzLCB2KSkge1xuICAgICAgcmVzdWx0LnNldEVkZ2UodiwgcGFyZW50c1t2XSk7XG4gICAgfSBlbHNlIGlmIChpbml0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiBcIiArIGcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbml0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIm1vZHVsZS5leHBvcnRzID0ge1xuICBjb21wb25lbnRzOiByZXF1aXJlKFwiLi9jb21wb25lbnRzXCIpLFxuICBkaWprc3RyYTogcmVxdWlyZShcIi4vZGlqa3N0cmFcIiksXG4gIGRpamtzdHJhQWxsOiByZXF1aXJlKFwiLi9kaWprc3RyYS1hbGxcIiksXG4gIGZpbmRDeWNsZXM6IHJlcXVpcmUoXCIuL2ZpbmQtY3ljbGVzXCIpLFxuICBmbG95ZFdhcnNoYWxsOiByZXF1aXJlKFwiLi9mbG95ZC13YXJzaGFsbFwiKSxcbiAgaXNBY3ljbGljOiByZXF1aXJlKFwiLi9pcy1hY3ljbGljXCIpLFxuICBwb3N0b3JkZXI6IHJlcXVpcmUoXCIuL3Bvc3RvcmRlclwiKSxcbiAgcHJlb3JkZXI6IHJlcXVpcmUoXCIuL3ByZW9yZGVyXCIpLFxuICBwcmltOiByZXF1aXJlKFwiLi9wcmltXCIpLFxuICB0YXJqYW46IHJlcXVpcmUoXCIuL3RhcmphblwiKSxcbiAgdG9wc29ydDogcmVxdWlyZShcIi4vdG9wc29ydFwiKVxufTtcbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgQ2hyaXMgUGV0dGl0dFxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxuICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbiAqIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XG4gKiBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBsaWIgPSByZXF1aXJlKFwiLi9saWJcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHcmFwaDogbGliLkdyYXBoLFxuICBqc29uOiByZXF1aXJlKFwiLi9saWIvanNvblwiKSxcbiAgYWxnOiByZXF1aXJlKFwiLi9saWIvYWxnXCIpLFxuICB2ZXJzaW9uOiBsaWIudmVyc2lvblxufTtcbiIsICIvKiBnbG9iYWwgd2luZG93ICovXG5cbnZhciBncmFwaGxpYjtcblxuaWYgKHR5cGVvZiByZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgdHJ5IHtcbiAgICBncmFwaGxpYiA9IHJlcXVpcmUoXCJncmFwaGxpYlwiKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxufVxuXG5pZiAoIWdyYXBobGliKSB7XG4gIGdyYXBobGliID0gd2luZG93LmdyYXBobGliO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdyYXBobGliO1xuIiwgInZhciBiYXNlQ2xvbmUgPSByZXF1aXJlKCcuL19iYXNlQ2xvbmUnKTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbnZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLFxuICAgIENMT05FX1NZTUJPTFNfRkxBRyA9IDQ7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICogQHNlZSBfLmNsb25lXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICpcbiAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lRGVlcDtcbiIsICJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJ1xuICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICkge1xuICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSXRlcmF0ZWVDYWxsO1xuIiwgInZhciBiYXNlUmVzdCA9IHJlcXVpcmUoJy4vX2Jhc2VSZXN0JyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0XG4gKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAqL1xudmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHtcbiAgICBsZW5ndGggPSAxO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgdmFyIHByb3BzSW5kZXggPSAtMTtcbiAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTtcbiAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcSh2YWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcbiIsICJ2YXIgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRmluZDtcbiIsICIvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbnZhciByZVdoaXRlc3BhY2UgPSAvXFxzLztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICovXG5mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSB7XG4gIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4LS0gJiYgcmVXaGl0ZXNwYWNlLnRlc3Qoc3RyaW5nLmNoYXJBdChpbmRleCkpKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJpbW1lZEVuZEluZGV4O1xuIiwgInZhciB0cmltbWVkRW5kSW5kZXggPSByZXF1aXJlKCcuL190cmltbWVkRW5kSW5kZXgnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50cmltYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYmFzZVRyaW0oc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmdcbiAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgIDogc3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VUcmltO1xuIiwgInZhciBiYXNlVHJpbSA9IHJlcXVpcmUoJy4vX2Jhc2VUcmltJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNTeW1ib2wgPSByZXF1aXJlKCcuL2lzU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSBiYXNlVHJpbSh2YWx1ZSk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwgInZhciB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9GaW5pdGU7XG4iLCAidmFyIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvSW50ZWdlcigzLjIpO1xuICogLy8gPT4gM1xuICpcbiAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gMFxuICpcbiAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0ludGVnZXIoJzMuMicpO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSxcbiAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSW50ZWdlcjtcbiIsICJ2YXIgYmFzZUZpbmRJbmRleCA9IHJlcXVpcmUoJy4vX2Jhc2VGaW5kSW5kZXgnKSxcbiAgICBiYXNlSXRlcmF0ZWUgPSByZXF1aXJlKCcuL19iYXNlSXRlcmF0ZWUnKSxcbiAgICB0b0ludGVnZXIgPSByZXF1aXJlKCcuL3RvSW50ZWdlcicpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMS4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAqIC8vID0+IDBcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAqIC8vID0+IDFcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IDJcbiAqL1xuZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApO1xuICB9XG4gIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgaW5kZXgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmRJbmRleDtcbiIsICJ2YXIgY3JlYXRlRmluZCA9IHJlcXVpcmUoJy4vX2NyZWF0ZUZpbmQnKSxcbiAgICBmaW5kSW5kZXggPSByZXF1aXJlKCcuL2ZpbmRJbmRleCcpO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICogXTtcbiAqXG4gKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAqL1xudmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZDtcbiIsICJ2YXIgYmFzZUZsYXR0ZW4gPSByZXF1aXJlKCcuL19iYXNlRmxhdHRlbicpO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuO1xuIiwgInZhciBiYXNlRm9yID0gcmVxdWlyZSgnLi9fYmFzZUZvcicpLFxuICAgIGNhc3RGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2Nhc3RGdW5jdGlvbicpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuXG4gKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQHNlZSBfLmZvckluUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgID8gb2JqZWN0XG4gICAgOiBiYXNlRm9yKG9iamVjdCwgY2FzdEZ1bmN0aW9uKGl0ZXJhdGVlKSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JJbjtcbiIsICIvKipcbiAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBBcnJheVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmxhc3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gbGFzdChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsYXN0O1xuIiwgInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBiYXNlRm9yT3duID0gcmVxdWlyZSgnLi9fYmFzZUZvck93bicpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICogQHNlZSBfLm1hcEtleXNcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0ge1xuICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAqIH07XG4gKlxuICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBWYWx1ZXM7XG4iLCAidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgKSkge1xuICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRXh0cmVtdW07XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPiBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR3Q7XG4iLCAidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VHdCA9IHJlcXVpcmUoJy4vX2Jhc2VHdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5tYXgoWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDhcbiAqXG4gKiBfLm1heChbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWF4KGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1heDtcbiIsICJ2YXIgYmFzZUFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYmFzZUFzc2lnblZhbHVlJyksXG4gICAgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICovXG5mdW5jdGlvbiBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzaWduTWVyZ2VWYWx1ZTtcbiIsICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsICIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgLCB1bmxlc3MgYGtleWAgaXMgXCJfX3Byb3RvX19cIiBvciBcImNvbnN0cnVjdG9yXCIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7XG4gIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlR2V0O1xuIiwgInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwgInZhciBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGNsb25lQnVmZmVyID0gcmVxdWlyZSgnLi9fY2xvbmVCdWZmZXInKSxcbiAgICBjbG9uZVR5cGVkQXJyYXkgPSByZXF1aXJlKCcuL19jbG9uZVR5cGVkQXJyYXknKSxcbiAgICBjb3B5QXJyYXkgPSByZXF1aXJlKCcuL19jb3B5QXJyYXknKSxcbiAgICBpbml0Q2xvbmVPYmplY3QgPSByZXF1aXJlKCcuL19pbml0Q2xvbmVPYmplY3QnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNBcnJheUxpa2VPYmplY3QgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlT2JqZWN0JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCcuL2lzUGxhaW5PYmplY3QnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0JyksXG4gICAgdG9QbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vdG9QbGFpbk9iamVjdCcpO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gKiBkZWVwIG1lcmdlcyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIG1lcmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICBzcmNWYWx1ZSA9IHNhZmVHZXQoc291cmNlLCBrZXkpLFxuICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgaWYgKHN0YWNrZWQpIHtcbiAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICA6IHVuZGVmaW5lZDtcblxuICB2YXIgaXNDb21tb24gPSBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gIGlmIChpc0NvbW1vbikge1xuICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXIoc3JjVmFsdWUpLFxuICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7XG4gICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICBpZiAoaXNBcmd1bWVudHMob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICghaXNPYmplY3Qob2JqVmFsdWUpIHx8IGlzRnVuY3Rpb24ob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNDb21tb24pIHtcbiAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gIH1cbiAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VNZXJnZURlZXA7XG4iLCAidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCAidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCAidmFyIGJhc2VNZXJnZSA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZScpLFxuICAgIGNyZWF0ZUFzc2lnbmVyID0gcmVxdWlyZSgnLi9fY3JlYXRlQXNzaWduZXInKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmVcbiAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudFxuICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuNS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7XG4gKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dXG4gKiB9O1xuICpcbiAqIHZhciBvdGhlciA9IHtcbiAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAqIH07XG4gKlxuICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAqL1xudmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2U7XG4iLCAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTHQ7XG4iLCAidmFyIGJhc2VFeHRyZW11bSA9IHJlcXVpcmUoJy4vX2Jhc2VFeHRyZW11bScpLFxuICAgIGJhc2VMdCA9IHJlcXVpcmUoJy4vX2Jhc2VMdCcpLFxuICAgIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLm1pbihbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbjtcbiIsICJ2YXIgYmFzZUV4dHJlbXVtID0gcmVxdWlyZSgnLi9fYmFzZUV4dHJlbXVtJyksXG4gICAgYmFzZUl0ZXJhdGVlID0gcmVxdWlyZSgnLi9fYmFzZUl0ZXJhdGVlJyksXG4gICAgYmFzZUx0ID0gcmVxdWlyZSgnLi9fYmFzZUx0Jyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICogdGhlIHZhbHVlIGlzIHJhbmtlZC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gKlxuICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICogLy8gPT4geyAnbic6IDEgfVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICogLy8gPT4geyAnbic6IDEgfVxuICovXG5mdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMiksIGJhc2VMdClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtaW5CeTtcbiIsICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3c7XG4iLCAidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsXG4gICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLFxuICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgdmFyIG9ialZhbHVlID0gbmVzdGVkW2tleV07XG4gICAgICBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKG9ialZhbHVlLCBrZXksIG5lc3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IGlzT2JqZWN0KG9ialZhbHVlKVxuICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXQ7XG4iLCAidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0JyksXG4gICAgYmFzZVNldCA9IHJlcXVpcmUoJy4vX2Jhc2VTZXQnKSxcbiAgICBjYXN0UGF0aCA9IHJlcXVpcmUoJy4vX2Nhc3RQYXRoJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VQaWNrQnk7XG4iLCAidmFyIGJhc2VQaWNrQnkgPSByZXF1aXJlKCcuL19iYXNlUGlja0J5JyksXG4gICAgaGFzSW4gPSByZXF1aXJlKCcuL2hhc0luJyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykge1xuICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgIHJldHVybiBoYXNJbihvYmplY3QsIHBhdGgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUGljaztcbiIsICJ2YXIgZmxhdHRlbiA9IHJlcXVpcmUoJy4vZmxhdHRlbicpLFxuICAgIG92ZXJSZXN0ID0gcmVxdWlyZSgnLi9fb3ZlclJlc3QnKSxcbiAgICBzZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX3NldFRvU3RyaW5nJyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gZmxhdFJlc3QoZnVuYykge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuKSwgZnVuYyArICcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0UmVzdDtcbiIsICJ2YXIgYmFzZVBpY2sgPSByZXF1aXJlKCcuL19iYXNlUGljaycpLFxuICAgIGZsYXRSZXN0ID0gcmVxdWlyZSgnLi9fZmxhdFJlc3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBpY2s7XG4iLCAiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gKiBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHN0ZXA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmFuZ2U7XG4iLCAidmFyIGJhc2VSYW5nZSA9IHJlcXVpcmUoJy4vX2Jhc2VSYW5nZScpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKSxcbiAgICB0b0Zpbml0ZSA9IHJlcXVpcmUoJy4vdG9GaW5pdGUnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdGFydCwgZW5kLCBzdGVwKSkge1xuICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gRW5zdXJlIHRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICBzdGFydCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgfVxuICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgcmV0dXJuIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVJhbmdlO1xuIiwgInZhciBjcmVhdGVSYW5nZSA9IHJlcXVpcmUoJy4vX2NyZWF0ZVJhbmdlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAqXG4gKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlKDQpO1xuICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gKlxuICogXy5yYW5nZSgtNCk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDUpO1xuICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICpcbiAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlKDApO1xuICogLy8gPT4gW11cbiAqL1xudmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZTtcbiIsICIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTb3J0Qnk7XG4iLCAidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKipcbiAqIENvbXBhcmVzIHZhbHVlcyB0byBzb3J0IHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgdmFyIHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XG5cbiAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgIG90aElzUmVmbGV4aXZlID0gb3RoZXIgPT09IG90aGVyLFxuICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XG4gICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcbiAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUFzY2VuZGluZztcbiIsICJ2YXIgY29tcGFyZUFzY2VuZGluZyA9IHJlcXVpcmUoJy4vX2NvbXBhcmVBc2NlbmRpbmcnKTtcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLm9yZGVyQnlgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICpcbiAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsXG4gKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICB9XG4gIH1cbiAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTXVsdGlwbGU7XG4iLCAidmFyIGFycmF5TWFwID0gcmVxdWlyZSgnLi9fYXJyYXlNYXAnKSxcbiAgICBiYXNlR2V0ID0gcmVxdWlyZSgnLi9fYmFzZUdldCcpLFxuICAgIGJhc2VJdGVyYXRlZSA9IHJlcXVpcmUoJy4vX2Jhc2VJdGVyYXRlZScpLFxuICAgIGJhc2VNYXAgPSByZXF1aXJlKCcuL19iYXNlTWFwJyksXG4gICAgYmFzZVNvcnRCeSA9IHJlcXVpcmUoJy4vX2Jhc2VTb3J0QnknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBjb21wYXJlTXVsdGlwbGUgPSByZXF1aXJlKCcuL19jb21wYXJlTXVsdGlwbGUnKSxcbiAgICBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gaXRlcmF0ZWVzIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7XG4gICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBiYXNlR2V0KHZhbHVlLCBpdGVyYXRlZS5sZW5ndGggPT09IDEgPyBpdGVyYXRlZVswXSA6IGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGVlO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJhdGVlcyA9IFtpZGVudGl0eV07XG4gIH1cblxuICB2YXIgaW5kZXggPSAtMTtcbiAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoYmFzZUl0ZXJhdGVlKSk7XG5cbiAgdmFyIHJlc3VsdCA9IGJhc2VNYXAoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHZhciBjcml0ZXJpYSA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gIH0pO1xuXG4gIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikge1xuICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU9yZGVyQnk7XG4iLCAidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKSxcbiAgICBiYXNlT3JkZXJCeSA9IHJlcXVpcmUoJy4vX2Jhc2VPcmRlckJ5JyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzSXRlcmF0ZWVDYWxsID0gcmVxdWlyZSgnLi9faXNJdGVyYXRlZUNhbGwnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICogcGVyZm9ybXMgYSBzdGFibGUgc29ydCwgdGhhdCBpcywgaXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBzb3J0IG9yZGVyIG9mXG4gKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiAzMCB9LFxuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gKiBdO1xuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNl0sIFsnYmFybmV5JywgMzRdLCBbJ2ZyZWQnLCA0OF0sIFsnZnJlZCcsIDMwXV1cbiAqXG4gKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDMwXSwgWydmcmVkJywgNDhdXVxuICovXG52YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7XG4gIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtdO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA+IDIgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0sIGl0ZXJhdGVlc1syXSkpIHtcbiAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgfVxuICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4oaXRlcmF0ZWVzLCAxKSwgW10pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydEJ5O1xuIiwgInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4vdG9TdHJpbmcnKTtcblxuLyoqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy4gKi9cbnZhciBpZENvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gKlxuICogXy51bmlxdWVJZCgpO1xuICogLy8gPT4gJzEwNSdcbiAqL1xuZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVuaXF1ZUlkO1xuIiwgIi8qKlxuICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IHt9O1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gaW5kZXggPCB2YWxzTGVuZ3RoID8gdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlWmlwT2JqZWN0O1xuIiwgInZhciBhc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Fzc2lnblZhbHVlJyksXG4gICAgYmFzZVppcE9iamVjdCA9IHJlcXVpcmUoJy4vX2Jhc2VaaXBPYmplY3QnKTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZyb21QYWlyc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyB0d28gYXJyYXlzLFxuICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjQuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnppcE9iamVjdChbJ2EnLCAnYiddLCBbMSwgMl0pO1xuICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gKi9cbmZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB6aXBPYmplY3Q7XG4iLCAiLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgbG9kYXNoO1xuXG5pZiAodHlwZW9mIHJlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuICB0cnkge1xuICAgIGxvZGFzaCA9IHtcbiAgICAgIGNsb25lRGVlcDogcmVxdWlyZShcImxvZGFzaC9jbG9uZURlZXBcIiksXG4gICAgICBjb25zdGFudDogcmVxdWlyZShcImxvZGFzaC9jb25zdGFudFwiKSxcbiAgICAgIGRlZmF1bHRzOiByZXF1aXJlKFwibG9kYXNoL2RlZmF1bHRzXCIpLFxuICAgICAgZWFjaDogcmVxdWlyZShcImxvZGFzaC9lYWNoXCIpLFxuICAgICAgZmlsdGVyOiByZXF1aXJlKFwibG9kYXNoL2ZpbHRlclwiKSxcbiAgICAgIGZpbmQ6IHJlcXVpcmUoXCJsb2Rhc2gvZmluZFwiKSxcbiAgICAgIGZsYXR0ZW46IHJlcXVpcmUoXCJsb2Rhc2gvZmxhdHRlblwiKSxcbiAgICAgIGZvckVhY2g6IHJlcXVpcmUoXCJsb2Rhc2gvZm9yRWFjaFwiKSxcbiAgICAgIGZvckluOiByZXF1aXJlKFwibG9kYXNoL2ZvckluXCIpLFxuICAgICAgaGFzOiAgcmVxdWlyZShcImxvZGFzaC9oYXNcIiksXG4gICAgICBpc1VuZGVmaW5lZDogcmVxdWlyZShcImxvZGFzaC9pc1VuZGVmaW5lZFwiKSxcbiAgICAgIGxhc3Q6IHJlcXVpcmUoXCJsb2Rhc2gvbGFzdFwiKSxcbiAgICAgIG1hcDogcmVxdWlyZShcImxvZGFzaC9tYXBcIiksXG4gICAgICBtYXBWYWx1ZXM6IHJlcXVpcmUoXCJsb2Rhc2gvbWFwVmFsdWVzXCIpLFxuICAgICAgbWF4OiByZXF1aXJlKFwibG9kYXNoL21heFwiKSxcbiAgICAgIG1lcmdlOiByZXF1aXJlKFwibG9kYXNoL21lcmdlXCIpLFxuICAgICAgbWluOiByZXF1aXJlKFwibG9kYXNoL21pblwiKSxcbiAgICAgIG1pbkJ5OiByZXF1aXJlKFwibG9kYXNoL21pbkJ5XCIpLFxuICAgICAgbm93OiByZXF1aXJlKFwibG9kYXNoL25vd1wiKSxcbiAgICAgIHBpY2s6IHJlcXVpcmUoXCJsb2Rhc2gvcGlja1wiKSxcbiAgICAgIHJhbmdlOiByZXF1aXJlKFwibG9kYXNoL3JhbmdlXCIpLFxuICAgICAgcmVkdWNlOiByZXF1aXJlKFwibG9kYXNoL3JlZHVjZVwiKSxcbiAgICAgIHNvcnRCeTogcmVxdWlyZShcImxvZGFzaC9zb3J0QnlcIiksXG4gICAgICB1bmlxdWVJZDogcmVxdWlyZShcImxvZGFzaC91bmlxdWVJZFwiKSxcbiAgICAgIHZhbHVlczogcmVxdWlyZShcImxvZGFzaC92YWx1ZXNcIiksXG4gICAgICB6aXBPYmplY3Q6IHJlcXVpcmUoXCJsb2Rhc2gvemlwT2JqZWN0XCIpLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gIH1cbn1cblxuaWYgKCFsb2Rhc2gpIHtcbiAgbG9kYXNoID0gd2luZG93Ll87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbG9kYXNoO1xuIiwgIi8qXG4gKiBTaW1wbGUgZG91Ymx5IGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBDb3JtZW4sIGV0IGFsLixcbiAqIFwiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXNcIi5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3Q7XG5cbmZ1bmN0aW9uIExpc3QoKSB7XG4gIHZhciBzZW50aW5lbCA9IHt9O1xuICBzZW50aW5lbC5fbmV4dCA9IHNlbnRpbmVsLl9wcmV2ID0gc2VudGluZWw7XG4gIHRoaXMuX3NlbnRpbmVsID0gc2VudGluZWw7XG59XG5cbkxpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2O1xuICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbkxpc3QucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbihlbnRyeSkge1xuICB2YXIgc2VudGluZWwgPSB0aGlzLl9zZW50aW5lbDtcbiAgaWYgKGVudHJ5Ll9wcmV2ICYmIGVudHJ5Ll9uZXh0KSB7XG4gICAgdW5saW5rKGVudHJ5KTtcbiAgfVxuICBlbnRyeS5fbmV4dCA9IHNlbnRpbmVsLl9uZXh0O1xuICBzZW50aW5lbC5fbmV4dC5fcHJldiA9IGVudHJ5O1xuICBzZW50aW5lbC5fbmV4dCA9IGVudHJ5O1xuICBlbnRyeS5fcHJldiA9IHNlbnRpbmVsO1xufTtcblxuTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0cnMgPSBbXTtcbiAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7XG4gIHZhciBjdXJyID0gc2VudGluZWwuX3ByZXY7XG4gIHdoaWxlIChjdXJyICE9PSBzZW50aW5lbCkge1xuICAgIHN0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLCBmaWx0ZXJPdXRMaW5rcykpO1xuICAgIGN1cnIgPSBjdXJyLl9wcmV2O1xuICB9XG4gIHJldHVybiBcIltcIiArIHN0cnMuam9pbihcIiwgXCIpICsgXCJdXCI7XG59O1xuXG5mdW5jdGlvbiB1bmxpbmsoZW50cnkpIHtcbiAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDtcbiAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjtcbiAgZGVsZXRlIGVudHJ5Ll9uZXh0O1xuICBkZWxldGUgZW50cnkuX3ByZXY7XG59XG5cbmZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssIHYpIHtcbiAgaWYgKGsgIT09IFwiX25leHRcIiAmJiBrICE9PSBcIl9wcmV2XCIpIHtcbiAgICByZXR1cm4gdjtcbiAgfVxufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4vZ3JhcGhsaWJcIikuR3JhcGg7XG52YXIgTGlzdCA9IHJlcXVpcmUoXCIuL2RhdGEvbGlzdFwiKTtcblxuLypcbiAqIEEgZ3JlZWR5IGhldXJpc3RpYyBmb3IgZmluZGluZyBhIGZlZWRiYWNrIGFyYyBzZXQgZm9yIGEgZ3JhcGguIEEgZmVlZGJhY2tcbiAqIGFyYyBzZXQgaXMgYSBzZXQgb2YgZWRnZXMgdGhhdCBjYW4gYmUgcmVtb3ZlZCB0byBtYWtlIGEgZ3JhcGggYWN5Y2xpYy5cbiAqIFRoZSBhbGdvcml0aG0gY29tZXMgZnJvbTogUC4gRWFkZXMsIFguIExpbiwgYW5kIFcuIEYuIFNteXRoLCBcIkEgZmFzdCBhbmRcbiAqIGVmZmVjdGl2ZSBoZXVyaXN0aWMgZm9yIHRoZSBmZWVkYmFjayBhcmMgc2V0IHByb2JsZW0uXCIgVGhpcyBpbXBsZW1lbnRhdGlvblxuICogYWRqdXN0cyB0aGF0IGZyb20gdGhlIHBhcGVyIHRvIGFsbG93IGZvciB3ZWlnaHRlZCBlZGdlcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBncmVlZHlGQVM7XG5cbnZhciBERUZBVUxUX1dFSUdIVF9GTiA9IF8uY29uc3RhbnQoMSk7XG5cbmZ1bmN0aW9uIGdyZWVkeUZBUyhnLCB3ZWlnaHRGbikge1xuICBpZiAoZy5ub2RlQ291bnQoKSA8PSAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHZhciBzdGF0ZSA9IGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4gfHwgREVGQVVMVF9XRUlHSFRfRk4pO1xuICB2YXIgcmVzdWx0cyA9IGRvR3JlZWR5RkFTKHN0YXRlLmdyYXBoLCBzdGF0ZS5idWNrZXRzLCBzdGF0ZS56ZXJvSWR4KTtcblxuICAvLyBFeHBhbmQgbXVsdGktZWRnZXNcbiAgcmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLCBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIGcub3V0RWRnZXMoZS52LCBlLncpO1xuICB9KSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsIGJ1Y2tldHMsIHplcm9JZHgpIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHNvdXJjZXMgPSBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV07XG4gIHZhciBzaW5rcyA9IGJ1Y2tldHNbMF07XG5cbiAgdmFyIGVudHJ5O1xuICB3aGlsZSAoZy5ub2RlQ291bnQoKSkge1xuICAgIHdoaWxlICgoZW50cnkgPSBzaW5rcy5kZXF1ZXVlKCkpKSAgIHsgcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSk7IH1cbiAgICB3aGlsZSAoKGVudHJ5ID0gc291cmNlcy5kZXF1ZXVlKCkpKSB7IHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnkpOyB9XG4gICAgaWYgKGcubm9kZUNvdW50KCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSBidWNrZXRzLmxlbmd0aCAtIDI7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgZW50cnkgPSBidWNrZXRzW2ldLmRlcXVldWUoKTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZywgYnVja2V0cywgemVyb0lkeCwgZW50cnksIHRydWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCBjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gIHZhciByZXN1bHRzID0gY29sbGVjdFByZWRlY2Vzc29ycyA/IFtdIDogdW5kZWZpbmVkO1xuXG4gIF8uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB1RW50cnkgPSBnLm5vZGUoZWRnZS52KTtcblxuICAgIGlmIChjb2xsZWN0UHJlZGVjZXNzb3JzKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyB2OiBlZGdlLnYsIHc6IGVkZ2UudyB9KTtcbiAgICB9XG5cbiAgICB1RW50cnkub3V0IC09IHdlaWdodDtcbiAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgdUVudHJ5KTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcub3V0RWRnZXMoZW50cnkudiksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICB2YXIgd2VpZ2h0ID0gZy5lZGdlKGVkZ2UpO1xuICAgIHZhciB3ID0gZWRnZS53O1xuICAgIHZhciB3RW50cnkgPSBnLm5vZGUodyk7XG4gICAgd0VudHJ5W1wiaW5cIl0gLT0gd2VpZ2h0O1xuICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCB3RW50cnkpO1xuICB9KTtcblxuICBnLnJlbW92ZU5vZGUoZW50cnkudik7XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4pIHtcbiAgdmFyIGZhc0dyYXBoID0gbmV3IEdyYXBoKCk7XG4gIHZhciBtYXhJbiA9IDA7XG4gIHZhciBtYXhPdXQgPSAwO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBmYXNHcmFwaC5zZXROb2RlKHYsIHsgdjogdiwgXCJpblwiOiAwLCBvdXQ6IDAgfSk7XG4gIH0pO1xuXG4gIC8vIEFnZ3JlZ2F0ZSB3ZWlnaHRzIG9uIG5vZGVzLCBidXQgYWxzbyBzdW0gdGhlIHdlaWdodHMgYWNyb3NzIG11bHRpLWVkZ2VzXG4gIC8vIGludG8gYSBzaW5nbGUgZWRnZSBmb3IgdGhlIGZhc0dyYXBoLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIHByZXZXZWlnaHQgPSBmYXNHcmFwaC5lZGdlKGUudiwgZS53KSB8fCAwO1xuICAgIHZhciB3ZWlnaHQgPSB3ZWlnaHRGbihlKTtcbiAgICB2YXIgZWRnZVdlaWdodCA9IHByZXZXZWlnaHQgKyB3ZWlnaHQ7XG4gICAgZmFzR3JhcGguc2V0RWRnZShlLnYsIGUudywgZWRnZVdlaWdodCk7XG4gICAgbWF4T3V0ID0gTWF0aC5tYXgobWF4T3V0LCBmYXNHcmFwaC5ub2RlKGUudikub3V0ICs9IHdlaWdodCk7XG4gICAgbWF4SW4gID0gTWF0aC5tYXgobWF4SW4sICBmYXNHcmFwaC5ub2RlKGUudylbXCJpblwiXSAgKz0gd2VpZ2h0KTtcbiAgfSk7XG5cbiAgdmFyIGJ1Y2tldHMgPSBfLnJhbmdlKG1heE91dCArIG1heEluICsgMykubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IExpc3QoKTsgfSk7XG4gIHZhciB6ZXJvSWR4ID0gbWF4SW4gKyAxO1xuXG4gIF8uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGZhc0dyYXBoLm5vZGUodikpO1xuICB9KTtcblxuICByZXR1cm4geyBncmFwaDogZmFzR3JhcGgsIGJ1Y2tldHM6IGJ1Y2tldHMsIHplcm9JZHg6IHplcm9JZHggfTtcbn1cblxuZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KSB7XG4gIGlmICghZW50cnkub3V0KSB7XG4gICAgYnVja2V0c1swXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIGlmICghZW50cnlbXCJpblwiXSkge1xuICAgIGJ1Y2tldHNbYnVja2V0cy5sZW5ndGggLSAxXS5lbnF1ZXVlKGVudHJ5KTtcbiAgfSBlbHNlIHtcbiAgICBidWNrZXRzW2VudHJ5Lm91dCAtIGVudHJ5W1wiaW5cIl0gKyB6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KTtcbiAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBncmVlZHlGQVMgPSByZXF1aXJlKFwiLi9ncmVlZHktZmFzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcnVuOiBydW4sXG4gIHVuZG86IHVuZG9cbn07XG5cbmZ1bmN0aW9uIHJ1bihnKSB7XG4gIHZhciBmYXMgPSAoZy5ncmFwaCgpLmFjeWNsaWNlciA9PT0gXCJncmVlZHlcIlxuICAgID8gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKGcpKVxuICAgIDogZGZzRkFTKGcpKTtcbiAgXy5mb3JFYWNoKGZhcywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTtcbiAgICBnLnJlbW92ZUVkZ2UoZSk7XG4gICAgbGFiZWwuZm9yd2FyZE5hbWUgPSBlLm5hbWU7XG4gICAgbGFiZWwucmV2ZXJzZWQgPSB0cnVlO1xuICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIF8udW5pcXVlSWQoXCJyZXZcIikpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3ZWlnaHRGbihnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGZzRkFTKGcpIHtcbiAgdmFyIGZhcyA9IFtdO1xuICB2YXIgc3RhY2sgPSB7fTtcbiAgdmFyIHZpc2l0ZWQgPSB7fTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2aXNpdGVkW3ZdID0gdHJ1ZTtcbiAgICBzdGFja1t2XSA9IHRydWU7XG4gICAgXy5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChfLmhhcyhzdGFjaywgZS53KSkge1xuICAgICAgICBmYXMucHVzaChlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRmcyhlLncpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRlbGV0ZSBzdGFja1t2XTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGRmcyk7XG4gIHJldHVybiBmYXM7XG59XG5cbmZ1bmN0aW9uIHVuZG8oZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpO1xuICAgIGlmIChsYWJlbC5yZXZlcnNlZCkge1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuXG4gICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDtcbiAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtcbiAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTtcbiAgICB9XG4gIH0pO1xufVxuIiwgIi8qIGVzbGludCBcIm5vLWNvbnNvbGVcIjogb2ZmICovXG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBHcmFwaCA9IHJlcXVpcmUoXCIuL2dyYXBobGliXCIpLkdyYXBoO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWRkRHVtbXlOb2RlOiBhZGREdW1teU5vZGUsXG4gIHNpbXBsaWZ5OiBzaW1wbGlmeSxcbiAgYXNOb25Db21wb3VuZEdyYXBoOiBhc05vbkNvbXBvdW5kR3JhcGgsXG4gIHN1Y2Nlc3NvcldlaWdodHM6IHN1Y2Nlc3NvcldlaWdodHMsXG4gIHByZWRlY2Vzc29yV2VpZ2h0czogcHJlZGVjZXNzb3JXZWlnaHRzLFxuICBpbnRlcnNlY3RSZWN0OiBpbnRlcnNlY3RSZWN0LFxuICBidWlsZExheWVyTWF0cml4OiBidWlsZExheWVyTWF0cml4LFxuICBub3JtYWxpemVSYW5rczogbm9ybWFsaXplUmFua3MsXG4gIHJlbW92ZUVtcHR5UmFua3M6IHJlbW92ZUVtcHR5UmFua3MsXG4gIGFkZEJvcmRlck5vZGU6IGFkZEJvcmRlck5vZGUsXG4gIG1heFJhbms6IG1heFJhbmssXG4gIHBhcnRpdGlvbjogcGFydGl0aW9uLFxuICB0aW1lOiB0aW1lLFxuICBub3RpbWU6IG5vdGltZVxufTtcblxuLypcbiAqIEFkZHMgYSBkdW1teSBub2RlIHRvIHRoZSBncmFwaCBhbmQgcmV0dXJuIHYuXG4gKi9cbmZ1bmN0aW9uIGFkZER1bW15Tm9kZShnLCB0eXBlLCBhdHRycywgbmFtZSkge1xuICB2YXIgdjtcbiAgZG8ge1xuICAgIHYgPSBfLnVuaXF1ZUlkKG5hbWUpO1xuICB9IHdoaWxlIChnLmhhc05vZGUodikpO1xuXG4gIGF0dHJzLmR1bW15ID0gdHlwZTtcbiAgZy5zZXROb2RlKHYsIGF0dHJzKTtcbiAgcmV0dXJuIHY7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGEgbmV3IGdyYXBoIHdpdGggb25seSBzaW1wbGUgZWRnZXMuIEhhbmRsZXMgYWdncmVnYXRpb24gb2YgZGF0YVxuICogYXNzb2NpYXRlZCB3aXRoIG11bHRpLWVkZ2VzLlxuICovXG5mdW5jdGlvbiBzaW1wbGlmeShnKSB7XG4gIHZhciBzaW1wbGlmaWVkID0gbmV3IEdyYXBoKCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzaW1wbGlmaWVkLnNldE5vZGUodiwgZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgc2ltcGxlTGFiZWwgPSBzaW1wbGlmaWVkLmVkZ2UoZS52LCBlLncpIHx8IHsgd2VpZ2h0OiAwLCBtaW5sZW46IDEgfTtcbiAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7XG4gICAgc2ltcGxpZmllZC5zZXRFZGdlKGUudiwgZS53LCB7XG4gICAgICB3ZWlnaHQ6IHNpbXBsZUxhYmVsLndlaWdodCArIGxhYmVsLndlaWdodCxcbiAgICAgIG1pbmxlbjogTWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLCBsYWJlbC5taW5sZW4pXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gc2ltcGxpZmllZDtcbn1cblxuZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpIHtcbiAgdmFyIHNpbXBsaWZpZWQgPSBuZXcgR3JhcGgoeyBtdWx0aWdyYXBoOiBnLmlzTXVsdGlncmFwaCgpIH0pLnNldEdyYXBoKGcuZ3JhcGgoKSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoIWcuY2hpbGRyZW4odikubGVuZ3RoKSB7XG4gICAgICBzaW1wbGlmaWVkLnNldE5vZGUodiwgZy5ub2RlKHYpKTtcbiAgICB9XG4gIH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgc2ltcGxpZmllZC5zZXRFZGdlKGUsIGcuZWRnZShlKSk7XG4gIH0pO1xuICByZXR1cm4gc2ltcGxpZmllZDtcbn1cblxuZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKSB7XG4gIHZhciB3ZWlnaHRNYXAgPSBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgc3VjcyA9IHt9O1xuICAgIF8uZm9yRWFjaChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBzdWNzW2Uud10gPSAoc3Vjc1tlLnddIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDtcbiAgICB9KTtcbiAgICByZXR1cm4gc3VjcztcbiAgfSk7XG4gIHJldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksIHdlaWdodE1hcCk7XG59XG5cbmZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKSB7XG4gIHZhciB3ZWlnaHRNYXAgPSBfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcHJlZHMgPSB7fTtcbiAgICBfLmZvckVhY2goZy5pbkVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICBwcmVkc1tlLnZdID0gKHByZWRzW2Uudl0gfHwgMCkgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICAgIH0pO1xuICAgIHJldHVybiBwcmVkcztcbiAgfSk7XG4gIHJldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksIHdlaWdodE1hcCk7XG59XG5cbi8qXG4gKiBGaW5kcyB3aGVyZSBhIGxpbmUgc3RhcnRpbmcgYXQgcG9pbnQgKHt4LCB5fSkgd291bGQgaW50ZXJzZWN0IGEgcmVjdGFuZ2xlXG4gKiAoe3gsIHksIHdpZHRoLCBoZWlnaHR9KSBpZiBpdCB3ZXJlIHBvaW50aW5nIGF0IHRoZSByZWN0YW5nbGUncyBjZW50ZXIuXG4gKi9cbmZ1bmN0aW9uIGludGVyc2VjdFJlY3QocmVjdCwgcG9pbnQpIHtcbiAgdmFyIHggPSByZWN0Lng7XG4gIHZhciB5ID0gcmVjdC55O1xuXG4gIC8vIFJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gYWxnb3JpdGhtIGZyb206XG4gIC8vIGh0dHA6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMDgxMTMvZmluZC1lZGdlLWJldHdlZW4tdHdvLWJveGVzXG4gIHZhciBkeCA9IHBvaW50LnggLSB4O1xuICB2YXIgZHkgPSBwb2ludC55IC0geTtcbiAgdmFyIHcgPSByZWN0LndpZHRoIC8gMjtcbiAgdmFyIGggPSByZWN0LmhlaWdodCAvIDI7XG5cbiAgaWYgKCFkeCAmJiAhZHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGVcIik7XG4gIH1cblxuICB2YXIgc3gsIHN5O1xuICBpZiAoTWF0aC5hYnMoZHkpICogdyA+IE1hdGguYWJzKGR4KSAqIGgpIHtcbiAgICAvLyBJbnRlcnNlY3Rpb24gaXMgdG9wIG9yIGJvdHRvbSBvZiByZWN0LlxuICAgIGlmIChkeSA8IDApIHtcbiAgICAgIGggPSAtaDtcbiAgICB9XG4gICAgc3ggPSBoICogZHggLyBkeTtcbiAgICBzeSA9IGg7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW50ZXJzZWN0aW9uIGlzIGxlZnQgb3IgcmlnaHQgb2YgcmVjdC5cbiAgICBpZiAoZHggPCAwKSB7XG4gICAgICB3ID0gLXc7XG4gICAgfVxuICAgIHN4ID0gdztcbiAgICBzeSA9IHcgKiBkeSAvIGR4O1xuICB9XG5cbiAgcmV0dXJuIHsgeDogeCArIHN4LCB5OiB5ICsgc3kgfTtcbn1cblxuLypcbiAqIEdpdmVuIGEgREFHIHdpdGggZWFjaCBub2RlIGFzc2lnbmVkIFwicmFua1wiIGFuZCBcIm9yZGVyXCIgcHJvcGVydGllcywgdGhpc1xuICogZnVuY3Rpb24gd2lsbCBwcm9kdWNlIGEgbWF0cml4IHdpdGggdGhlIGlkcyBvZiBlYWNoIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZykge1xuICB2YXIgbGF5ZXJpbmcgPSBfLm1hcChfLnJhbmdlKG1heFJhbmsoZykgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICB2YXIgcmFuayA9IG5vZGUucmFuaztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocmFuaykpIHtcbiAgICAgIGxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdID0gdjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGF5ZXJpbmc7XG59XG5cbi8qXG4gKiBBZGp1c3RzIHRoZSByYW5rcyBmb3IgYWxsIG5vZGVzIGluIHRoZSBncmFwaCBzdWNoIHRoYXQgYWxsIG5vZGVzIHYgaGF2ZVxuICogcmFuayh2KSA+PSAwIGFuZCBhdCBsZWFzdCBvbmUgbm9kZSB3IGhhcyByYW5rKHcpID0gMC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZykge1xuICB2YXIgbWluID0gXy5taW4oXy5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKF8uaGFzKG5vZGUsIFwicmFua1wiKSkge1xuICAgICAgbm9kZS5yYW5rIC09IG1pbjtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpIHtcbiAgLy8gUmFua3MgbWF5IG5vdCBzdGFydCBhdCAwLCBzbyB3ZSBuZWVkIHRvIG9mZnNldCB0aGVtXG4gIHZhciBvZmZzZXQgPSBfLm1pbihfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7XG5cbiAgdmFyIGxheWVycyA9IFtdO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuayAtIG9mZnNldDtcbiAgICBpZiAoIWxheWVyc1tyYW5rXSkge1xuICAgICAgbGF5ZXJzW3JhbmtdID0gW107XG4gICAgfVxuICAgIGxheWVyc1tyYW5rXS5wdXNoKHYpO1xuICB9KTtcblxuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgbm9kZVJhbmtGYWN0b3IgPSBnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKHZzLCBpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQodnMpICYmIGkgJSBub2RlUmFua0ZhY3RvciAhPT0gMCkge1xuICAgICAgLS1kZWx0YTtcbiAgICB9IGVsc2UgaWYgKGRlbHRhKSB7XG4gICAgICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHsgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7IH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZywgcHJlZml4LCByYW5rLCBvcmRlcikge1xuICB2YXIgbm9kZSA9IHtcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkge1xuICAgIG5vZGUucmFuayA9IHJhbms7XG4gICAgbm9kZS5vcmRlciA9IG9yZGVyO1xuICB9XG4gIHJldHVybiBhZGREdW1teU5vZGUoZywgXCJib3JkZXJcIiwgbm9kZSwgcHJlZml4KTtcbn1cblxuZnVuY3Rpb24gbWF4UmFuayhnKSB7XG4gIHJldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgcmFuayA9IGcubm9kZSh2KS5yYW5rO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChyYW5rKSkge1xuICAgICAgcmV0dXJuIHJhbms7XG4gICAgfVxuICB9KSk7XG59XG5cbi8qXG4gKiBQYXJ0aXRpb24gYSBjb2xsZWN0aW9uIGludG8gdHdvIGdyb3VwczogYGxoc2AgYW5kIGByaHNgLiBJZiB0aGUgc3VwcGxpZWRcbiAqIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW4gZW50cnkgaXQgZ29lcyBpbnRvIGBsaHNgLiBPdGhlcndpc2UgaXQgZ29lc1xuICogaW50byBgcmhzLlxuICovXG5mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbiwgZm4pIHtcbiAgdmFyIHJlc3VsdCA9IHsgbGhzOiBbXSwgcmhzOiBbXSB9O1xuICBfLmZvckVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpZiAoZm4odmFsdWUpKSB7XG4gICAgICByZXN1bHQubGhzLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucmhzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBSZXR1cm5zIGEgbmV3IGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZuYCB3aXRoIGEgdGltZXIuIFRoZSB3cmFwcGVyIGxvZ3MgdGhlXG4gKiB0aW1lIGl0IHRha2VzIHRvIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aW1lKG5hbWUsIGZuKSB7XG4gIHZhciBzdGFydCA9IF8ubm93KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY29uc29sZS5sb2cobmFtZSArIFwiIHRpbWU6IFwiICsgKF8ubm93KCkgLSBzdGFydCkgKyBcIm1zXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vdGltZShuYW1lLCBmbikge1xuICByZXR1cm4gZm4oKTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBydW46IHJ1bixcbiAgdW5kbzogdW5kb1xufTtcblxuLypcbiAqIEJyZWFrcyBhbnkgbG9uZyBlZGdlcyBpbiB0aGUgZ3JhcGggaW50byBzaG9ydCBzZWdtZW50cyB0aGF0IHNwYW4gMSBsYXllclxuICogZWFjaC4gVGhpcyBvcGVyYXRpb24gaXMgdW5kb2FibGUgd2l0aCB0aGUgZGVub3JtYWxpemUgZnVuY3Rpb24uXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gVGhlIGlucHV0IGdyYXBoIGlzIGEgREFHLlxuICogICAgMi4gRWFjaCBub2RlIGluIHRoZSBncmFwaCBoYXMgYSBcInJhbmtcIiBwcm9wZXJ0eS5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbjpcbiAqXG4gKiAgICAxLiBBbGwgZWRnZXMgaW4gdGhlIGdyYXBoIGhhdmUgYSBsZW5ndGggb2YgMS5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCB3aGVyZSBlZGdlcyBoYXZlIGJlZW4gc3BsaXQgaW50byBzZWdtZW50cy5cbiAqICAgIDMuIFRoZSBncmFwaCBpcyBhdWdtZW50ZWQgd2l0aCBhIFwiZHVtbXlDaGFpbnNcIiBhdHRyaWJ1dGUgd2hpY2ggY29udGFpbnNcbiAqICAgICAgIHRoZSBmaXJzdCBkdW1teSBpbiBlYWNoIGNoYWluIG9mIGR1bW15IG5vZGVzIHByb2R1Y2VkLlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICBnLmdyYXBoKCkuZHVtbXlDaGFpbnMgPSBbXTtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZWRnZSkgeyBub3JtYWxpemVFZGdlKGcsIGVkZ2UpOyB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLCBlKSB7XG4gIHZhciB2ID0gZS52O1xuICB2YXIgdlJhbmsgPSBnLm5vZGUodikucmFuaztcbiAgdmFyIHcgPSBlLnc7XG4gIHZhciB3UmFuayA9IGcubm9kZSh3KS5yYW5rO1xuICB2YXIgbmFtZSA9IGUubmFtZTtcbiAgdmFyIGVkZ2VMYWJlbCA9IGcuZWRnZShlKTtcbiAgdmFyIGxhYmVsUmFuayA9IGVkZ2VMYWJlbC5sYWJlbFJhbms7XG5cbiAgaWYgKHdSYW5rID09PSB2UmFuayArIDEpIHJldHVybjtcblxuICBnLnJlbW92ZUVkZ2UoZSk7XG5cbiAgdmFyIGR1bW15LCBhdHRycywgaTtcbiAgZm9yIChpID0gMCwgKyt2UmFuazsgdlJhbmsgPCB3UmFuazsgKytpLCArK3ZSYW5rKSB7XG4gICAgZWRnZUxhYmVsLnBvaW50cyA9IFtdO1xuICAgIGF0dHJzID0ge1xuICAgICAgd2lkdGg6IDAsIGhlaWdodDogMCxcbiAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLCBlZGdlT2JqOiBlLFxuICAgICAgcmFuazogdlJhbmtcbiAgICB9O1xuICAgIGR1bW15ID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlXCIsIGF0dHJzLCBcIl9kXCIpO1xuICAgIGlmICh2UmFuayA9PT0gbGFiZWxSYW5rKSB7XG4gICAgICBhdHRycy53aWR0aCA9IGVkZ2VMYWJlbC53aWR0aDtcbiAgICAgIGF0dHJzLmhlaWdodCA9IGVkZ2VMYWJlbC5oZWlnaHQ7XG4gICAgICBhdHRycy5kdW1teSA9IFwiZWRnZS1sYWJlbFwiO1xuICAgICAgYXR0cnMubGFiZWxwb3MgPSBlZGdlTGFiZWwubGFiZWxwb3M7XG4gICAgfVxuICAgIGcuc2V0RWRnZSh2LCBkdW1teSwgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIGcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTtcbiAgICB9XG4gICAgdiA9IGR1bW15O1xuICB9XG5cbiAgZy5zZXRFZGdlKHYsIHcsIHsgd2VpZ2h0OiBlZGdlTGFiZWwud2VpZ2h0IH0sIG5hbWUpO1xufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgXy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikge1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIHZhciBvcmlnTGFiZWwgPSBub2RlLmVkZ2VMYWJlbDtcbiAgICB2YXIgdztcbiAgICBnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLCBvcmlnTGFiZWwpO1xuICAgIHdoaWxlIChub2RlLmR1bW15KSB7XG4gICAgICB3ID0gZy5zdWNjZXNzb3JzKHYpWzBdO1xuICAgICAgZy5yZW1vdmVOb2RlKHYpO1xuICAgICAgb3JpZ0xhYmVsLnBvaW50cy5wdXNoKHsgeDogbm9kZS54LCB5OiBub2RlLnkgfSk7XG4gICAgICBpZiAobm9kZS5kdW1teSA9PT0gXCJlZGdlLWxhYmVsXCIpIHtcbiAgICAgICAgb3JpZ0xhYmVsLnggPSBub2RlLng7XG4gICAgICAgIG9yaWdMYWJlbC55ID0gbm9kZS55O1xuICAgICAgICBvcmlnTGFiZWwud2lkdGggPSBub2RlLndpZHRoO1xuICAgICAgICBvcmlnTGFiZWwuaGVpZ2h0ID0gbm9kZS5oZWlnaHQ7XG4gICAgICB9XG4gICAgICB2ID0gdztcbiAgICAgIG5vZGUgPSBnLm5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbG9uZ2VzdFBhdGg6IGxvbmdlc3RQYXRoLFxuICBzbGFjazogc2xhY2tcbn07XG5cbi8qXG4gKiBJbml0aWFsaXplcyByYW5rcyBmb3IgdGhlIGlucHV0IGdyYXBoIHVzaW5nIHRoZSBsb25nZXN0IHBhdGggYWxnb3JpdGhtLiBUaGlzXG4gKiBhbGdvcml0aG0gc2NhbGVzIHdlbGwgYW5kIGlzIGZhc3QgaW4gcHJhY3RpY2UsIGl0IHlpZWxkcyByYXRoZXIgcG9vclxuICogc29sdXRpb25zLiBOb2RlcyBhcmUgcHVzaGVkIHRvIHRoZSBsb3dlc3QgbGF5ZXIgcG9zc2libGUsIGxlYXZpbmcgdGhlIGJvdHRvbVxuICogcmFua3Mgd2lkZSBhbmQgbGVhdmluZyBlZGdlcyBsb25nZXIgdGhhbiBuZWNlc3NhcnkuIEhvd2V2ZXIsIGR1ZSB0byBpdHNcbiAqIHNwZWVkLCB0aGlzIGFsZ29yaXRobSBpcyBnb29kIGZvciBnZXR0aW5nIGFuIGluaXRpYWwgcmFua2luZyB0aGF0IGNhbiBiZSBmZWRcbiAqIGludG8gb3RoZXIgYWxnb3JpdGhtcy5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBkb2VzIG5vdCBub3JtYWxpemUgbGF5ZXJzIGJlY2F1c2UgaXQgd2lsbCBiZSB1c2VkIGJ5IG90aGVyXG4gKiBhbGdvcml0aG1zIGluIG1vc3QgY2FzZXMuIElmIHVzaW5nIHRoaXMgYWxnb3JpdGhtIGRpcmVjdGx5LCBiZSBzdXJlIHRvXG4gKiBydW4gbm9ybWFsaXplIGF0IHRoZSBlbmQuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gSW5wdXQgZ3JhcGggaXMgYSBEQUcuXG4gKiAgICAyLiBJbnB1dCBncmFwaCBub2RlIGxhYmVscyBjYW4gYmUgYXNzaWduZWQgcHJvcGVydGllcy5cbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gRWFjaCBub2RlIHdpbGwgYmUgYXNzaWduIGFuICh1bm5vcm1hbGl6ZWQpIFwicmFua1wiIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBsb25nZXN0UGF0aChnKSB7XG4gIHZhciB2aXNpdGVkID0ge307XG5cbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG4gICAgaWYgKF8uaGFzKHZpc2l0ZWQsIHYpKSB7XG4gICAgICByZXR1cm4gbGFiZWwucmFuaztcbiAgICB9XG4gICAgdmlzaXRlZFt2XSA9IHRydWU7XG5cbiAgICB2YXIgcmFuayA9IF8ubWluKF8ubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiBkZnMoZS53KSAtIGcuZWRnZShlKS5taW5sZW47XG4gICAgfSkpO1xuXG4gICAgaWYgKHJhbmsgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggM1xuICAgICAgICByYW5rID09PSB1bmRlZmluZWQgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDRcbiAgICAgICAgcmFuayA9PT0gbnVsbCkgeyAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW251bGxdKVxuICAgICAgcmFuayA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChsYWJlbC5yYW5rID0gcmFuayk7XG4gIH1cblxuICBfLmZvckVhY2goZy5zb3VyY2VzKCksIGRmcyk7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc2xhY2sgZm9yIHRoZSBnaXZlbiBlZGdlLiBUaGUgc2xhY2sgaXMgZGVmaW5lZCBhcyB0aGVcbiAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlIGFuZCBpdHMgbWluaW11bSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNsYWNrKGcsIGUpIHtcbiAgcmV0dXJuIGcubm9kZShlLncpLnJhbmsgLSBnLm5vZGUoZS52KS5yYW5rIC0gZy5lZGdlKGUpLm1pbmxlbjtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHNsYWNrID0gcmVxdWlyZShcIi4vdXRpbFwiKS5zbGFjaztcblxubW9kdWxlLmV4cG9ydHMgPSBmZWFzaWJsZVRyZWU7XG5cbi8qXG4gKiBDb25zdHJ1Y3RzIGEgc3Bhbm5pbmcgdHJlZSB3aXRoIHRpZ2h0IGVkZ2VzIGFuZCBhZGp1c3RlZCB0aGUgaW5wdXQgbm9kZSdzXG4gKiByYW5rcyB0byBhY2hpZXZlIHRoaXMuIEEgdGlnaHQgZWRnZSBpcyBvbmUgdGhhdCBpcyBoYXMgYSBsZW5ndGggdGhhdCBtYXRjaGVzXG4gKiBpdHMgXCJtaW5sZW5cIiBhdHRyaWJ1dGUuXG4gKlxuICogVGhlIGJhc2ljIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCBcIkFcbiAqIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZCBHcmFwaHMuXCJcbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gR3JhcGggbXVzdCBiZSBjb25uZWN0ZWQuXG4gKiAgICAzLiBHcmFwaCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vZGUuXG4gKiAgICA1LiBHcmFwaCBub2RlcyBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkIGEgXCJyYW5rXCIgcHJvcGVydHkgdGhhdFxuICogICAgICAgcmVzcGVjdHMgdGhlIFwibWlubGVuXCIgcHJvcGVydHkgb2YgaW5jaWRlbnQgZWRnZXMuXG4gKiAgICA2LiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgYSBcIm1pbmxlblwiIHByb3BlcnR5LlxuICpcbiAqIFBvc3QtY29uZGl0aW9uczpcbiAqXG4gKiAgICAtIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSB0aGVpciByYW5rIGFkanVzdGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBlZGdlcyBhcmVcbiAqICAgICAgdGlnaHQuXG4gKlxuICogUmV0dXJucyBhIHRyZWUgKHVuZGlyZWN0ZWQgZ3JhcGgpIHRoYXQgaXMgY29uc3RydWN0ZWQgdXNpbmcgb25seSBcInRpZ2h0XCJcbiAqIGVkZ2VzLlxuICovXG5mdW5jdGlvbiBmZWFzaWJsZVRyZWUoZykge1xuICB2YXIgdCA9IG5ldyBHcmFwaCh7IGRpcmVjdGVkOiBmYWxzZSB9KTtcblxuICAvLyBDaG9vc2UgYXJiaXRyYXJ5IG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBvdXIgdHJlZVxuICB2YXIgc3RhcnQgPSBnLm5vZGVzKClbMF07XG4gIHZhciBzaXplID0gZy5ub2RlQ291bnQoKTtcbiAgdC5zZXROb2RlKHN0YXJ0LCB7fSk7XG5cbiAgdmFyIGVkZ2UsIGRlbHRhO1xuICB3aGlsZSAodGlnaHRUcmVlKHQsIGcpIDwgc2l6ZSkge1xuICAgIGVkZ2UgPSBmaW5kTWluU2xhY2tFZGdlKHQsIGcpO1xuICAgIGRlbHRhID0gdC5oYXNOb2RlKGVkZ2UudikgPyBzbGFjayhnLCBlZGdlKSA6IC1zbGFjayhnLCBlZGdlKTtcbiAgICBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKTtcbiAgfVxuXG4gIHJldHVybiB0O1xufVxuXG4vKlxuICogRmluZHMgYSBtYXhpbWFsIHRyZWUgb2YgdGlnaHQgZWRnZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGVcbiAqIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRpZ2h0VHJlZSh0LCBnKSB7XG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgXy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgZWRnZVYgPSBlLnYsXG4gICAgICAgIHcgPSAodiA9PT0gZWRnZVYpID8gZS53IDogZWRnZVY7XG4gICAgICBpZiAoIXQuaGFzTm9kZSh3KSAmJiAhc2xhY2soZywgZSkpIHtcbiAgICAgICAgdC5zZXROb2RlKHcsIHt9KTtcbiAgICAgICAgdC5zZXRFZGdlKHYsIHcsIHt9KTtcbiAgICAgICAgZGZzKHcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZGZzKTtcbiAgcmV0dXJuIHQubm9kZUNvdW50KCk7XG59XG5cbi8qXG4gKiBGaW5kcyB0aGUgZWRnZSB3aXRoIHRoZSBzbWFsbGVzdCBzbGFjayB0aGF0IGlzIGluY2lkZW50IG9uIHRyZWUgYW5kIHJldHVybnNcbiAqIGl0LlxuICovXG5mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsIGcpIHtcbiAgcmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHQuaGFzTm9kZShlLnYpICE9PSB0Lmhhc05vZGUoZS53KSkge1xuICAgICAgcmV0dXJuIHNsYWNrKGcsIGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0UmFua3ModCwgZywgZGVsdGEpIHtcbiAgXy5mb3JFYWNoKHQubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIGcubm9kZSh2KS5yYW5rICs9IGRlbHRhO1xuICB9KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIGZlYXNpYmxlVHJlZSA9IHJlcXVpcmUoXCIuL2ZlYXNpYmxlLXRyZWVcIik7XG52YXIgc2xhY2sgPSByZXF1aXJlKFwiLi91dGlsXCIpLnNsYWNrO1xudmFyIGluaXRSYW5rID0gcmVxdWlyZShcIi4vdXRpbFwiKS5sb25nZXN0UGF0aDtcbnZhciBwcmVvcmRlciA9IHJlcXVpcmUoXCIuLi9ncmFwaGxpYlwiKS5hbGcucHJlb3JkZXI7XG52YXIgcG9zdG9yZGVyID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLmFsZy5wb3N0b3JkZXI7XG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKFwiLi4vdXRpbFwiKS5zaW1wbGlmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXR3b3JrU2ltcGxleDtcblxuLy8gRXhwb3NlIHNvbWUgaW50ZXJuYWxzIGZvciB0ZXN0aW5nIHB1cnBvc2VzXG5uZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzID0gaW5pdExvd0xpbVZhbHVlcztcbm5ldHdvcmtTaW1wbGV4LmluaXRDdXRWYWx1ZXMgPSBpbml0Q3V0VmFsdWVzO1xubmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlID0gY2FsY0N1dFZhbHVlO1xubmV0d29ya1NpbXBsZXgubGVhdmVFZGdlID0gbGVhdmVFZGdlO1xubmV0d29ya1NpbXBsZXguZW50ZXJFZGdlID0gZW50ZXJFZGdlO1xubmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcyA9IGV4Y2hhbmdlRWRnZXM7XG5cbi8qXG4gKiBUaGUgbmV0d29yayBzaW1wbGV4IGFsZ29yaXRobSBhc3NpZ25zIHJhbmtzIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGhcbiAqIGFuZCBpdGVyYXRpdmVseSBpbXByb3ZlcyB0aGUgcmFua2luZyB0byByZWR1Y2UgdGhlIGxlbmd0aCBvZiBlZGdlcy5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBtdXN0IGJlIGEgREFHLlxuICogICAgMi4gQWxsIG5vZGVzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgYW4gb2JqZWN0IHZhbHVlLlxuICogICAgMy4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgXCJtaW5sZW5cIiBhbmQgXCJ3ZWlnaHRcIiBhdHRyaWJ1dGVzLlxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEFsbCBub2RlcyBpbiB0aGUgZ3JhcGggd2lsbCBoYXZlIGFuIGFzc2lnbmVkIFwicmFua1wiIGF0dHJpYnV0ZSB0aGF0IGhhc1xuICogICAgICAgYmVlbiBvcHRpbWl6ZWQgYnkgdGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0uIFJhbmtzIHN0YXJ0IGF0IDAuXG4gKlxuICpcbiAqIEEgcm91Z2ggc2tldGNoIG9mIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAqXG4gKiAgICAxLiBBc3NpZ24gaW5pdGlhbCByYW5rcyB0byBlYWNoIG5vZGUuIFdlIHVzZSB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobSxcbiAqICAgICAgIHdoaWNoIGFzc2lnbnMgcmFua3MgdG8gdGhlIGxvd2VzdCBwb3NpdGlvbiBwb3NzaWJsZS4gSW4gZ2VuZXJhbCB0aGlzXG4gKiAgICAgICBsZWFkcyB0byB2ZXJ5IHdpZGUgYm90dG9tIHJhbmtzIGFuZCB1bm5lY2Vzc2FyaWx5IGxvbmcgZWRnZXMuXG4gKiAgICAyLiBDb25zdHJ1Y3QgYSBmZWFzaWJsZSB0aWdodCB0cmVlLiBBIHRpZ2h0IHRyZWUgaXMgb25lIHN1Y2ggdGhhdCBhbGxcbiAqICAgICAgIGVkZ2VzIGluIHRoZSB0cmVlIGhhdmUgbm8gc2xhY2sgKGRpZmZlcmVuY2UgYmV0d2VlbiBsZW5ndGggb2YgZWRnZVxuICogICAgICAgYW5kIG1pbmxlbiBmb3IgdGhlIGVkZ2UpLiBUaGlzIGJ5IGl0c2VsZiBncmVhdGx5IGltcHJvdmVzIHRoZSBhc3NpZ25lZFxuICogICAgICAgcmFua2luZ3MgYnkgc2hvcnRpbmcgZWRnZXMuXG4gKiAgICAzLiBJdGVyYXRpdmVseSBmaW5kIGVkZ2VzIHRoYXQgaGF2ZSBuZWdhdGl2ZSBjdXQgdmFsdWVzLiBHZW5lcmFsbHkgYVxuICogICAgICAgbmVnYXRpdmUgY3V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlZGdlIGNvdWxkIGJlIHJlbW92ZWQgYW5kIGEgbmV3XG4gKiAgICAgICB0cmVlIGVkZ2UgY291bGQgYmUgYWRkZWQgdG8gcHJvZHVjZSBhIG1vcmUgY29tcGFjdCBncmFwaC5cbiAqXG4gKiBNdWNoIG9mIHRoZSBhbGdvcml0aG1zIGhlcmUgYXJlIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWVcbiAqIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIiBUaGUgc3RydWN0dXJlIG9mIHRoZSBmaWxlIHJvdWdobHkgZm9sbG93cyB0aGVcbiAqIHN0cnVjdHVyZSBvZiB0aGUgb3ZlcmFsbCBhbGdvcml0aG0uXG4gKi9cbmZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpIHtcbiAgZyA9IHNpbXBsaWZ5KGcpO1xuICBpbml0UmFuayhnKTtcbiAgdmFyIHQgPSBmZWFzaWJsZVRyZWUoZyk7XG4gIGluaXRMb3dMaW1WYWx1ZXModCk7XG4gIGluaXRDdXRWYWx1ZXModCwgZyk7XG5cbiAgdmFyIGUsIGY7XG4gIHdoaWxlICgoZSA9IGxlYXZlRWRnZSh0KSkpIHtcbiAgICBmID0gZW50ZXJFZGdlKHQsIGcsIGUpO1xuICAgIGV4Y2hhbmdlRWRnZXModCwgZywgZSwgZik7XG4gIH1cbn1cblxuLypcbiAqIEluaXRpYWxpemVzIGN1dCB2YWx1ZXMgZm9yIGFsbCBlZGdlcyBpbiB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LCBnKSB7XG4gIHZhciB2cyA9IHBvc3RvcmRlcih0LCB0Lm5vZGVzKCkpO1xuICB2cyA9IHZzLnNsaWNlKDAsIHZzLmxlbmd0aCAtIDEpO1xuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICBhc3NpZ25DdXRWYWx1ZSh0LCBnLCB2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkN1dFZhbHVlKHQsIGcsIGNoaWxkKSB7XG4gIHZhciBjaGlsZExhYiA9IHQubm9kZShjaGlsZCk7XG4gIHZhciBwYXJlbnQgPSBjaGlsZExhYi5wYXJlbnQ7XG4gIHQuZWRnZShjaGlsZCwgcGFyZW50KS5jdXR2YWx1ZSA9IGNhbGNDdXRWYWx1ZSh0LCBnLCBjaGlsZCk7XG59XG5cbi8qXG4gKiBHaXZlbiB0aGUgdGlnaHQgdHJlZSwgaXRzIGdyYXBoLCBhbmQgYSBjaGlsZCBpbiB0aGUgZ3JhcGggY2FsY3VsYXRlIGFuZFxuICogcmV0dXJuIHRoZSBjdXQgdmFsdWUgZm9yIHRoZSBlZGdlIGJldHdlZW4gdGhlIGNoaWxkIGFuZCBpdHMgcGFyZW50LlxuICovXG5mdW5jdGlvbiBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpIHtcbiAgdmFyIGNoaWxkTGFiID0gdC5ub2RlKGNoaWxkKTtcbiAgdmFyIHBhcmVudCA9IGNoaWxkTGFiLnBhcmVudDtcbiAgLy8gVHJ1ZSBpZiB0aGUgY2hpbGQgaXMgb24gdGhlIHRhaWwgZW5kIG9mIHRoZSBlZGdlIGluIHRoZSBkaXJlY3RlZCBncmFwaFxuICB2YXIgY2hpbGRJc1RhaWwgPSB0cnVlO1xuICAvLyBUaGUgZ3JhcGgncyB2aWV3IG9mIHRoZSB0cmVlIGVkZ2Ugd2UncmUgaW5zcGVjdGluZ1xuICB2YXIgZ3JhcGhFZGdlID0gZy5lZGdlKGNoaWxkLCBwYXJlbnQpO1xuICAvLyBUaGUgYWNjdW11bGF0ZWQgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoaXMgbm9kZSBhbmQgaXRzIHBhcmVudFxuICB2YXIgY3V0VmFsdWUgPSAwO1xuXG4gIGlmICghZ3JhcGhFZGdlKSB7XG4gICAgY2hpbGRJc1RhaWwgPSBmYWxzZTtcbiAgICBncmFwaEVkZ2UgPSBnLmVkZ2UocGFyZW50LCBjaGlsZCk7XG4gIH1cblxuICBjdXRWYWx1ZSA9IGdyYXBoRWRnZS53ZWlnaHQ7XG5cbiAgXy5mb3JFYWNoKGcubm9kZUVkZ2VzKGNoaWxkKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBpc091dEVkZ2UgPSBlLnYgPT09IGNoaWxkLFxuICAgICAgb3RoZXIgPSBpc091dEVkZ2UgPyBlLncgOiBlLnY7XG5cbiAgICBpZiAob3RoZXIgIT09IHBhcmVudCkge1xuICAgICAgdmFyIHBvaW50c1RvSGVhZCA9IGlzT3V0RWRnZSA9PT0gY2hpbGRJc1RhaWwsXG4gICAgICAgIG90aGVyV2VpZ2h0ID0gZy5lZGdlKGUpLndlaWdodDtcblxuICAgICAgY3V0VmFsdWUgKz0gcG9pbnRzVG9IZWFkID8gb3RoZXJXZWlnaHQgOiAtb3RoZXJXZWlnaHQ7XG4gICAgICBpZiAoaXNUcmVlRWRnZSh0LCBjaGlsZCwgb3RoZXIpKSB7XG4gICAgICAgIHZhciBvdGhlckN1dFZhbHVlID0gdC5lZGdlKGNoaWxkLCBvdGhlcikuY3V0dmFsdWU7XG4gICAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IC1vdGhlckN1dFZhbHVlIDogb3RoZXJDdXRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjdXRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gaW5pdExvd0xpbVZhbHVlcyh0cmVlLCByb290KSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHJvb3QgPSB0cmVlLm5vZGVzKClbMF07XG4gIH1cbiAgZGZzQXNzaWduTG93TGltKHRyZWUsIHt9LCAxLCByb290KTtcbn1cblxuZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsIHZpc2l0ZWQsIG5leHRMaW0sIHYsIHBhcmVudCkge1xuICB2YXIgbG93ID0gbmV4dExpbTtcbiAgdmFyIGxhYmVsID0gdHJlZS5ub2RlKHYpO1xuXG4gIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICBfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksIGZ1bmN0aW9uKHcpIHtcbiAgICBpZiAoIV8uaGFzKHZpc2l0ZWQsIHcpKSB7XG4gICAgICBuZXh0TGltID0gZGZzQXNzaWduTG93TGltKHRyZWUsIHZpc2l0ZWQsIG5leHRMaW0sIHcsIHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgbGFiZWwubG93ID0gbG93O1xuICBsYWJlbC5saW0gPSBuZXh0TGltKys7XG4gIGlmIChwYXJlbnQpIHtcbiAgICBsYWJlbC5wYXJlbnQgPSBwYXJlbnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcyB3aGVuIHdlIGluY3JlbWVudGFsbHkgdXBkYXRlIGxvdyBsaW1cbiAgICBkZWxldGUgbGFiZWwucGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIG5leHRMaW07XG59XG5cbmZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKSB7XG4gIHJldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgcmV0dXJuIHRyZWUuZWRnZShlKS5jdXR2YWx1ZSA8IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlbnRlckVkZ2UodCwgZywgZWRnZSkge1xuICB2YXIgdiA9IGVkZ2UudjtcbiAgdmFyIHcgPSBlZGdlLnc7XG5cbiAgLy8gRm9yIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gd2UgYXNzdW1lIHRoYXQgdiBpcyB0aGUgdGFpbCBhbmQgdyBpcyB0aGVcbiAgLy8gaGVhZCwgc28gaWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIGVkZ2UgaW4gdGhlIGdyYXBoIHdlIHNob3VsZCBmbGlwIGl0IHRvXG4gIC8vIG1hdGNoIHRoZSBjb3JyZWN0IG9yaWVudGF0aW9uLlxuICBpZiAoIWcuaGFzRWRnZSh2LCB3KSkge1xuICAgIHYgPSBlZGdlLnc7XG4gICAgdyA9IGVkZ2UudjtcbiAgfVxuXG4gIHZhciB2TGFiZWwgPSB0Lm5vZGUodik7XG4gIHZhciB3TGFiZWwgPSB0Lm5vZGUodyk7XG4gIHZhciB0YWlsTGFiZWwgPSB2TGFiZWw7XG4gIHZhciBmbGlwID0gZmFsc2U7XG5cbiAgLy8gSWYgdGhlIHJvb3QgaXMgaW4gdGhlIHRhaWwgb2YgdGhlIGVkZ2UgdGhlbiB3ZSBuZWVkIHRvIGZsaXAgdGhlIGxvZ2ljIHRoYXRcbiAgLy8gY2hlY2tzIGZvciB0aGUgaGVhZCBhbmQgdGFpbCBub2RlcyBpbiB0aGUgY2FuZGlkYXRlcyBmdW5jdGlvbiBiZWxvdy5cbiAgaWYgKHZMYWJlbC5saW0gPiB3TGFiZWwubGltKSB7XG4gICAgdGFpbExhYmVsID0gd0xhYmVsO1xuICAgIGZsaXAgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGNhbmRpZGF0ZXMgPSBfLmZpbHRlcihnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICByZXR1cm4gZmxpcCA9PT0gaXNEZXNjZW5kYW50KHQsIHQubm9kZShlZGdlLnYpLCB0YWlsTGFiZWwpICYmXG4gICAgICAgICAgIGZsaXAgIT09IGlzRGVzY2VuZGFudCh0LCB0Lm5vZGUoZWRnZS53KSwgdGFpbExhYmVsKTtcbiAgfSk7XG5cbiAgcmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcywgZnVuY3Rpb24oZWRnZSkgeyByZXR1cm4gc2xhY2soZywgZWRnZSk7IH0pO1xufVxuXG5mdW5jdGlvbiBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpIHtcbiAgdmFyIHYgPSBlLnY7XG4gIHZhciB3ID0gZS53O1xuICB0LnJlbW92ZUVkZ2Uodiwgdyk7XG4gIHQuc2V0RWRnZShmLnYsIGYudywge30pO1xuICBpbml0TG93TGltVmFsdWVzKHQpO1xuICBpbml0Q3V0VmFsdWVzKHQsIGcpO1xuICB1cGRhdGVSYW5rcyh0LCBnKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmFua3ModCwgZykge1xuICB2YXIgcm9vdCA9IF8uZmluZCh0Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV0dXJuICFnLm5vZGUodikucGFyZW50OyB9KTtcbiAgdmFyIHZzID0gcHJlb3JkZXIodCwgcm9vdCk7XG4gIHZzID0gdnMuc2xpY2UoMSk7XG4gIF8uZm9yRWFjaCh2cywgZnVuY3Rpb24odikge1xuICAgIHZhciBwYXJlbnQgPSB0Lm5vZGUodikucGFyZW50LFxuICAgICAgZWRnZSA9IGcuZWRnZSh2LCBwYXJlbnQpLFxuICAgICAgZmxpcHBlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCFlZGdlKSB7XG4gICAgICBlZGdlID0gZy5lZGdlKHBhcmVudCwgdik7XG4gICAgICBmbGlwcGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnLm5vZGUodikucmFuayA9IGcubm9kZShwYXJlbnQpLnJhbmsgKyAoZmxpcHBlZCA/IGVkZ2UubWlubGVuIDogLWVkZ2UubWlubGVuKTtcbiAgfSk7XG59XG5cbi8qXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVkZ2UgaXMgaW4gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIGlzVHJlZUVkZ2UodHJlZSwgdSwgdikge1xuICByZXR1cm4gdHJlZS5oYXNFZGdlKHUsIHYpO1xufVxuXG4vKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBkZXNjZW5kYW50IG9mIHRoZSByb290IG5vZGUgcGVyIHRoZVxuICogYXNzaWduZWQgbG93IGFuZCBsaW0gYXR0cmlidXRlcyBpbiB0aGUgdHJlZS5cbiAqL1xuZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsIHZMYWJlbCwgcm9vdExhYmVsKSB7XG4gIHJldHVybiByb290TGFiZWwubG93IDw9IHZMYWJlbC5saW0gJiYgdkxhYmVsLmxpbSA8PSByb290TGFiZWwubGltO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgcmFua1V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xudmFyIGxvbmdlc3RQYXRoID0gcmFua1V0aWwubG9uZ2VzdFBhdGg7XG52YXIgZmVhc2libGVUcmVlID0gcmVxdWlyZShcIi4vZmVhc2libGUtdHJlZVwiKTtcbnZhciBuZXR3b3JrU2ltcGxleCA9IHJlcXVpcmUoXCIuL25ldHdvcmstc2ltcGxleFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5rO1xuXG4vKlxuICogQXNzaWducyBhIHJhbmsgdG8gZWFjaCBub2RlIGluIHRoZSBpbnB1dCBncmFwaCB0aGF0IHJlc3BlY3RzIHRoZSBcIm1pbmxlblwiXG4gKiBjb25zdHJhaW50IHNwZWNpZmllZCBvbiBlZGdlcyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFRoaXMgYmFzaWMgc3RydWN0dXJlIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWUgZm9yXG4gKiBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy5cIlxuICpcbiAqIFByZS1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG11c3QgYmUgYSBjb25uZWN0ZWQgREFHXG4gKiAgICAyLiBHcmFwaCBub2RlcyBtdXN0IGJlIG9iamVjdHNcbiAqICAgIDMuIEdyYXBoIGVkZ2VzIG11c3QgaGF2ZSBcIndlaWdodFwiIGFuZCBcIm1pbmxlblwiIGF0dHJpYnV0ZXNcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGEgXCJyYW5rXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZVxuICogICAgICAgYWxnb3JpdGhtLiBSYW5rcyBjYW4gc3RhcnQgYXQgYW55IGluZGV4IChpbmNsdWRpbmcgbmVnYXRpdmUpLCB3ZSdsbFxuICogICAgICAgZml4IHRoZW0gdXAgbGF0ZXIuXG4gKi9cbmZ1bmN0aW9uIHJhbmsoZykge1xuICBzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcikge1xuICBjYXNlIFwibmV0d29yay1zaW1wbGV4XCI6IG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpOyBicmVhaztcbiAgY2FzZSBcInRpZ2h0LXRyZWVcIjogdGlnaHRUcmVlUmFua2VyKGcpOyBicmVhaztcbiAgY2FzZSBcImxvbmdlc3QtcGF0aFwiOiBsb25nZXN0UGF0aFJhbmtlcihnKTsgYnJlYWs7XG4gIGRlZmF1bHQ6IG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpO1xuICB9XG59XG5cbi8vIEEgZmFzdCBhbmQgc2ltcGxlIHJhbmtlciwgYnV0IHJlc3VsdHMgYXJlIGZhciBmcm9tIG9wdGltYWwuXG52YXIgbG9uZ2VzdFBhdGhSYW5rZXIgPSBsb25nZXN0UGF0aDtcblxuZnVuY3Rpb24gdGlnaHRUcmVlUmFua2VyKGcpIHtcbiAgbG9uZ2VzdFBhdGgoZyk7XG4gIGZlYXNpYmxlVHJlZShnKTtcbn1cblxuZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZykge1xuICBuZXR3b3JrU2ltcGxleChnKTtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJlbnREdW1teUNoYWlucztcblxuZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZykge1xuICB2YXIgcG9zdG9yZGVyTnVtcyA9IHBvc3RvcmRlcihnKTtcblxuICBfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgdmFyIGVkZ2VPYmogPSBub2RlLmVkZ2VPYmo7XG4gICAgdmFyIHBhdGhEYXRhID0gZmluZFBhdGgoZywgcG9zdG9yZGVyTnVtcywgZWRnZU9iai52LCBlZGdlT2JqLncpO1xuICAgIHZhciBwYXRoID0gcGF0aERhdGEucGF0aDtcbiAgICB2YXIgbGNhID0gcGF0aERhdGEubGNhO1xuICAgIHZhciBwYXRoSWR4ID0gMDtcbiAgICB2YXIgcGF0aFYgPSBwYXRoW3BhdGhJZHhdO1xuICAgIHZhciBhc2NlbmRpbmcgPSB0cnVlO1xuXG4gICAgd2hpbGUgKHYgIT09IGVkZ2VPYmoudykge1xuICAgICAgbm9kZSA9IGcubm9kZSh2KTtcblxuICAgICAgaWYgKGFzY2VuZGluZykge1xuICAgICAgICB3aGlsZSAoKHBhdGhWID0gcGF0aFtwYXRoSWR4XSkgIT09IGxjYSAmJlxuICAgICAgICAgICAgICAgZy5ub2RlKHBhdGhWKS5tYXhSYW5rIDwgbm9kZS5yYW5rKSB7XG4gICAgICAgICAgcGF0aElkeCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGhWID09PSBsY2EpIHtcbiAgICAgICAgICBhc2NlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWFzY2VuZGluZykge1xuICAgICAgICB3aGlsZSAocGF0aElkeCA8IHBhdGgubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgZy5ub2RlKHBhdGhWID0gcGF0aFtwYXRoSWR4ICsgMV0pLm1pblJhbmsgPD0gbm9kZS5yYW5rKSB7XG4gICAgICAgICAgcGF0aElkeCsrO1xuICAgICAgICB9XG4gICAgICAgIHBhdGhWID0gcGF0aFtwYXRoSWR4XTtcbiAgICAgIH1cblxuICAgICAgZy5zZXRQYXJlbnQodiwgcGF0aFYpO1xuICAgICAgdiA9IGcuc3VjY2Vzc29ycyh2KVswXTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBGaW5kIGEgcGF0aCBmcm9tIHYgdG8gdyB0aHJvdWdoIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIChMQ0EpLiBSZXR1cm4gdGhlXG4vLyBmdWxsIHBhdGggYW5kIHRoZSBMQ0EuXG5mdW5jdGlvbiBmaW5kUGF0aChnLCBwb3N0b3JkZXJOdW1zLCB2LCB3KSB7XG4gIHZhciB2UGF0aCA9IFtdO1xuICB2YXIgd1BhdGggPSBbXTtcbiAgdmFyIGxvdyA9IE1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LCBwb3N0b3JkZXJOdW1zW3ddLmxvdyk7XG4gIHZhciBsaW0gPSBNYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSwgcG9zdG9yZGVyTnVtc1t3XS5saW0pO1xuICB2YXIgcGFyZW50O1xuICB2YXIgbGNhO1xuXG4gIC8vIFRyYXZlcnNlIHVwIGZyb20gdiB0byBmaW5kIHRoZSBMQ0FcbiAgcGFyZW50ID0gdjtcbiAgZG8ge1xuICAgIHBhcmVudCA9IGcucGFyZW50KHBhcmVudCk7XG4gICAgdlBhdGgucHVzaChwYXJlbnQpO1xuICB9IHdoaWxlIChwYXJlbnQgJiZcbiAgICAgICAgICAgKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3cgPiBsb3cgfHwgbGltID4gcG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO1xuICBsY2EgPSBwYXJlbnQ7XG5cbiAgLy8gVHJhdmVyc2UgZnJvbSB3IHRvIExDQVxuICBwYXJlbnQgPSB3O1xuICB3aGlsZSAoKHBhcmVudCA9IGcucGFyZW50KHBhcmVudCkpICE9PSBsY2EpIHtcbiAgICB3UGF0aC5wdXNoKHBhcmVudCk7XG4gIH1cblxuICByZXR1cm4geyBwYXRoOiB2UGF0aC5jb25jYXQod1BhdGgucmV2ZXJzZSgpKSwgbGNhOiBsY2EgfTtcbn1cblxuZnVuY3Rpb24gcG9zdG9yZGVyKGcpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgbGltID0gMDtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIHZhciBsb3cgPSBsaW07XG4gICAgXy5mb3JFYWNoKGcuY2hpbGRyZW4odiksIGRmcyk7XG4gICAgcmVzdWx0W3ZdID0geyBsb3c6IGxvdywgbGltOiBsaW0rKyB9O1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGRmcyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJ1bjogcnVuLFxuICBjbGVhbnVwOiBjbGVhbnVwXG59O1xuXG4vKlxuICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocyxcbiAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuXG4gKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzXG4gKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay5cbiAqXG4gKiBQcmVjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHXG4gKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZVxuICpcbiAqIFBvc3Rjb25kaXRpb25zOlxuICpcbiAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC5cbiAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLlxuICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3RcbiAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuXG4gKlxuICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgXCJMYXlvdXQgb2YgQ29tcG91bmQgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICovXG5mdW5jdGlvbiBydW4oZykge1xuICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwicm9vdFwiLCB7fSwgXCJfcm9vdFwiKTtcbiAgdmFyIGRlcHRocyA9IHRyZWVEZXB0aHMoZyk7XG4gIHZhciBoZWlnaHQgPSBfLm1heChfLnZhbHVlcyhkZXB0aHMpKSAtIDE7IC8vIE5vdGU6IGRlcHRocyBpcyBhbiBPYmplY3Qgbm90IGFuIGFycmF5XG4gIHZhciBub2RlU2VwID0gMiAqIGhlaWdodCArIDE7XG5cbiAgZy5ncmFwaCgpLm5lc3RpbmdSb290ID0gcm9vdDtcblxuICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLlxuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGEgd2VpZ2h0IHRoYXQgaXMgc3VmZmljaWVudCB0byBrZWVwIHN1YmdyYXBocyB2ZXJ0aWNhbGx5IGNvbXBhY3RcbiAgdmFyIHdlaWdodCA9IHN1bVdlaWdodHMoZykgKyAxO1xuXG4gIC8vIENyZWF0ZSBib3JkZXIgbm9kZXMgYW5kIGxpbmsgdGhlbSB1cFxuICBfLmZvckVhY2goZy5jaGlsZHJlbigpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG4gIH0pO1xuXG4gIC8vIFNhdmUgdGhlIG11bHRpcGxpZXIgZm9yIG5vZGUgbGF5ZXJzIGZvciBsYXRlciByZW1vdmFsIG9mIGVtcHR5IGJvcmRlclxuICAvLyBsYXllcnMuXG4gIGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvciA9IG5vZGVTZXA7XG59XG5cbmZ1bmN0aW9uIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7XG4gIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKHYgIT09IHJvb3QpIHtcbiAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdG9wID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2J0XCIpO1xuICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsIFwiX2JiXCIpO1xuICB2YXIgbGFiZWwgPSBnLm5vZGUodik7XG5cbiAgZy5zZXRQYXJlbnQodG9wLCB2KTtcbiAgbGFiZWwuYm9yZGVyVG9wID0gdG9wO1xuICBnLnNldFBhcmVudChib3R0b20sIHYpO1xuICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207XG5cbiAgXy5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgIGRmcyhnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTtcbiAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkO1xuICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7XG4gICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDtcbiAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7XG5cbiAgICBnLnNldEVkZ2UodG9wLCBjaGlsZFRvcCwge1xuICAgICAgd2VpZ2h0OiB0aGlzV2VpZ2h0LFxuICAgICAgbWlubGVuOiBtaW5sZW4sXG4gICAgICBuZXN0aW5nRWRnZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgZy5zZXRFZGdlKGNoaWxkQm90dG9tLCBib3R0b20sIHtcbiAgICAgIHdlaWdodDogdGhpc1dlaWdodCxcbiAgICAgIG1pbmxlbjogbWlubGVuLFxuICAgICAgbmVzdGluZ0VkZ2U6IHRydWVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKCFnLnBhcmVudCh2KSkge1xuICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmVlRGVwdGhzKGcpIHtcbiAgdmFyIGRlcHRocyA9IHt9O1xuICBmdW5jdGlvbiBkZnModiwgZGVwdGgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBnLmNoaWxkcmVuKHYpO1xuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIF8uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgZGZzKGNoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGRlcHRoc1t2XSA9IGRlcHRoO1xuICB9XG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGZ1bmN0aW9uKHYpIHsgZGZzKHYsIDEpOyB9KTtcbiAgcmV0dXJuIGRlcHRocztcbn1cblxuZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKSB7XG4gIHJldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksIGZ1bmN0aW9uKGFjYywgZSkge1xuICAgIHJldHVybiBhY2MgKyBnLmVkZ2UoZSkud2VpZ2h0O1xuICB9LCAwKTtcbn1cblxuZnVuY3Rpb24gY2xlYW51cChnKSB7XG4gIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpO1xuICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7XG4gIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHtcbiAgICAgIGcucmVtb3ZlRWRnZShlKTtcbiAgICB9XG4gIH0pO1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFkZEJvcmRlclNlZ21lbnRzO1xuXG5mdW5jdGlvbiBhZGRCb3JkZXJTZWdtZW50cyhnKSB7XG4gIGZ1bmN0aW9uIGRmcyh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gZy5jaGlsZHJlbih2KTtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBfLmZvckVhY2goY2hpbGRyZW4sIGRmcyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaGFzKG5vZGUsIFwibWluUmFua1wiKSkge1xuICAgICAgbm9kZS5ib3JkZXJMZWZ0ID0gW107XG4gICAgICBub2RlLmJvcmRlclJpZ2h0ID0gW107XG4gICAgICBmb3IgKHZhciByYW5rID0gbm9kZS5taW5SYW5rLCBtYXhSYW5rID0gbm9kZS5tYXhSYW5rICsgMTtcbiAgICAgICAgcmFuayA8IG1heFJhbms7XG4gICAgICAgICsrcmFuaykge1xuICAgICAgICBhZGRCb3JkZXJOb2RlKGcsIFwiYm9yZGVyTGVmdFwiLCBcIl9ibFwiLCB2LCBub2RlLCByYW5rKTtcbiAgICAgICAgYWRkQm9yZGVyTm9kZShnLCBcImJvcmRlclJpZ2h0XCIsIFwiX2JyXCIsIHYsIG5vZGUsIHJhbmspO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF8uZm9yRWFjaChnLmNoaWxkcmVuKCksIGRmcyk7XG59XG5cbmZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZywgcHJvcCwgcHJlZml4LCBzZywgc2dOb2RlLCByYW5rKSB7XG4gIHZhciBsYWJlbCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgcmFuazogcmFuaywgYm9yZGVyVHlwZTogcHJvcCB9O1xuICB2YXIgcHJldiA9IHNnTm9kZVtwcm9wXVtyYW5rIC0gMV07XG4gIHZhciBjdXJyID0gdXRpbC5hZGREdW1teU5vZGUoZywgXCJib3JkZXJcIiwgbGFiZWwsIHByZWZpeCk7XG4gIHNnTm9kZVtwcm9wXVtyYW5rXSA9IGN1cnI7XG4gIGcuc2V0UGFyZW50KGN1cnIsIHNnKTtcbiAgaWYgKHByZXYpIHtcbiAgICBnLnNldEVkZ2UocHJldiwgY3VyciwgeyB3ZWlnaHQ6IDEgfSk7XG4gIH1cbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGp1c3Q6IGFkanVzdCxcbiAgdW5kbzogdW5kb1xufTtcblxuZnVuY3Rpb24gYWRqdXN0KGcpIHtcbiAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO1xuICBpZiAocmFua0RpciA9PT0gXCJsclwiIHx8IHJhbmtEaXIgPT09IFwicmxcIikge1xuICAgIHN3YXBXaWR0aEhlaWdodChnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bmRvKGcpIHtcbiAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO1xuICBpZiAocmFua0RpciA9PT0gXCJidFwiIHx8IHJhbmtEaXIgPT09IFwicmxcIikge1xuICAgIHJldmVyc2VZKGcpO1xuICB9XG5cbiAgaWYgKHJhbmtEaXIgPT09IFwibHJcIiB8fCByYW5rRGlyID09PSBcInJsXCIpIHtcbiAgICBzd2FwWFkoZyk7XG4gICAgc3dhcFdpZHRoSGVpZ2h0KGcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFdpZHRoSGVpZ2h0T25lKGcubm9kZSh2KSk7IH0pO1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IHN3YXBXaWR0aEhlaWdodE9uZShnLmVkZ2UoZSkpOyB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0T25lKGF0dHJzKSB7XG4gIHZhciB3ID0gYXR0cnMud2lkdGg7XG4gIGF0dHJzLndpZHRoID0gYXR0cnMuaGVpZ2h0O1xuICBhdHRycy5oZWlnaHQgPSB3O1xufVxuXG5mdW5jdGlvbiByZXZlcnNlWShnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV2ZXJzZVlPbmUoZy5ub2RlKHYpKTsgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgcmV2ZXJzZVlPbmUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInlcIikpIHtcbiAgICAgIHJldmVyc2VZT25lKGVkZ2UpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKSB7XG4gIGF0dHJzLnkgPSAtYXR0cnMueTtcbn1cblxuZnVuY3Rpb24gc3dhcFhZKGcpIHtcbiAgXy5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzd2FwWFlPbmUoZy5ub2RlKHYpKTsgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgc3dhcFhZT25lKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBzd2FwWFlPbmUoZWRnZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dhcFhZT25lKGF0dHJzKSB7XG4gIHZhciB4ID0gYXR0cnMueDtcbiAgYXR0cnMueCA9IGF0dHJzLnk7XG4gIGF0dHJzLnkgPSB4O1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdE9yZGVyO1xuXG4vKlxuICogQXNzaWducyBhbiBpbml0aWFsIG9yZGVyIHZhbHVlIGZvciBlYWNoIG5vZGUgYnkgcGVyZm9ybWluZyBhIERGUyBzZWFyY2hcbiAqIHN0YXJ0aW5nIGZyb20gbm9kZXMgaW4gdGhlIGZpcnN0IHJhbmsuIE5vZGVzIGFyZSBhc3NpZ25lZCBhbiBvcmRlciBpbiB0aGVpclxuICogcmFuayBhcyB0aGV5IGFyZSBmaXJzdCB2aXNpdGVkLlxuICpcbiAqIFRoaXMgYXBwcm9hY2ggY29tZXMgZnJvbSBHYW5zbmVyLCBldCBhbC4sIFwiQSBUZWNobmlxdWUgZm9yIERyYXdpbmcgRGlyZWN0ZWRcbiAqIEdyYXBocy5cIlxuICpcbiAqIFJldHVybnMgYSBsYXllcmluZyBtYXRyaXggd2l0aCBhbiBhcnJheSBwZXIgbGF5ZXIgYW5kIGVhY2ggbGF5ZXIgc29ydGVkIGJ5XG4gKiB0aGUgb3JkZXIgb2YgaXRzIG5vZGVzLlxuICovXG5mdW5jdGlvbiBpbml0T3JkZXIoZykge1xuICB2YXIgdmlzaXRlZCA9IHt9O1xuICB2YXIgc2ltcGxlTm9kZXMgPSBfLmZpbHRlcihnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICByZXR1cm4gIWcuY2hpbGRyZW4odikubGVuZ3RoO1xuICB9KTtcbiAgdmFyIG1heFJhbmsgPSBfLm1heChfLm1hcChzaW1wbGVOb2RlcywgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTtcbiAgdmFyIGxheWVycyA9IF8ubWFwKF8ucmFuZ2UobWF4UmFuayArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTtcblxuICBmdW5jdGlvbiBkZnModikge1xuICAgIGlmIChfLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuO1xuICAgIHZpc2l0ZWRbdl0gPSB0cnVlO1xuICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgIGxheWVyc1tub2RlLnJhbmtdLnB1c2godik7XG4gICAgXy5mb3JFYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTtcbiAgfVxuXG4gIHZhciBvcmRlcmVkVnMgPSBfLnNvcnRCeShzaW1wbGVOb2RlcywgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pO1xuICBfLmZvckVhY2gob3JkZXJlZFZzLCBkZnMpO1xuXG4gIHJldHVybiBsYXllcnM7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcm9zc0NvdW50O1xuXG4vKlxuICogQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgbGF5ZXJpbmcgKGFuIGFycmF5IG9mIGxheWVycywgZWFjaCB3aXRoIGFuIGFycmF5IG9mXG4gKiBvcmRlcmVyZCBub2RlcykgYW5kIGEgZ3JhcGggYW5kIHJldHVybnMgYSB3ZWlnaHRlZCBjcm9zc2luZyBjb3VudC5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBtdXN0IGJlIHNpbXBsZSAobm90IGEgbXVsdGlncmFwaCksIGRpcmVjdGVkLCBhbmQgaW5jbHVkZVxuICogICAgICAgb25seSBzaW1wbGUgZWRnZXMuXG4gKiAgICAyLiBFZGdlcyBpbiB0aGUgaW5wdXQgZ3JhcGggbXVzdCBoYXZlIGFzc2lnbmVkIHdlaWdodHMuXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIFRoZSBncmFwaCBhbmQgbGF5ZXJpbmcgbWF0cml4IGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBUaGlzIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gQmFydGgsIGV0IGFsLiwgXCJCaWxheWVyIENyb3NzIENvdW50aW5nLlwiXG4gKi9cbmZ1bmN0aW9uIGNyb3NzQ291bnQoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNjID0gMDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsYXllcmluZy5sZW5ndGg7ICsraSkge1xuICAgIGNjICs9IHR3b0xheWVyQ3Jvc3NDb3VudChnLCBsYXllcmluZ1tpLTFdLCBsYXllcmluZ1tpXSk7XG4gIH1cbiAgcmV0dXJuIGNjO1xufVxuXG5mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZywgbm9ydGhMYXllciwgc291dGhMYXllcikge1xuICAvLyBTb3J0IGFsbCBvZiB0aGUgZWRnZXMgYmV0d2VlbiB0aGUgbm9ydGggYW5kIHNvdXRoIGxheWVycyBieSB0aGVpciBwb3NpdGlvblxuICAvLyBpbiB0aGUgbm9ydGggbGF5ZXIgYW5kIHRoZW4gdGhlIHNvdXRoLiBNYXAgdGhlc2UgZWRnZXMgdG8gdGhlIHBvc2l0aW9uIG9mXG4gIC8vIHRoZWlyIGhlYWQgaW4gdGhlIHNvdXRoIGxheWVyLlxuICB2YXIgc291dGhQb3MgPSBfLnppcE9iamVjdChzb3V0aExheWVyLFxuICAgIF8ubWFwKHNvdXRoTGF5ZXIsIGZ1bmN0aW9uICh2LCBpKSB7IHJldHVybiBpOyB9KSk7XG4gIHZhciBzb3V0aEVudHJpZXMgPSBfLmZsYXR0ZW4oXy5tYXAobm9ydGhMYXllciwgZnVuY3Rpb24odikge1xuICAgIHJldHVybiBfLnNvcnRCeShfLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4geyBwb3M6IHNvdXRoUG9zW2Uud10sIHdlaWdodDogZy5lZGdlKGUpLndlaWdodCB9O1xuICAgIH0pLCBcInBvc1wiKTtcbiAgfSksIHRydWUpO1xuXG4gIC8vIEJ1aWxkIHRoZSBhY2N1bXVsYXRvciB0cmVlXG4gIHZhciBmaXJzdEluZGV4ID0gMTtcbiAgd2hpbGUgKGZpcnN0SW5kZXggPCBzb3V0aExheWVyLmxlbmd0aCkgZmlyc3RJbmRleCA8PD0gMTtcbiAgdmFyIHRyZWVTaXplID0gMiAqIGZpcnN0SW5kZXggLSAxO1xuICBmaXJzdEluZGV4IC09IDE7XG4gIHZhciB0cmVlID0gXy5tYXAobmV3IEFycmF5KHRyZWVTaXplKSwgZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9KTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIHdlaWdodGVkIGNyb3NzaW5nc1xuICB2YXIgY2MgPSAwO1xuICBfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHtcbiAgICB2YXIgaW5kZXggPSBlbnRyeS5wb3MgKyBmaXJzdEluZGV4O1xuICAgIHRyZWVbaW5kZXhdICs9IGVudHJ5LndlaWdodDtcbiAgICB2YXIgd2VpZ2h0U3VtID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPiAwKSB7XG4gICAgICBpZiAoaW5kZXggJSAyKSB7XG4gICAgICAgIHdlaWdodFN1bSArPSB0cmVlW2luZGV4ICsgMV07XG4gICAgICB9XG4gICAgICBpbmRleCA9IChpbmRleCAtIDEpID4+IDE7XG4gICAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7XG4gICAgfVxuICAgIGNjICs9IGVudHJ5LndlaWdodCAqIHdlaWdodFN1bTtcbiAgfSkpO1xuXG4gIHJldHVybiBjYztcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYmFyeWNlbnRlcjtcblxuZnVuY3Rpb24gYmFyeWNlbnRlcihnLCBtb3ZhYmxlKSB7XG4gIHJldHVybiBfLm1hcChtb3ZhYmxlLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIGluViA9IGcuaW5FZGdlcyh2KTtcbiAgICBpZiAoIWluVi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHY6IHYgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IF8ucmVkdWNlKGluViwgZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICAgIHZhciBlZGdlID0gZy5lZGdlKGUpLFxuICAgICAgICAgIG5vZGVVID0gZy5ub2RlKGUudik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VtOiBhY2Muc3VtICsgKGVkZ2Uud2VpZ2h0ICogbm9kZVUub3JkZXIpLFxuICAgICAgICAgIHdlaWdodDogYWNjLndlaWdodCArIGVkZ2Uud2VpZ2h0XG4gICAgICAgIH07XG4gICAgICB9LCB7IHN1bTogMCwgd2VpZ2h0OiAwIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2OiB2LFxuICAgICAgICBiYXJ5Y2VudGVyOiByZXN1bHQuc3VtIC8gcmVzdWx0LndlaWdodCxcbiAgICAgICAgd2VpZ2h0OiByZXN1bHQud2VpZ2h0XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc29sdmVDb25mbGljdHM7XG5cbi8qXG4gKiBHaXZlbiBhIGxpc3Qgb2YgZW50cmllcyBvZiB0aGUgZm9ybSB7diwgYmFyeWNlbnRlciwgd2VpZ2h0fSBhbmQgYVxuICogY29uc3RyYWludCBncmFwaCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVzb2x2ZSBhbnkgY29uZmxpY3RzIGJldHdlZW4gdGhlXG4gKiBjb25zdHJhaW50IGdyYXBoIGFuZCB0aGUgYmFyeWNlbnRlcnMgZm9yIHRoZSBlbnRyaWVzLiBJZiB0aGUgYmFyeWNlbnRlcnMgZm9yXG4gKiBhbiBlbnRyeSB3b3VsZCB2aW9sYXRlIGEgY29uc3RyYWludCBpbiB0aGUgY29uc3RyYWludCBncmFwaCB0aGVuIHdlIGNvYWxlc2NlXG4gKiB0aGUgbm9kZXMgaW4gdGhlIGNvbmZsaWN0IGludG8gYSBuZXcgbm9kZSB0aGF0IHJlc3BlY3RzIHRoZSBjb250cmFpbnQgYW5kXG4gKiBhZ2dyZWdhdGVzIGJhcnljZW50ZXIgYW5kIHdlaWdodCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiBGb3JzdGVyLCBcIkEgRmFzdCBhbmRcbiAqIFNpbXBsZSBIdWVyaXN0aWMgZm9yIENvbnN0cmFpbmVkIFR3by1MZXZlbCBDcm9zc2luZyBSZWR1Y3Rpb24sXCIgdGhvdWdodCBpdFxuICogZGlmZmVycyBpbiBzb21lIHNwZWNpZmljIGRldGFpbHMuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gRWFjaCBlbnRyeSBoYXMgdGhlIGZvcm0ge3YsIGJhcnljZW50ZXIsIHdlaWdodH0sIG9yIGlmIHRoZSBub2RlIGhhc1xuICogICAgICAgbm8gYmFyeWNlbnRlciwgdGhlbiB7dn0uXG4gKlxuICogUmV0dXJuczpcbiAqXG4gKiAgICBBIG5ldyBsaXN0IG9mIGVudHJpZXMgb2YgdGhlIGZvcm0ge3ZzLCBpLCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LiBUaGUgbGlzdFxuICogICAgYHZzYCBtYXkgZWl0aGVyIGJlIGEgc2luZ2xldG9uIG9yIGl0IG1heSBiZSBhbiBhZ2dyZWdhdGlvbiBvZiBub2Rlc1xuICogICAgb3JkZXJlZCBzdWNoIHRoYXQgdGhleSBkbyBub3QgdmlvbGF0ZSBjb25zdHJhaW50cyBmcm9tIHRoZSBjb25zdHJhaW50XG4gKiAgICBncmFwaC4gVGhlIHByb3BlcnR5IGBpYCBpcyB0aGUgbG93ZXN0IG9yaWdpbmFsIGluZGV4IG9mIGFueSBvZiB0aGVcbiAqICAgIGVsZW1lbnRzIGluIGB2c2AuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcywgY2cpIHtcbiAgdmFyIG1hcHBlZEVudHJpZXMgPSB7fTtcbiAgXy5mb3JFYWNoKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5LCBpKSB7XG4gICAgdmFyIHRtcCA9IG1hcHBlZEVudHJpZXNbZW50cnkudl0gPSB7XG4gICAgICBpbmRlZ3JlZTogMCxcbiAgICAgIFwiaW5cIjogW10sXG4gICAgICBvdXQ6IFtdLFxuICAgICAgdnM6IFtlbnRyeS52XSxcbiAgICAgIGk6IGlcbiAgICB9O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSkge1xuICAgICAgdG1wLmJhcnljZW50ZXIgPSBlbnRyeS5iYXJ5Y2VudGVyO1xuICAgICAgdG1wLndlaWdodCA9IGVudHJ5LndlaWdodDtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChjZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVudHJ5ViA9IG1hcHBlZEVudHJpZXNbZS52XTtcbiAgICB2YXIgZW50cnlXID0gbWFwcGVkRW50cmllc1tlLnddO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRyeVYpICYmICFfLmlzVW5kZWZpbmVkKGVudHJ5VykpIHtcbiAgICAgIGVudHJ5Vy5pbmRlZ3JlZSsrO1xuICAgICAgZW50cnlWLm91dC5wdXNoKG1hcHBlZEVudHJpZXNbZS53XSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgc291cmNlU2V0ID0gXy5maWx0ZXIobWFwcGVkRW50cmllcywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICByZXR1cm4gIWVudHJ5LmluZGVncmVlO1xuICB9KTtcblxuICByZXR1cm4gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCk7XG59XG5cbmZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpIHtcbiAgdmFyIGVudHJpZXMgPSBbXTtcblxuICBmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odUVudHJ5KSB7XG4gICAgICBpZiAodUVudHJ5Lm1lcmdlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcikgfHxcbiAgICAgICAgICBfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKSB8fFxuICAgICAgICAgIHVFbnRyeS5iYXJ5Y2VudGVyID49IHZFbnRyeS5iYXJ5Y2VudGVyKSB7XG4gICAgICAgIG1lcmdlRW50cmllcyh2RW50cnksIHVFbnRyeSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24od0VudHJ5KSB7XG4gICAgICB3RW50cnlbXCJpblwiXS5wdXNoKHZFbnRyeSk7XG4gICAgICBpZiAoLS13RW50cnkuaW5kZWdyZWUgPT09IDApIHtcbiAgICAgICAgc291cmNlU2V0LnB1c2god0VudHJ5KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgd2hpbGUgKHNvdXJjZVNldC5sZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBzb3VyY2VTZXQucG9wKCk7XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICBfLmZvckVhY2goZW50cnlbXCJpblwiXS5yZXZlcnNlKCksIGhhbmRsZUluKGVudHJ5KSk7XG4gICAgXy5mb3JFYWNoKGVudHJ5Lm91dCwgaGFuZGxlT3V0KGVudHJ5KSk7XG4gIH1cblxuICByZXR1cm4gXy5tYXAoXy5maWx0ZXIoZW50cmllcywgZnVuY3Rpb24oZW50cnkpIHsgcmV0dXJuICFlbnRyeS5tZXJnZWQ7IH0pLFxuICAgIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICByZXR1cm4gXy5waWNrKGVudHJ5LCBbXCJ2c1wiLCBcImlcIiwgXCJiYXJ5Y2VudGVyXCIsIFwid2VpZ2h0XCJdKTtcbiAgICB9KTtcblxufVxuXG5mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LCBzb3VyY2UpIHtcbiAgdmFyIHN1bSA9IDA7XG4gIHZhciB3ZWlnaHQgPSAwO1xuXG4gIGlmICh0YXJnZXQud2VpZ2h0KSB7XG4gICAgc3VtICs9IHRhcmdldC5iYXJ5Y2VudGVyICogdGFyZ2V0LndlaWdodDtcbiAgICB3ZWlnaHQgKz0gdGFyZ2V0LndlaWdodDtcbiAgfVxuXG4gIGlmIChzb3VyY2Uud2VpZ2h0KSB7XG4gICAgc3VtICs9IHNvdXJjZS5iYXJ5Y2VudGVyICogc291cmNlLndlaWdodDtcbiAgICB3ZWlnaHQgKz0gc291cmNlLndlaWdodDtcbiAgfVxuXG4gIHRhcmdldC52cyA9IHNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTtcbiAgdGFyZ2V0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gIHRhcmdldC53ZWlnaHQgPSB3ZWlnaHQ7XG4gIHRhcmdldC5pID0gTWF0aC5taW4oc291cmNlLmksIHRhcmdldC5pKTtcbiAgc291cmNlLm1lcmdlZCA9IHRydWU7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0O1xuXG5mdW5jdGlvbiBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCkge1xuICB2YXIgcGFydHMgPSB1dGlsLnBhcnRpdGlvbihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkge1xuICAgIHJldHVybiBfLmhhcyhlbnRyeSwgXCJiYXJ5Y2VudGVyXCIpO1xuICB9KTtcbiAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLFxuICAgIHVuc29ydGFibGUgPSBfLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksXG4gICAgdnMgPSBbXSxcbiAgICBzdW0gPSAwLFxuICAgIHdlaWdodCA9IDAsXG4gICAgdnNJbmRleCA9IDA7XG5cbiAgc29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTtcblxuICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuXG4gIF8uZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7XG4gICAgdnMucHVzaChlbnRyeS52cyk7XG4gICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7XG4gICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDtcbiAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpO1xuICB9KTtcblxuICB2YXIgcmVzdWx0ID0geyB2czogXy5mbGF0dGVuKHZzLCB0cnVlKSB9O1xuICBpZiAod2VpZ2h0KSB7XG4gICAgcmVzdWx0LmJhcnljZW50ZXIgPSBzdW0gLyB3ZWlnaHQ7XG4gICAgcmVzdWx0LndlaWdodCA9IHdlaWdodDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cywgdW5zb3J0YWJsZSwgaW5kZXgpIHtcbiAgdmFyIGxhc3Q7XG4gIHdoaWxlICh1bnNvcnRhYmxlLmxlbmd0aCAmJiAobGFzdCA9IF8ubGFzdCh1bnNvcnRhYmxlKSkuaSA8PSBpbmRleCkge1xuICAgIHVuc29ydGFibGUucG9wKCk7XG4gICAgdnMucHVzaChsYXN0LnZzKTtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7XG4gICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAhYmlhcyA/IGVudHJ5Vi5pIC0gZW50cnlXLmkgOiBlbnRyeVcuaSAtIGVudHJ5Vi5pO1xuICB9O1xufVxuIiwgInZhciBfID0gcmVxdWlyZShcIi4uL2xvZGFzaFwiKTtcbnZhciBiYXJ5Y2VudGVyID0gcmVxdWlyZShcIi4vYmFyeWNlbnRlclwiKTtcbnZhciByZXNvbHZlQ29uZmxpY3RzID0gcmVxdWlyZShcIi4vcmVzb2x2ZS1jb25mbGljdHNcIik7XG52YXIgc29ydCA9IHJlcXVpcmUoXCIuL3NvcnRcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gc29ydFN1YmdyYXBoO1xuXG5mdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZywgdiwgY2csIGJpYXNSaWdodCkge1xuICB2YXIgbW92YWJsZSA9IGcuY2hpbGRyZW4odik7XG4gIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICB2YXIgYmwgPSBub2RlID8gbm9kZS5ib3JkZXJMZWZ0IDogdW5kZWZpbmVkO1xuICB2YXIgYnIgPSBub2RlID8gbm9kZS5ib3JkZXJSaWdodDogdW5kZWZpbmVkO1xuICB2YXIgc3ViZ3JhcGhzID0ge307XG5cbiAgaWYgKGJsKSB7XG4gICAgbW92YWJsZSA9IF8uZmlsdGVyKG1vdmFibGUsIGZ1bmN0aW9uKHcpIHtcbiAgICAgIHJldHVybiB3ICE9PSBibCAmJiB3ICE9PSBicjtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBiYXJ5Y2VudGVycyA9IGJhcnljZW50ZXIoZywgbW92YWJsZSk7XG4gIF8uZm9yRWFjaChiYXJ5Y2VudGVycywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICBpZiAoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpIHtcbiAgICAgIHZhciBzdWJncmFwaFJlc3VsdCA9IHNvcnRTdWJncmFwaChnLCBlbnRyeS52LCBjZywgYmlhc1JpZ2h0KTtcbiAgICAgIHN1YmdyYXBoc1tlbnRyeS52XSA9IHN1YmdyYXBoUmVzdWx0O1xuICAgICAgaWYgKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCBcImJhcnljZW50ZXJcIikpIHtcbiAgICAgICAgbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwgc3ViZ3JhcGhSZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGVudHJpZXMgPSByZXNvbHZlQ29uZmxpY3RzKGJhcnljZW50ZXJzLCBjZyk7XG4gIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpO1xuXG4gIHZhciByZXN1bHQgPSBzb3J0KGVudHJpZXMsIGJpYXNSaWdodCk7XG5cbiAgaWYgKGJsKSB7XG4gICAgcmVzdWx0LnZzID0gXy5mbGF0dGVuKFtibCwgcmVzdWx0LnZzLCBicl0sIHRydWUpO1xuICAgIGlmIChnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKSB7XG4gICAgICB2YXIgYmxQcmVkID0gZy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksXG4gICAgICAgIGJyUHJlZCA9IGcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO1xuICAgICAgaWYgKCFfLmhhcyhyZXN1bHQsIFwiYmFyeWNlbnRlclwiKSkge1xuICAgICAgICByZXN1bHQuYmFyeWNlbnRlciA9IDA7XG4gICAgICAgIHJlc3VsdC53ZWlnaHQgPSAwO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmJhcnljZW50ZXIgPSAocmVzdWx0LmJhcnljZW50ZXIgKiByZXN1bHQud2VpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsUHJlZC5vcmRlciArIGJyUHJlZC5vcmRlcikgLyAocmVzdWx0LndlaWdodCArIDIpO1xuICAgICAgcmVzdWx0LndlaWdodCArPSAyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpIHtcbiAgXy5mb3JFYWNoKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgZW50cnkudnMgPSBfLmZsYXR0ZW4oZW50cnkudnMubWFwKGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmIChzdWJncmFwaHNbdl0pIHtcbiAgICAgICAgcmV0dXJuIHN1YmdyYXBoc1t2XS52cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2O1xuICAgIH0pLCB0cnVlKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LCBvdGhlcikge1xuICBpZiAoIV8uaXNVbmRlZmluZWQodGFyZ2V0LmJhcnljZW50ZXIpKSB7XG4gICAgdGFyZ2V0LmJhcnljZW50ZXIgPSAodGFyZ2V0LmJhcnljZW50ZXIgKiB0YXJnZXQud2VpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5iYXJ5Y2VudGVyICogb3RoZXIud2VpZ2h0KSAvXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0LndlaWdodCArIG90aGVyLndlaWdodCk7XG4gICAgdGFyZ2V0LndlaWdodCArPSBvdGhlci53ZWlnaHQ7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LmJhcnljZW50ZXIgPSBvdGhlci5iYXJ5Y2VudGVyO1xuICAgIHRhcmdldC53ZWlnaHQgPSBvdGhlci53ZWlnaHQ7XG4gIH1cbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi4vZ3JhcGhsaWJcIikuR3JhcGg7XG5cbm1vZHVsZS5leHBvcnRzID0gYnVpbGRMYXllckdyYXBoO1xuXG4vKlxuICogQ29uc3RydWN0cyBhIGdyYXBoIHRoYXQgY2FuIGJlIHVzZWQgdG8gc29ydCBhIGxheWVyIG9mIG5vZGVzLiBUaGUgZ3JhcGggd2lsbFxuICogY29udGFpbiBhbGwgYmFzZSBhbmQgc3ViZ3JhcGggbm9kZXMgZnJvbSB0aGUgcmVxdWVzdCBsYXllciBpbiB0aGVpciBvcmlnaW5hbFxuICogaGllcmFyY2h5IGFuZCBhbnkgZWRnZXMgdGhhdCBhcmUgaW5jaWRlbnQgb24gdGhlc2Ugbm9kZXMgYW5kIGFyZSBvZiB0aGUgdHlwZVxuICogcmVxdWVzdGVkIGJ5IHRoZSBcInJlbGF0aW9uc2hpcFwiIHBhcmFtZXRlci5cbiAqXG4gKiBOb2RlcyBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuayB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMgYXJlIGFzc2lnbmVkIGEgcm9vdFxuICogbm9kZSBpbiB0aGUgb3V0cHV0IGdyYXBoLCB3aGljaCBpcyBzZXQgaW4gdGhlIHJvb3QgZ3JhcGggYXR0cmlidXRlLiBUaGlzXG4gKiBtYWtlcyBpdCBlYXN5IHRvIHdhbGsgdGhlIGhpZXJhcmNoeSBvZiBtb3ZhYmxlIG5vZGVzIGR1cmluZyBvcmRlcmluZy5cbiAqXG4gKiBQcmUtY29uZGl0aW9uczpcbiAqXG4gKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBR1xuICogICAgMi4gQmFzZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGF2ZSBhIHJhbmsgYXR0cmlidXRlXG4gKiAgICAzLiBTdWJncmFwaCBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIG1pblJhbmsgYW5kIG1heFJhbmsgYXR0cmlidXRlc1xuICogICAgNC4gRWRnZXMgaGF2ZSBhbiBhc3NpZ25lZCB3ZWlnaHRcbiAqXG4gKiBQb3N0LWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gT3V0cHV0IGdyYXBoIGhhcyBhbGwgbm9kZXMgaW4gdGhlIG1vdmFibGUgcmFuayB3aXRoIHByZXNlcnZlZFxuICogICAgICAgaGllcmFyY2h5LlxuICogICAgMi4gUm9vdCBub2RlcyBpbiB0aGUgbW92YWJsZSBsYXllciBhcmUgbWFkZSBjaGlsZHJlbiBvZiB0aGUgbm9kZVxuICogICAgICAgaW5kaWNhdGVkIGJ5IHRoZSByb290IGF0dHJpYnV0ZSBvZiB0aGUgZ3JhcGguXG4gKiAgICAzLiBOb24tbW92YWJsZSBub2RlcyBpbmNpZGVudCBvbiBtb3ZhYmxlIG5vZGVzLCBzZWxlY3RlZCBieSB0aGVcbiAqICAgICAgIHJlbGF0aW9uc2hpcCBwYXJhbWV0ZXIsIGFyZSBpbmNsdWRlZCBpbiB0aGUgZ3JhcGggKHdpdGhvdXQgaGllcmFyY2h5KS5cbiAqICAgIDQuIEVkZ2VzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZSByZWxhdGlvbnNoaXBcbiAqICAgICAgIHBhcmFtZXRlciwgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZ3JhcGguXG4gKiAgICA1LiBUaGUgd2VpZ2h0cyBmb3IgY29waWVkIGVkZ2VzIGFyZSBhZ2dyZWdhdGVkIGFzIG5lZWQsIHNpbmNlIHRoZSBvdXRwdXRcbiAqICAgICAgIGdyYXBoIGlzIG5vdCBhIG11bHRpLWdyYXBoLlxuICovXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZywgcmFuaywgcmVsYXRpb25zaGlwKSB7XG4gIHZhciByb290ID0gY3JlYXRlUm9vdE5vZGUoZyksXG4gICAgcmVzdWx0ID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUgfSkuc2V0R3JhcGgoeyByb290OiByb290IH0pXG4gICAgICAuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodik7IH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSxcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpO1xuXG4gICAgaWYgKG5vZGUucmFuayA9PT0gcmFuayB8fCBub2RlLm1pblJhbmsgPD0gcmFuayAmJiByYW5rIDw9IG5vZGUubWF4UmFuaykge1xuICAgICAgcmVzdWx0LnNldE5vZGUodik7XG4gICAgICByZXN1bHQuc2V0UGFyZW50KHYsIHBhcmVudCB8fCByb290KTtcblxuICAgICAgLy8gVGhpcyBhc3N1bWVzIHdlIGhhdmUgb25seSBzaG9ydCBlZGdlcyFcbiAgICAgIF8uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyIHUgPSBlLnYgPT09IHYgPyBlLncgOiBlLnYsXG4gICAgICAgICAgZWRnZSA9IHJlc3VsdC5lZGdlKHUsIHYpLFxuICAgICAgICAgIHdlaWdodCA9ICFfLmlzVW5kZWZpbmVkKGVkZ2UpID8gZWRnZS53ZWlnaHQgOiAwO1xuICAgICAgICByZXN1bHQuc2V0RWRnZSh1LCB2LCB7IHdlaWdodDogZy5lZGdlKGUpLndlaWdodCArIHdlaWdodCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXy5oYXMobm9kZSwgXCJtaW5SYW5rXCIpKSB7XG4gICAgICAgIHJlc3VsdC5zZXROb2RlKHYsIHtcbiAgICAgICAgICBib3JkZXJMZWZ0OiBub2RlLmJvcmRlckxlZnRbcmFua10sXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IG5vZGUuYm9yZGVyUmlnaHRbcmFua11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKSB7XG4gIHZhciB2O1xuICB3aGlsZSAoZy5oYXNOb2RlKCh2ID0gXy51bmlxdWVJZChcIl9yb290XCIpKSkpO1xuICByZXR1cm4gdjtcbn1cbiIsICJ2YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50cztcblxuZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLCBjZywgdnMpIHtcbiAgdmFyIHByZXYgPSB7fSxcbiAgICByb290UHJldjtcblxuICBfLmZvckVhY2godnMsIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgY2hpbGQgPSBnLnBhcmVudCh2KSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByZXZDaGlsZDtcbiAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgIHBhcmVudCA9IGcucGFyZW50KGNoaWxkKTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldltwYXJlbnRdO1xuICAgICAgICBwcmV2W3BhcmVudF0gPSBjaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHJvb3RQcmV2O1xuICAgICAgICByb290UHJldiA9IGNoaWxkO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIGNnLnNldEVkZ2UocHJldkNoaWxkLCBjaGlsZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkID0gcGFyZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgLypcbiAgZnVuY3Rpb24gZGZzKHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHN1YmdyYXBocyA9IFtdO1xuICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpO1xuICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7XG4gICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pO1xuICAgICAgfSk7XG4gICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsIFwib3JkZXJcIiksIGZ1bmN0aW9uKHByZXYsIGN1cnIpIHtcbiAgICAgICAgY2cuc2V0RWRnZShwcmV2LnYsIGN1cnIudik7XG4gICAgICAgIHJldHVybiBjdXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gZy5ub2RlKHYpLm9yZGVyO1xuICB9XG4gIGRmcyh1bmRlZmluZWQpO1xuICAqL1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgaW5pdE9yZGVyID0gcmVxdWlyZShcIi4vaW5pdC1vcmRlclwiKTtcbnZhciBjcm9zc0NvdW50ID0gcmVxdWlyZShcIi4vY3Jvc3MtY291bnRcIik7XG52YXIgc29ydFN1YmdyYXBoID0gcmVxdWlyZShcIi4vc29ydC1zdWJncmFwaFwiKTtcbnZhciBidWlsZExheWVyR3JhcGggPSByZXF1aXJlKFwiLi9idWlsZC1sYXllci1ncmFwaFwiKTtcbnZhciBhZGRTdWJncmFwaENvbnN0cmFpbnRzID0gcmVxdWlyZShcIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBvcmRlcjtcblxuLypcbiAqIEFwcGxpZXMgaGV1cmlzdGljcyB0byBtaW5pbWl6ZSBlZGdlIGNyb3NzaW5ncyBpbiB0aGUgZ3JhcGggYW5kIHNldHMgdGhlIGJlc3RcbiAqIG9yZGVyIHNvbHV0aW9uIGFzIGFuIG9yZGVyIGF0dHJpYnV0ZSBvbiBlYWNoIG5vZGUuXG4gKlxuICogUHJlLWNvbmRpdGlvbnM6XG4gKlxuICogICAgMS4gR3JhcGggbXVzdCBiZSBEQUdcbiAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0cyB3aXRoIGEgXCJyYW5rXCIgYXR0cmlidXRlXG4gKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgdGhlIFwid2VpZ2h0XCIgYXR0cmlidXRlXG4gKlxuICogUG9zdC1jb25kaXRpb25zOlxuICpcbiAqICAgIDEuIEdyYXBoIG5vZGVzIHdpbGwgaGF2ZSBhbiBcIm9yZGVyXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZVxuICogICAgICAgYWxnb3JpdGhtLlxuICovXG5mdW5jdGlvbiBvcmRlcihnKSB7XG4gIHZhciBtYXhSYW5rID0gdXRpbC5tYXhSYW5rKGcpLFxuICAgIGRvd25MYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgXy5yYW5nZSgxLCBtYXhSYW5rICsgMSksIFwiaW5FZGdlc1wiKSxcbiAgICB1cExheWVyR3JhcGhzID0gYnVpbGRMYXllckdyYXBocyhnLCBfLnJhbmdlKG1heFJhbmsgLSAxLCAtMSwgLTEpLCBcIm91dEVkZ2VzXCIpO1xuXG4gIHZhciBsYXllcmluZyA9IGluaXRPcmRlcihnKTtcbiAgYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpO1xuXG4gIHZhciBiZXN0Q0MgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgYmVzdDtcblxuICBmb3IgKHZhciBpID0gMCwgbGFzdEJlc3QgPSAwOyBsYXN0QmVzdCA8IDQ7ICsraSwgKytsYXN0QmVzdCkge1xuICAgIHN3ZWVwTGF5ZXJHcmFwaHMoaSAlIDIgPyBkb3duTGF5ZXJHcmFwaHMgOiB1cExheWVyR3JhcGhzLCBpICUgNCA+PSAyKTtcblxuICAgIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICAgIHZhciBjYyA9IGNyb3NzQ291bnQoZywgbGF5ZXJpbmcpO1xuICAgIGlmIChjYyA8IGJlc3RDQykge1xuICAgICAgbGFzdEJlc3QgPSAwO1xuICAgICAgYmVzdCA9IF8uY2xvbmVEZWVwKGxheWVyaW5nKTtcbiAgICAgIGJlc3RDQyA9IGNjO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbk9yZGVyKGcsIGJlc3QpO1xufVxuXG5mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcsIHJhbmtzLCByZWxhdGlvbnNoaXApIHtcbiAgcmV0dXJuIF8ubWFwKHJhbmtzLCBmdW5jdGlvbihyYW5rKSB7XG4gICAgcmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLCByYW5rLCByZWxhdGlvbnNoaXApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocywgYmlhc1JpZ2h0KSB7XG4gIHZhciBjZyA9IG5ldyBHcmFwaCgpO1xuICBfLmZvckVhY2gobGF5ZXJHcmFwaHMsIGZ1bmN0aW9uKGxnKSB7XG4gICAgdmFyIHJvb3QgPSBsZy5ncmFwaCgpLnJvb3Q7XG4gICAgdmFyIHNvcnRlZCA9IHNvcnRTdWJncmFwaChsZywgcm9vdCwgY2csIGJpYXNSaWdodCk7XG4gICAgXy5mb3JFYWNoKHNvcnRlZC52cywgZnVuY3Rpb24odiwgaSkge1xuICAgICAgbGcubm9kZSh2KS5vcmRlciA9IGk7XG4gICAgfSk7XG4gICAgYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhsZywgY2csIHNvcnRlZC52cyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25PcmRlcihnLCBsYXllcmluZykge1xuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7XG4gICAgICBnLm5vZGUodikub3JkZXIgPSBpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcblxudmFyIF8gPSByZXF1aXJlKFwiLi4vbG9kYXNoXCIpO1xudmFyIEdyYXBoID0gcmVxdWlyZShcIi4uL2dyYXBobGliXCIpLkdyYXBoO1xudmFyIHV0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcblxuLypcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGNvb3JkaW5hdGUgYXNzaWdubWVudCBiYXNlZCBvbiBCcmFuZGVzIGFuZCBLXHUwMEY2cGYsIFwiRmFzdFxuICogYW5kIFNpbXBsZSBIb3Jpem9udGFsIENvb3JkaW5hdGUgQXNzaWdubWVudC5cIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwb3NpdGlvblg6IHBvc2l0aW9uWCxcbiAgZmluZFR5cGUxQ29uZmxpY3RzOiBmaW5kVHlwZTFDb25mbGljdHMsXG4gIGZpbmRUeXBlMkNvbmZsaWN0czogZmluZFR5cGUyQ29uZmxpY3RzLFxuICBhZGRDb25mbGljdDogYWRkQ29uZmxpY3QsXG4gIGhhc0NvbmZsaWN0OiBoYXNDb25mbGljdCxcbiAgdmVydGljYWxBbGlnbm1lbnQ6IHZlcnRpY2FsQWxpZ25tZW50LFxuICBob3Jpem9udGFsQ29tcGFjdGlvbjogaG9yaXpvbnRhbENvbXBhY3Rpb24sXG4gIGFsaWduQ29vcmRpbmF0ZXM6IGFsaWduQ29vcmRpbmF0ZXMsXG4gIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxcbiAgYmFsYW5jZTogYmFsYW5jZVxufTtcblxuLypcbiAqIE1hcmtzIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggd2l0aCBhIHR5cGUtMSBjb25mbGljdCB3aXRoIHRoZSBcInR5cGUxQ29uZmxpY3RcIlxuICogcHJvcGVydHkuIEEgdHlwZS0xIGNvbmZsaWN0IGlzIG9uZSB3aGVyZSBhIG5vbi1pbm5lciBzZWdtZW50IGNyb3NzZXMgYW5cbiAqIGlubmVyIHNlZ21lbnQuIEFuIGlubmVyIHNlZ21lbnQgaXMgYW4gZWRnZSB3aXRoIGJvdGggaW5jaWRlbnQgbm9kZXMgbWFya2VkXG4gKiB3aXRoIHRoZSBcImR1bW15XCIgcHJvcGVydHkuXG4gKlxuICogVGhpcyBhbGdvcml0aG0gc2NhbnMgbGF5ZXIgYnkgbGF5ZXIsIHN0YXJ0aW5nIHdpdGggdGhlIHNlY29uZCwgZm9yIHR5cGUtMVxuICogY29uZmxpY3RzIGJldHdlZW4gdGhlIGN1cnJlbnQgbGF5ZXIgYW5kIHRoZSBwcmV2aW91cyBsYXllci4gRm9yIGVhY2ggbGF5ZXJcbiAqIGl0IHNjYW5zIHRoZSBub2RlcyBmcm9tIGxlZnQgdG8gcmlnaHQgdW50aWwgaXQgcmVhY2hlcyBvbmUgdGhhdCBpcyBpbmNpZGVudFxuICogb24gYW4gaW5uZXIgc2VnbWVudC4gSXQgdGhlbiBzY2FucyBwcmVkZWNlc3NvcnMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgaGF2ZVxuICogZWRnZXMgdGhhdCBjcm9zcyB0aGF0IGlubmVyIHNlZ21lbnQuIEF0IHRoZSBlbmQgYSBmaW5hbCBzY2FuIGlzIGRvbmUgZm9yIGFsbFxuICogbm9kZXMgb24gdGhlIGN1cnJlbnQgcmFuayB0byBzZWUgaWYgdGhleSBjcm9zcyB0aGUgbGFzdCB2aXNpdGVkIGlubmVyXG4gKiBzZWdtZW50LlxuICpcbiAqIFRoaXMgYWxnb3JpdGhtIChzYWZlbHkpIGFzc3VtZXMgdGhhdCBhIGR1bW15IG5vZGUgd2lsbCBvbmx5IGJlIGluY2lkZW50IG9uIGFcbiAqIHNpbmdsZSBub2RlIGluIHRoZSBsYXllcnMgYmVpbmcgc2Nhbm5lZC5cbiAqL1xuZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsIGxheWVyaW5nKSB7XG4gIHZhciBjb25mbGljdHMgPSB7fTtcblxuICBmdW5jdGlvbiB2aXNpdExheWVyKHByZXZMYXllciwgbGF5ZXIpIHtcbiAgICB2YXJcbiAgICAgIC8vIGxhc3QgdmlzaXRlZCBub2RlIGluIHRoZSBwcmV2aW91cyBsYXllciB0aGF0IGlzIGluY2lkZW50IG9uIGFuIGlubmVyXG4gICAgICAvLyBzZWdtZW50LlxuICAgICAgazAgPSAwLFxuICAgICAgLy8gVHJhY2tzIHRoZSBsYXN0IG5vZGUgaW4gdGhpcyBsYXllciBzY2FubmVkIGZvciBjcm9zc2luZ3Mgd2l0aCBhIHR5cGUtMVxuICAgICAgLy8gc2VnbWVudC5cbiAgICAgIHNjYW5Qb3MgPSAwLFxuICAgICAgcHJldkxheWVyTGVuZ3RoID0gcHJldkxheWVyLmxlbmd0aCxcbiAgICAgIGxhc3ROb2RlID0gXy5sYXN0KGxheWVyKTtcblxuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIHcgPSBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpLFxuICAgICAgICBrMSA9IHcgPyBnLm5vZGUodykub3JkZXIgOiBwcmV2TGF5ZXJMZW5ndGg7XG5cbiAgICAgIGlmICh3IHx8IHYgPT09IGxhc3ROb2RlKSB7XG4gICAgICAgIF8uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLCBpICsxKSwgZnVuY3Rpb24oc2Nhbk5vZGUpIHtcbiAgICAgICAgICBfLmZvckVhY2goZy5wcmVkZWNlc3NvcnMoc2Nhbk5vZGUpLCBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgICB2YXIgdUxhYmVsID0gZy5ub2RlKHUpLFxuICAgICAgICAgICAgICB1UG9zID0gdUxhYmVsLm9yZGVyO1xuICAgICAgICAgICAgaWYgKCh1UG9zIDwgazAgfHwgazEgPCB1UG9zKSAmJlxuICAgICAgICAgICAgICAgICEodUxhYmVsLmR1bW15ICYmIGcubm9kZShzY2FuTm9kZSkuZHVtbXkpKSB7XG4gICAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgc2Nhbk5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2NhblBvcyA9IGkgKyAxO1xuICAgICAgICBrMCA9IGsxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgXy5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpO1xuICByZXR1cm4gY29uZmxpY3RzO1xufVxuXG5mdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZywgbGF5ZXJpbmcpIHtcbiAgdmFyIGNvbmZsaWN0cyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aEVuZCwgcHJldk5vcnRoQm9yZGVyLCBuZXh0Tm9ydGhCb3JkZXIpIHtcbiAgICB2YXIgdjtcbiAgICBfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcywgc291dGhFbmQpLCBmdW5jdGlvbihpKSB7XG4gICAgICB2ID0gc291dGhbaV07XG4gICAgICBpZiAoZy5ub2RlKHYpLmR1bW15KSB7XG4gICAgICAgIF8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZnVuY3Rpb24odSkge1xuICAgICAgICAgIHZhciB1Tm9kZSA9IGcubm9kZSh1KTtcbiAgICAgICAgICBpZiAodU5vZGUuZHVtbXkgJiZcbiAgICAgICAgICAgICAgKHVOb2RlLm9yZGVyIDwgcHJldk5vcnRoQm9yZGVyIHx8IHVOb2RlLm9yZGVyID4gbmV4dE5vcnRoQm9yZGVyKSkge1xuICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBmdW5jdGlvbiB2aXNpdExheWVyKG5vcnRoLCBzb3V0aCkge1xuICAgIHZhciBwcmV2Tm9ydGhQb3MgPSAtMSxcbiAgICAgIG5leHROb3J0aFBvcyxcbiAgICAgIHNvdXRoUG9zID0gMDtcblxuICAgIF8uZm9yRWFjaChzb3V0aCwgZnVuY3Rpb24odiwgc291dGhMb29rYWhlYWQpIHtcbiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkgPT09IFwiYm9yZGVyXCIpIHtcbiAgICAgICAgdmFyIHByZWRlY2Vzc29ycyA9IGcucHJlZGVjZXNzb3JzKHYpO1xuICAgICAgICBpZiAocHJlZGVjZXNzb3JzLmxlbmd0aCkge1xuICAgICAgICAgIG5leHROb3J0aFBvcyA9IGcubm9kZShwcmVkZWNlc3NvcnNbMF0pLm9yZGVyO1xuICAgICAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aExvb2thaGVhZCwgcHJldk5vcnRoUG9zLCBuZXh0Tm9ydGhQb3MpO1xuICAgICAgICAgIHNvdXRoUG9zID0gc291dGhMb29rYWhlYWQ7XG4gICAgICAgICAgcHJldk5vcnRoUG9zID0gbmV4dE5vcnRoUG9zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGgubGVuZ3RoLCBuZXh0Tm9ydGhQb3MsIG5vcnRoLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc291dGg7XG4gIH1cblxuICBfLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7XG4gIHJldHVybiBjb25mbGljdHM7XG59XG5cbmZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZywgdikge1xuICBpZiAoZy5ub2RlKHYpLmR1bW15KSB7XG4gICAgcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSwgZnVuY3Rpb24odSkge1xuICAgICAgcmV0dXJuIGcubm9kZSh1KS5kdW1teTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsIHYsIHcpIHtcbiAgaWYgKHYgPiB3KSB7XG4gICAgdmFyIHRtcCA9IHY7XG4gICAgdiA9IHc7XG4gICAgdyA9IHRtcDtcbiAgfVxuXG4gIHZhciBjb25mbGljdHNWID0gY29uZmxpY3RzW3ZdO1xuICBpZiAoIWNvbmZsaWN0c1YpIHtcbiAgICBjb25mbGljdHNbdl0gPSBjb25mbGljdHNWID0ge307XG4gIH1cbiAgY29uZmxpY3RzVlt3XSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cywgdiwgdykge1xuICBpZiAodiA+IHcpIHtcbiAgICB2YXIgdG1wID0gdjtcbiAgICB2ID0gdztcbiAgICB3ID0gdG1wO1xuICB9XG4gIHJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sIHcpO1xufVxuXG4vKlxuICogVHJ5IHRvIGFsaWduIG5vZGVzIGludG8gdmVydGljYWwgXCJibG9ja3NcIiB3aGVyZSBwb3NzaWJsZS4gVGhpcyBhbGdvcml0aG1cbiAqIGF0dGVtcHRzIHRvIGFsaWduIGEgbm9kZSB3aXRoIG9uZSBvZiBpdHMgbWVkaWFuIG5laWdoYm9ycy4gSWYgdGhlIGVkZ2VcbiAqIGNvbm5lY3RpbmcgYSBuZWlnaGJvciBpcyBhIHR5cGUtMSBjb25mbGljdCB0aGVuIHdlIGlnbm9yZSB0aGF0IHBvc3NpYmlsaXR5LlxuICogSWYgYSBwcmV2aW91cyBub2RlIGhhcyBhbHJlYWR5IGZvcm1lZCBhIGJsb2NrIHdpdGggYSBub2RlIGFmdGVyIHRoZSBub2RlXG4gKiB3ZSdyZSB0cnlpbmcgdG8gZm9ybSBhIGJsb2NrIHdpdGgsIHdlIGFsc28gaWdub3JlIHRoYXQgcG9zc2liaWxpdHkgLSBvdXJcbiAqIGJsb2NrcyB3b3VsZCBiZSBzcGxpdCBpbiB0aGF0IHNjZW5hcmlvLlxuICovXG5mdW5jdGlvbiB2ZXJ0aWNhbEFsaWdubWVudChnLCBsYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKSB7XG4gIHZhciByb290ID0ge30sXG4gICAgYWxpZ24gPSB7fSxcbiAgICBwb3MgPSB7fTtcblxuICAvLyBXZSBjYWNoZSB0aGUgcG9zaXRpb24gaGVyZSBiYXNlZCBvbiB0aGUgbGF5ZXJpbmcgYmVjYXVzZSB0aGUgZ3JhcGggYW5kXG4gIC8vIGxheWVyaW5nIG1heSBiZSBvdXQgb2Ygc3luYy4gVGhlIGxheWVyaW5nIG1hdHJpeCBpcyBtYW5pcHVsYXRlZCB0b1xuICAvLyBnZW5lcmF0ZSBkaWZmZXJlbnQgZXh0cmVtZSBhbGlnbm1lbnRzLlxuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBvcmRlcikge1xuICAgICAgcm9vdFt2XSA9IHY7XG4gICAgICBhbGlnblt2XSA9IHY7XG4gICAgICBwb3Nbdl0gPSBvcmRlcjtcbiAgICB9KTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikge1xuICAgIHZhciBwcmV2SWR4ID0gLTE7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICB2YXIgd3MgPSBuZWlnaGJvckZuKHYpO1xuICAgICAgaWYgKHdzLmxlbmd0aCkge1xuICAgICAgICB3cyA9IF8uc29ydEJ5KHdzLCBmdW5jdGlvbih3KSB7IHJldHVybiBwb3Nbd107IH0pO1xuICAgICAgICB2YXIgbXAgPSAod3MubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihtcCksIGlsID0gTWF0aC5jZWlsKG1wKTsgaSA8PSBpbDsgKytpKSB7XG4gICAgICAgICAgdmFyIHcgPSB3c1tpXTtcbiAgICAgICAgICBpZiAoYWxpZ25bdl0gPT09IHYgJiZcbiAgICAgICAgICAgICAgcHJldklkeCA8IHBvc1t3XSAmJlxuICAgICAgICAgICAgICAhaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSkge1xuICAgICAgICAgICAgYWxpZ25bd10gPSB2O1xuICAgICAgICAgICAgYWxpZ25bdl0gPSByb290W3ZdID0gcm9vdFt3XTtcbiAgICAgICAgICAgIHByZXZJZHggPSBwb3Nbd107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7IHJvb3Q6IHJvb3QsIGFsaWduOiBhbGlnbiB9O1xufVxuXG5mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLCBsYXllcmluZywgcm9vdCwgYWxpZ24sIHJldmVyc2VTZXApIHtcbiAgLy8gVGhpcyBwb3J0aW9uIG9mIHRoZSBhbGdvcml0aG0gZGlmZmVycyBmcm9tIEJLIGR1ZSB0byBhIG51bWJlciBvZiBwcm9ibGVtcy5cbiAgLy8gSW5zdGVhZCBvZiB0aGVpciBhbGdvcml0aG0gd2UgY29uc3RydWN0IGEgbmV3IGJsb2NrIGdyYXBoIGFuZCBkbyB0d29cbiAgLy8gc3dlZXBzLiBUaGUgZmlyc3Qgc3dlZXAgcGxhY2VzIGJsb2NrcyB3aXRoIHRoZSBzbWFsbGVzdCBwb3NzaWJsZVxuICAvLyBjb29yZGluYXRlcy4gVGhlIHNlY29uZCBzd2VlcCByZW1vdmVzIHVudXNlZCBzcGFjZSBieSBtb3ZpbmcgYmxvY2tzIHRvIHRoZVxuICAvLyBncmVhdGVzdCBjb29yZGluYXRlcyB3aXRob3V0IHZpb2xhdGluZyBzZXBhcmF0aW9uLlxuICB2YXIgeHMgPSB7fSxcbiAgICBibG9ja0cgPSBidWlsZEJsb2NrR3JhcGgoZywgbGF5ZXJpbmcsIHJvb3QsIHJldmVyc2VTZXApLFxuICAgIGJvcmRlclR5cGUgPSByZXZlcnNlU2VwID8gXCJib3JkZXJMZWZ0XCIgOiBcImJvcmRlclJpZ2h0XCI7XG5cbiAgZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsIG5leHROb2Rlc0Z1bmMpIHtcbiAgICB2YXIgc3RhY2sgPSBibG9ja0cubm9kZXMoKTtcbiAgICB2YXIgZWxlbSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB2aXNpdGVkID0ge307XG4gICAgd2hpbGUgKGVsZW0pIHtcbiAgICAgIGlmICh2aXNpdGVkW2VsZW1dKSB7XG4gICAgICAgIHNldFhzRnVuYyhlbGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2l0ZWRbZWxlbV0gPSB0cnVlO1xuICAgICAgICBzdGFjay5wdXNoKGVsZW0pO1xuICAgICAgICBzdGFjayA9IHN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKTtcbiAgICAgIH1cblxuICAgICAgZWxlbSA9IHN0YWNrLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpcnN0IHBhc3MsIGFzc2lnbiBzbWFsbGVzdCBjb29yZGluYXRlc1xuICBmdW5jdGlvbiBwYXNzMShlbGVtKSB7XG4gICAgeHNbZWxlbV0gPSBibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoYWNjLCB4c1tlLnZdICsgYmxvY2tHLmVkZ2UoZSkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gU2Vjb25kIHBhc3MsIGFzc2lnbiBncmVhdGVzdCBjb29yZGluYXRlc1xuICBmdW5jdGlvbiBwYXNzMihlbGVtKSB7XG4gICAgdmFyIG1pbiA9IGJsb2NrRy5vdXRFZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBlKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4oYWNjLCB4c1tlLnddIC0gYmxvY2tHLmVkZ2UoZSkpO1xuICAgIH0sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG5cbiAgICB2YXIgbm9kZSA9IGcubm9kZShlbGVtKTtcbiAgICBpZiAobWluICE9PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgJiYgbm9kZS5ib3JkZXJUeXBlICE9PSBib3JkZXJUeXBlKSB7XG4gICAgICB4c1tlbGVtXSA9IE1hdGgubWF4KHhzW2VsZW1dLCBtaW4pO1xuICAgIH1cbiAgfVxuXG4gIGl0ZXJhdGUocGFzczEsIGJsb2NrRy5wcmVkZWNlc3NvcnMuYmluZChibG9ja0cpKTtcbiAgaXRlcmF0ZShwYXNzMiwgYmxvY2tHLnN1Y2Nlc3NvcnMuYmluZChibG9ja0cpKTtcblxuICAvLyBBc3NpZ24geCBjb29yZGluYXRlcyB0byBhbGwgbm9kZXNcbiAgXy5mb3JFYWNoKGFsaWduLCBmdW5jdGlvbih2KSB7XG4gICAgeHNbdl0gPSB4c1tyb290W3ZdXTtcbiAgfSk7XG5cbiAgcmV0dXJuIHhzO1xufVxuXG5cbmZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLCBsYXllcmluZywgcm9vdCwgcmV2ZXJzZVNlcCkge1xuICB2YXIgYmxvY2tHcmFwaCA9IG5ldyBHcmFwaCgpLFxuICAgIGdyYXBoTGFiZWwgPSBnLmdyYXBoKCksXG4gICAgc2VwRm4gPSBzZXAoZ3JhcGhMYWJlbC5ub2Rlc2VwLCBncmFwaExhYmVsLmVkZ2VzZXAsIHJldmVyc2VTZXApO1xuXG4gIF8uZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHtcbiAgICB2YXIgdTtcbiAgICBfLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHZhciB2Um9vdCA9IHJvb3Rbdl07XG4gICAgICBibG9ja0dyYXBoLnNldE5vZGUodlJvb3QpO1xuICAgICAgaWYgKHUpIHtcbiAgICAgICAgdmFyIHVSb290ID0gcm9vdFt1XSxcbiAgICAgICAgICBwcmV2TWF4ID0gYmxvY2tHcmFwaC5lZGdlKHVSb290LCB2Um9vdCk7XG4gICAgICAgIGJsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCwgdlJvb3QsIE1hdGgubWF4KHNlcEZuKGcsIHYsIHUpLCBwcmV2TWF4IHx8IDApKTtcbiAgICAgIH1cbiAgICAgIHUgPSB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gYmxvY2tHcmFwaDtcbn1cblxuLypcbiAqIFJldHVybnMgdGhlIGFsaWdubWVudCB0aGF0IGhhcyB0aGUgc21hbGxlc3Qgd2lkdGggb2YgdGhlIGdpdmVuIGFsaWdubWVudHMuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcsIHhzcykge1xuICByZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLCBmdW5jdGlvbiAoeHMpIHtcbiAgICB2YXIgbWF4ID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbiAgICBfLmZvckluKHhzLCBmdW5jdGlvbiAoeCwgdikge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoKGcsIHYpIC8gMjtcblxuICAgICAgbWF4ID0gTWF0aC5tYXgoeCArIGhhbGZXaWR0aCwgbWF4KTtcbiAgICAgIG1pbiA9IE1hdGgubWluKHggLSBoYWxmV2lkdGgsIG1pbik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF4IC0gbWluO1xuICB9KTtcbn1cblxuLypcbiAqIEFsaWduIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIG9mIHRoZSBsYXlvdXQgYWxpZ25tZW50cyBzdWNoIHRoYXRcbiAqIGxlZnQtYmlhc2VkIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtaW5pbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXNcbiAqIHRoZSBtaW5pbXVtIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudCBhbmQgcmlnaHQtYmlhc2VkXG4gKiBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWF4aW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzIHRoZSBtYXhpbXVtXG4gKiBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBhbGlnblRvKSB7XG4gIHZhciBhbGlnblRvVmFscyA9IF8udmFsdWVzKGFsaWduVG8pLFxuICAgIGFsaWduVG9NaW4gPSBfLm1pbihhbGlnblRvVmFscyksXG4gICAgYWxpZ25Ub01heCA9IF8ubWF4KGFsaWduVG9WYWxzKTtcblxuICBfLmZvckVhY2goW1widVwiLCBcImRcIl0sIGZ1bmN0aW9uKHZlcnQpIHtcbiAgICBfLmZvckVhY2goW1wibFwiLCBcInJcIl0sIGZ1bmN0aW9uKGhvcml6KSB7XG4gICAgICB2YXIgYWxpZ25tZW50ID0gdmVydCArIGhvcml6LFxuICAgICAgICB4cyA9IHhzc1thbGlnbm1lbnRdLFxuICAgICAgICBkZWx0YTtcbiAgICAgIGlmICh4cyA9PT0gYWxpZ25UbykgcmV0dXJuO1xuXG4gICAgICB2YXIgeHNWYWxzID0gXy52YWx1ZXMoeHMpO1xuICAgICAgZGVsdGEgPSBob3JpeiA9PT0gXCJsXCIgPyBhbGlnblRvTWluIC0gXy5taW4oeHNWYWxzKSA6IGFsaWduVG9NYXggLSBfLm1heCh4c1ZhbHMpO1xuXG4gICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgeHNzW2FsaWdubWVudF0gPSBfLm1hcFZhbHVlcyh4cywgZnVuY3Rpb24oeCkgeyByZXR1cm4geCArIGRlbHRhOyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJhbGFuY2UoeHNzLCBhbGlnbikge1xuICByZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLCBmdW5jdGlvbihpZ25vcmUsIHYpIHtcbiAgICBpZiAoYWxpZ24pIHtcbiAgICAgIHJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB4cyA9IF8uc29ydEJ5KF8ubWFwKHhzcywgdikpO1xuICAgICAgcmV0dXJuICh4c1sxXSArIHhzWzJdKSAvIDI7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25YKGcpIHtcbiAgdmFyIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICB2YXIgY29uZmxpY3RzID0gXy5tZXJnZShcbiAgICBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpLFxuICAgIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykpO1xuXG4gIHZhciB4c3MgPSB7fTtcbiAgdmFyIGFkanVzdGVkTGF5ZXJpbmc7XG4gIF8uZm9yRWFjaChbXCJ1XCIsIFwiZFwiXSwgZnVuY3Rpb24odmVydCkge1xuICAgIGFkanVzdGVkTGF5ZXJpbmcgPSB2ZXJ0ID09PSBcInVcIiA/IGxheWVyaW5nIDogXy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtcbiAgICBfLmZvckVhY2goW1wibFwiLCBcInJcIl0sIGZ1bmN0aW9uKGhvcml6KSB7XG4gICAgICBpZiAoaG9yaXogPT09IFwiclwiKSB7XG4gICAgICAgIGFkanVzdGVkTGF5ZXJpbmcgPSBfLm1hcChhZGp1c3RlZExheWVyaW5nLCBmdW5jdGlvbihpbm5lcikge1xuICAgICAgICAgIHJldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5laWdoYm9yRm4gPSAodmVydCA9PT0gXCJ1XCIgPyBnLnByZWRlY2Vzc29ycyA6IGcuc3VjY2Vzc29ycykuYmluZChnKTtcbiAgICAgIHZhciBhbGlnbiA9IHZlcnRpY2FsQWxpZ25tZW50KGcsIGFkanVzdGVkTGF5ZXJpbmcsIGNvbmZsaWN0cywgbmVpZ2hib3JGbik7XG4gICAgICB2YXIgeHMgPSBob3Jpem9udGFsQ29tcGFjdGlvbihnLCBhZGp1c3RlZExheWVyaW5nLFxuICAgICAgICBhbGlnbi5yb290LCBhbGlnbi5hbGlnbiwgaG9yaXogPT09IFwiclwiKTtcbiAgICAgIGlmIChob3JpeiA9PT0gXCJyXCIpIHtcbiAgICAgICAgeHMgPSBfLm1hcFZhbHVlcyh4cywgZnVuY3Rpb24oeCkgeyByZXR1cm4gLXg7IH0pO1xuICAgICAgfVxuICAgICAgeHNzW3ZlcnQgKyBob3Jpel0gPSB4cztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdmFyIHNtYWxsZXN0V2lkdGggPSBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpO1xuICBhbGlnbkNvb3JkaW5hdGVzKHhzcywgc21hbGxlc3RXaWR0aCk7XG4gIHJldHVybiBiYWxhbmNlKHhzcywgZy5ncmFwaCgpLmFsaWduKTtcbn1cblxuZnVuY3Rpb24gc2VwKG5vZGVTZXAsIGVkZ2VTZXAsIHJldmVyc2VTZXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGcsIHYsIHcpIHtcbiAgICB2YXIgdkxhYmVsID0gZy5ub2RlKHYpO1xuICAgIHZhciB3TGFiZWwgPSBnLm5vZGUodyk7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGRlbHRhO1xuXG4gICAgc3VtICs9IHZMYWJlbC53aWR0aCAvIDI7XG4gICAgaWYgKF8uaGFzKHZMYWJlbCwgXCJsYWJlbHBvc1wiKSkge1xuICAgICAgc3dpdGNoICh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcImxcIjogZGVsdGEgPSAtdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICBjYXNlIFwiclwiOiBkZWx0YSA9IHZMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHN1bSArPSByZXZlcnNlU2VwID8gZGVsdGEgOiAtZGVsdGE7XG4gICAgfVxuICAgIGRlbHRhID0gMDtcblxuICAgIHN1bSArPSAodkxhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjtcbiAgICBzdW0gKz0gKHdMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7XG5cbiAgICBzdW0gKz0gd0xhYmVsLndpZHRoIC8gMjtcbiAgICBpZiAoXy5oYXMod0xhYmVsLCBcImxhYmVscG9zXCIpKSB7XG4gICAgICBzd2l0Y2ggKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlIFwibFwiOiBkZWx0YSA9IHdMYWJlbC53aWR0aCAvIDI7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZGVsdGEgPSAtd0xhYmVsLndpZHRoIC8gMjsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YSkge1xuICAgICAgc3VtICs9IHJldmVyc2VTZXAgPyBkZWx0YSA6IC1kZWx0YTtcbiAgICB9XG4gICAgZGVsdGEgPSAwO1xuXG4gICAgcmV0dXJuIHN1bTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2lkdGgoZywgdikge1xuICByZXR1cm4gZy5ub2RlKHYpLndpZHRoO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xudmFyIHBvc2l0aW9uWCA9IHJlcXVpcmUoXCIuL2JrXCIpLnBvc2l0aW9uWDtcblxubW9kdWxlLmV4cG9ydHMgPSBwb3NpdGlvbjtcblxuZnVuY3Rpb24gcG9zaXRpb24oZykge1xuICBnID0gdXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7XG5cbiAgcG9zaXRpb25ZKGcpO1xuICBfLmZvckVhY2gocG9zaXRpb25YKGcpLCBmdW5jdGlvbih4LCB2KSB7XG4gICAgZy5ub2RlKHYpLnggPSB4O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25ZKGcpIHtcbiAgdmFyIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuICB2YXIgcmFua1NlcCA9IGcuZ3JhcGgoKS5yYW5rc2VwO1xuICB2YXIgcHJldlkgPSAwO1xuICBfLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG1heEhlaWdodCA9IF8ubWF4KF8ubWFwKGxheWVyLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikuaGVpZ2h0OyB9KSk7XG4gICAgXy5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7XG4gICAgICBnLm5vZGUodikueSA9IHByZXZZICsgbWF4SGVpZ2h0IC8gMjtcbiAgICB9KTtcbiAgICBwcmV2WSArPSBtYXhIZWlnaHQgKyByYW5rU2VwO1xuICB9KTtcbn1cblxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgXyA9IHJlcXVpcmUoXCIuL2xvZGFzaFwiKTtcbnZhciBhY3ljbGljID0gcmVxdWlyZShcIi4vYWN5Y2xpY1wiKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKFwiLi9ub3JtYWxpemVcIik7XG52YXIgcmFuayA9IHJlcXVpcmUoXCIuL3JhbmtcIik7XG52YXIgbm9ybWFsaXplUmFua3MgPSByZXF1aXJlKFwiLi91dGlsXCIpLm5vcm1hbGl6ZVJhbmtzO1xudmFyIHBhcmVudER1bW15Q2hhaW5zID0gcmVxdWlyZShcIi4vcGFyZW50LWR1bW15LWNoYWluc1wiKTtcbnZhciByZW1vdmVFbXB0eVJhbmtzID0gcmVxdWlyZShcIi4vdXRpbFwiKS5yZW1vdmVFbXB0eVJhbmtzO1xudmFyIG5lc3RpbmdHcmFwaCA9IHJlcXVpcmUoXCIuL25lc3RpbmctZ3JhcGhcIik7XG52YXIgYWRkQm9yZGVyU2VnbWVudHMgPSByZXF1aXJlKFwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzXCIpO1xudmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSByZXF1aXJlKFwiLi9jb29yZGluYXRlLXN5c3RlbVwiKTtcbnZhciBvcmRlciA9IHJlcXVpcmUoXCIuL29yZGVyXCIpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZShcIi4vcG9zaXRpb25cIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSBsYXlvdXQ7XG5cbmZ1bmN0aW9uIGxheW91dChnLCBvcHRzKSB7XG4gIHZhciB0aW1lID0gb3B0cyAmJiBvcHRzLmRlYnVnVGltaW5nID8gdXRpbC50aW1lIDogdXRpbC5ub3RpbWU7XG4gIHRpbWUoXCJsYXlvdXRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxheW91dEdyYXBoID0gXG4gICAgICB0aW1lKFwiICBidWlsZExheW91dEdyYXBoXCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKTsgfSk7XG4gICAgdGltZShcIiAgcnVuTGF5b3V0XCIsICAgICAgICBmdW5jdGlvbigpIHsgcnVuTGF5b3V0KGxheW91dEdyYXBoLCB0aW1lKTsgfSk7XG4gICAgdGltZShcIiAgdXBkYXRlSW5wdXRHcmFwaFwiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuTGF5b3V0KGcsIHRpbWUpIHtcbiAgdGltZShcIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzXCIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFjeWNsaWNcIiwgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBuZXN0aW5nR3JhcGgucnVuXCIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICByYW5rXCIsICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKTsgfSk7XG4gIHRpbWUoXCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllc1wiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgcmVtb3ZlRW1wdHlSYW5rc1wiLCAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlRW1wdHlSYW5rcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXBcIiwgICBmdW5jdGlvbigpIHsgbmVzdGluZ0dyYXBoLmNsZWFudXAoZyk7IH0pO1xuICB0aW1lKFwiICAgIG5vcm1hbGl6ZVJhbmtzXCIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZVJhbmtzKGcpOyB9KTtcbiAgdGltZShcIiAgICBhc3NpZ25SYW5rTWluTWF4XCIsICAgICAgIGZ1bmN0aW9uKCkgeyBhc3NpZ25SYW5rTWluTWF4KGcpOyB9KTtcbiAgdGltZShcIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzXCIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUucnVuXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUucnVuKGcpOyB9KTtcbiAgdGltZShcIiAgICBwYXJlbnREdW1teUNoYWluc1wiLCAgICAgIGZ1bmN0aW9uKCkgeyBwYXJlbnREdW1teUNoYWlucyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWRkQm9yZGVyU2VnbWVudHNcIiwgICAgICBmdW5jdGlvbigpIHsgYWRkQm9yZGVyU2VnbWVudHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIG9yZGVyXCIsICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IG9yZGVyKGcpOyB9KTtcbiAgdGltZShcIiAgICBpbnNlcnRTZWxmRWRnZXNcIiwgICAgICAgIGZ1bmN0aW9uKCkgeyBpbnNlcnRTZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW1cIiwgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpOyB9KTtcbiAgdGltZShcIiAgICBwb3NpdGlvblwiLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbihnKTsgfSk7XG4gIHRpbWUoXCIgICAgcG9zaXRpb25TZWxmRWRnZXNcIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHJlbW92ZUJvcmRlck5vZGVzXCIsICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUJvcmRlck5vZGVzKGcpOyB9KTtcbiAgdGltZShcIiAgICBub3JtYWxpemUudW5kb1wiLCAgICAgICAgIGZ1bmN0aW9uKCkgeyBub3JtYWxpemUudW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHNcIiwgICBmdW5jdGlvbigpIHsgZml4dXBFZGdlTGFiZWxDb29yZHMoZyk7IH0pO1xuICB0aW1lKFwiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtXCIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgdHJhbnNsYXRlR3JhcGhcIiwgICAgICAgICBmdW5jdGlvbigpIHsgdHJhbnNsYXRlR3JhcGgoZyk7IH0pO1xuICB0aW1lKFwiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzXCIsICAgZnVuY3Rpb24oKSB7IGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpOyB9KTtcbiAgdGltZShcIiAgICByZXZlcnNlUG9pbnRzXCIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7XG4gIHRpbWUoXCIgICAgYWN5Y2xpYy51bmRvXCIsICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy51bmRvKGcpOyB9KTtcbn1cblxuLypcbiAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0XG4gKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoXG4gKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHtcbiAgXy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikge1xuICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpO1xuICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7XG5cbiAgICBpZiAoaW5wdXRMYWJlbCkge1xuICAgICAgaW5wdXRMYWJlbC54ID0gbGF5b3V0TGFiZWwueDtcbiAgICAgIGlucHV0TGFiZWwueSA9IGxheW91dExhYmVsLnk7XG5cbiAgICAgIGlmIChsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgICAgaW5wdXRMYWJlbC53aWR0aCA9IGxheW91dExhYmVsLndpZHRoO1xuICAgICAgICBpbnB1dExhYmVsLmhlaWdodCA9IGxheW91dExhYmVsLmhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTtcbiAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpO1xuXG4gICAgaW5wdXRMYWJlbC5wb2ludHMgPSBsYXlvdXRMYWJlbC5wb2ludHM7XG4gICAgaWYgKF8uaGFzKGxheW91dExhYmVsLCBcInhcIikpIHtcbiAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7XG4gICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55O1xuICAgIH1cbiAgfSk7XG5cbiAgaW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoID0gbGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDtcbiAgaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodCA9IGxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0O1xufVxuXG52YXIgZ3JhcGhOdW1BdHRycyA9IFtcIm5vZGVzZXBcIiwgXCJlZGdlc2VwXCIsIFwicmFua3NlcFwiLCBcIm1hcmdpbnhcIiwgXCJtYXJnaW55XCJdO1xudmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6IFwidGJcIiB9O1xudmFyIGdyYXBoQXR0cnMgPSBbXCJhY3ljbGljZXJcIiwgXCJyYW5rZXJcIiwgXCJyYW5rZGlyXCIsIFwiYWxpZ25cIl07XG52YXIgbm9kZU51bUF0dHJzID0gW1wid2lkdGhcIiwgXCJoZWlnaHRcIl07XG52YXIgbm9kZURlZmF1bHRzID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG52YXIgZWRnZU51bUF0dHJzID0gW1wibWlubGVuXCIsIFwid2VpZ2h0XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJsYWJlbG9mZnNldFwiXTtcbnZhciBlZGdlRGVmYXVsdHMgPSB7XG4gIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxuICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiBcInJcIlxufTtcbnZhciBlZGdlQXR0cnMgPSBbXCJsYWJlbHBvc1wiXTtcblxuLypcbiAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggZnJvbSB0aGUgaW5wdXQgZ3JhcGgsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBsYXlvdXQuXG4gKiBUaGlzIHByb2Nlc3MgY29waWVzIG9ubHkgd2hpdGVsaXN0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBpbnB1dCBncmFwaCB0byB0aGVcbiAqIGxheW91dCBncmFwaC4gVGh1cyB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXRcbiAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCkge1xuICB2YXIgZyA9IG5ldyBHcmFwaCh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pO1xuICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtcblxuICBnLnNldEdyYXBoKF8ubWVyZ2Uoe30sXG4gICAgZ3JhcGhEZWZhdWx0cyxcbiAgICBzZWxlY3ROdW1iZXJBdHRycyhncmFwaCwgZ3JhcGhOdW1BdHRycyksXG4gICAgXy5waWNrKGdyYXBoLCBncmFwaEF0dHJzKSkpO1xuXG4gIF8uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO1xuICAgIGcuc2V0Tm9kZSh2LCBfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsIG5vZGVOdW1BdHRycyksIG5vZGVEZWZhdWx0cykpO1xuICAgIGcuc2V0UGFyZW50KHYsIGlucHV0R3JhcGgucGFyZW50KHYpKTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7XG4gICAgZy5zZXRFZGdlKGUsIF8ubWVyZ2Uoe30sXG4gICAgICBlZGdlRGVmYXVsdHMsXG4gICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLFxuICAgICAgXy5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgR2Fuc25lciBwYXBlcjogdG8gYWNjb3VudCBmb3IgZWRnZSBsYWJlbHMgaW4gb3VyXG4gKiBsYXlvdXQgd2Ugc3BsaXQgZWFjaCByYW5rIGluIGhhbGYgYnkgZG91YmxpbmcgbWlubGVuIGFuZCBoYWx2aW5nIHJhbmtzZXAuXG4gKiBUaGVuIHdlIGNhbiBwbGFjZSBsYWJlbHMgYXQgdGhlc2UgbWlkLXBvaW50cyBiZXR3ZWVuIG5vZGVzLlxuICpcbiAqIFdlIGFsc28gYWRkIHNvbWUgbWluaW1hbCBwYWRkaW5nIHRvIHRoZSB3aWR0aCB0byBwdXNoIHRoZSBsYWJlbCBmb3IgdGhlIGVkZ2VcbiAqIGF3YXkgZnJvbSB0aGUgZWRnZSBpdHNlbGYgYSBiaXQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZykge1xuICB2YXIgZ3JhcGggPSBnLmdyYXBoKCk7XG4gIGdyYXBoLnJhbmtzZXAgLz0gMjtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGVkZ2UubWlubGVuICo9IDI7XG4gICAgaWYgKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSAhPT0gXCJjXCIpIHtcbiAgICAgIGlmIChncmFwaC5yYW5rZGlyID09PSBcIlRCXCIgfHwgZ3JhcGgucmFua2RpciA9PT0gXCJCVFwiKSB7XG4gICAgICAgIGVkZ2Uud2lkdGggKz0gZWRnZS5sYWJlbG9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkZ2UuaGVpZ2h0ICs9IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLypcbiAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2Unc1xuICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpc1xuICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZVxuICogbGFiZWwncyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkge1xuICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTtcbiAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7XG4gICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9O1xuICAgICAgdXRpbC5hZGREdW1teU5vZGUoZywgXCJlZGdlLXByb3h5XCIsIGxhYmVsLCBcIl9lcFwiKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHtcbiAgdmFyIG1heFJhbmsgPSAwO1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7XG4gICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7XG4gICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7XG4gICAgICBtYXhSYW5rID0gXy5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTtcbiAgICB9XG4gIH0pO1xuICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwiZWRnZS1wcm94eVwiKSB7XG4gICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZykge1xuICB2YXIgbWluWCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFggPSAwO1xuICB2YXIgbWluWSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgdmFyIG1heFkgPSAwO1xuICB2YXIgZ3JhcGhMYWJlbCA9IGcuZ3JhcGgoKTtcbiAgdmFyIG1hcmdpblggPSBncmFwaExhYmVsLm1hcmdpbnggfHwgMDtcbiAgdmFyIG1hcmdpblkgPSBncmFwaExhYmVsLm1hcmdpbnkgfHwgMDtcblxuICBmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycykge1xuICAgIHZhciB4ID0gYXR0cnMueDtcbiAgICB2YXIgeSA9IGF0dHJzLnk7XG4gICAgdmFyIHcgPSBhdHRycy53aWR0aDtcbiAgICB2YXIgaCA9IGF0dHJzLmhlaWdodDtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCAtIHcgLyAyKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCArIHcgLyAyKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSAtIGggLyAyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSArIGggLyAyKTtcbiAgfVxuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7XG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7XG4gICAgICBnZXRFeHRyZW1lcyhlZGdlKTtcbiAgICB9XG4gIH0pO1xuXG4gIG1pblggLT0gbWFyZ2luWDtcbiAgbWluWSAtPSBtYXJnaW5ZO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTtcbiAgICBub2RlLnggLT0gbWluWDtcbiAgICBub2RlLnkgLT0gbWluWTtcbiAgfSk7XG5cbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIF8uZm9yRWFjaChlZGdlLnBvaW50cywgZnVuY3Rpb24ocCkge1xuICAgICAgcC54IC09IG1pblg7XG4gICAgICBwLnkgLT0gbWluWTtcbiAgICB9KTtcbiAgICBpZiAoXy5oYXMoZWRnZSwgXCJ4XCIpKSB7IGVkZ2UueCAtPSBtaW5YOyB9XG4gICAgaWYgKF8uaGFzKGVkZ2UsIFwieVwiKSkgeyBlZGdlLnkgLT0gbWluWTsgfVxuICB9KTtcblxuICBncmFwaExhYmVsLndpZHRoID0gbWF4WCAtIG1pblggKyBtYXJnaW5YO1xuICBncmFwaExhYmVsLmhlaWdodCA9IG1heFkgLSBtaW5ZICsgbWFyZ2luWTtcbn1cblxuZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgdmFyIG5vZGVWID0gZy5ub2RlKGUudik7XG4gICAgdmFyIG5vZGVXID0gZy5ub2RlKGUudyk7XG4gICAgdmFyIHAxLCBwMjtcbiAgICBpZiAoIWVkZ2UucG9pbnRzKSB7XG4gICAgICBlZGdlLnBvaW50cyA9IFtdO1xuICAgICAgcDEgPSBub2RlVztcbiAgICAgIHAyID0gbm9kZVY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAxID0gZWRnZS5wb2ludHNbMF07XG4gICAgICBwMiA9IGVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBlZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTtcbiAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVywgcDIpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlZGdlID0gZy5lZGdlKGUpO1xuICAgIGlmIChfLmhhcyhlZGdlLCBcInhcIikpIHtcbiAgICAgIGlmIChlZGdlLmxhYmVscG9zID09PSBcImxcIiB8fCBlZGdlLmxhYmVscG9zID09PSBcInJcIikge1xuICAgICAgICBlZGdlLndpZHRoIC09IGVkZ2UubGFiZWxvZmZzZXQ7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGVkZ2UubGFiZWxwb3MpIHtcbiAgICAgIGNhc2UgXCJsXCI6IGVkZ2UueCAtPSBlZGdlLndpZHRoIC8gMiArIGVkZ2UubGFiZWxvZmZzZXQ7IGJyZWFrO1xuICAgICAgY2FzZSBcInJcIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7XG4gICAgaWYgKGVkZ2UucmV2ZXJzZWQpIHtcbiAgICAgIGVkZ2UucG9pbnRzLnJldmVyc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKSB7XG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5jaGlsZHJlbih2KS5sZW5ndGgpIHtcbiAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpO1xuICAgICAgdmFyIHQgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApO1xuICAgICAgdmFyIGIgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pO1xuICAgICAgdmFyIGwgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpO1xuICAgICAgdmFyIHIgPSBnLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtcblxuICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7XG4gICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7XG4gICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjtcbiAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjtcbiAgICB9XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSBcImJvcmRlclwiKSB7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpIHtcbiAgXy5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkge1xuICAgIGlmIChlLnYgPT09IGUudykge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZS52KTtcbiAgICAgIGlmICghbm9kZS5zZWxmRWRnZXMpIHtcbiAgICAgICAgbm9kZS5zZWxmRWRnZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2VsZkVkZ2VzLnB1c2goeyBlOiBlLCBsYWJlbDogZy5lZGdlKGUpIH0pO1xuICAgICAgZy5yZW1vdmVFZGdlKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKSB7XG4gIHZhciBsYXllcnMgPSB1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7XG4gIF8uZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgdmFyIG9yZGVyU2hpZnQgPSAwO1xuICAgIF8uZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkge1xuICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7XG4gICAgICBfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7XG4gICAgICAgIHV0aWwuYWRkRHVtbXlOb2RlKGcsIFwic2VsZmVkZ2VcIiwge1xuICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCxcbiAgICAgICAgICByYW5rOiBub2RlLnJhbmssXG4gICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSxcbiAgICAgICAgICBlOiBzZWxmRWRnZS5lLFxuICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbFxuICAgICAgICB9LCBcIl9zZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGVsZXRlIG5vZGUuc2VsZkVkZ2VzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykge1xuICBfLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7XG4gICAgdmFyIG5vZGUgPSBnLm5vZGUodik7XG4gICAgaWYgKG5vZGUuZHVtbXkgPT09IFwic2VsZmVkZ2VcIikge1xuICAgICAgdmFyIHNlbGZOb2RlID0gZy5ub2RlKG5vZGUuZS52KTtcbiAgICAgIHZhciB4ID0gc2VsZk5vZGUueCArIHNlbGZOb2RlLndpZHRoIC8gMjtcbiAgICAgIHZhciB5ID0gc2VsZk5vZGUueTtcbiAgICAgIHZhciBkeCA9IG5vZGUueCAtIHg7XG4gICAgICB2YXIgZHkgPSBzZWxmTm9kZS5oZWlnaHQgLyAyO1xuICAgICAgZy5zZXRFZGdlKG5vZGUuZSwgbm9kZS5sYWJlbCk7XG4gICAgICBnLnJlbW92ZU5vZGUodik7XG4gICAgICBub2RlLmxhYmVsLnBvaW50cyA9IFtcbiAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSAtIGR5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgLSBkeSB9LFxuICAgICAgICB7IHg6IHggKyAgICAgZHggICAgLCB5OiB5IH0sXG4gICAgICAgIHsgeDogeCArIDUgKiBkeCAvIDYsIHk6IHkgKyBkeSB9LFxuICAgICAgICB7IHg6IHggKyAyICogZHggLyAzLCB5OiB5ICsgZHkgfVxuICAgICAgXTtcbiAgICAgIG5vZGUubGFiZWwueCA9IG5vZGUueDtcbiAgICAgIG5vZGUubGFiZWwueSA9IG5vZGUueTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7XG4gIHJldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycykge1xuICB2YXIgbmV3QXR0cnMgPSB7fTtcbiAgXy5mb3JFYWNoKGF0dHJzLCBmdW5jdGlvbih2LCBrKSB7XG4gICAgbmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gbmV3QXR0cnM7XG59XG4iLCAidmFyIF8gPSByZXF1aXJlKFwiLi9sb2Rhc2hcIik7XG52YXIgdXRpbCA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG52YXIgR3JhcGggPSByZXF1aXJlKFwiLi9ncmFwaGxpYlwiKS5HcmFwaDtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlYnVnT3JkZXJpbmc6IGRlYnVnT3JkZXJpbmdcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHtcbiAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpO1xuXG4gIHZhciBoID0gbmV3IEdyYXBoKHsgY29tcG91bmQ6IHRydWUsIG11bHRpZ3JhcGg6IHRydWUgfSkuc2V0R3JhcGgoe30pO1xuXG4gIF8uZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHtcbiAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTtcbiAgICBoLnNldFBhcmVudCh2LCBcImxheWVyXCIgKyBnLm5vZGUodikucmFuayk7XG4gIH0pO1xuXG4gIF8uZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHtcbiAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpO1xuICB9KTtcblxuICBfLmZvckVhY2gobGF5ZXJNYXRyaXgsIGZ1bmN0aW9uKGxheWVyLCBpKSB7XG4gICAgdmFyIGxheWVyViA9IFwibGF5ZXJcIiArIGk7XG4gICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiBcInNhbWVcIiB9KTtcbiAgICBfLnJlZHVjZShsYXllciwgZnVuY3Rpb24odSwgdikge1xuICAgICAgaC5zZXRFZGdlKHUsIHYsIHsgc3R5bGU6IFwiaW52aXNcIiB9KTtcbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gaDtcbn1cbiIsICJtb2R1bGUuZXhwb3J0cyA9IFwiMC44LjVcIjtcbiIsICIvKlxuQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgUGV0dGl0dFxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ3JhcGhsaWI6IHJlcXVpcmUoXCIuL2xpYi9ncmFwaGxpYlwiKSxcblxuICBsYXlvdXQ6IHJlcXVpcmUoXCIuL2xpYi9sYXlvdXRcIiksXG4gIGRlYnVnOiByZXF1aXJlKFwiLi9saWIvZGVidWdcIiksXG4gIHV0aWw6IHtcbiAgICB0aW1lOiByZXF1aXJlKFwiLi9saWIvdXRpbFwiKS50aW1lLFxuICAgIG5vdGltZTogcmVxdWlyZShcIi4vbGliL3V0aWxcIikubm90aW1lXG4gIH0sXG4gIHZlcnNpb246IHJlcXVpcmUoXCIuL2xpYi92ZXJzaW9uXCIpXG59O1xuIiwgImltcG9ydCB7IEFwcCwgRWRpdG9yLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSAnLi9zcmMvdXRpbHMvRXZlbnRCdXMnO1xyXG5pbXBvcnQgeyBHcmFwaFZpZXcsIEdSQVBIX1ZJRVdfVFlQRSB9IGZyb20gJy4vc3JjL3ZpZXdzL0dyYXBoVmlldyc7XHJcbmltcG9ydCB7IENoYXRWaWV3LCBDSEFUX1ZJRVdfVFlQRSB9IGZyb20gJy4vc3JjL3ZpZXdzL0NoYXRWaWV3JztcclxuaW1wb3J0IHsgV2ViU29ja2V0U2VydmljZSB9IGZyb20gJy4vc3JjL3V0aWxzL1dlYlNvY2tldFNlcnZpY2UnO1xyXG5cclxuaW1wb3J0ICdzcmMvY3NzL3N0eWxlcy5jc3MnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5pbnRlcmZhY2UgTExNQWdlbnRTZXR0aW5ncyB7XHJcblx0YXBpQmFzZVVybDogc3RyaW5nO1xyXG5cdHN5c3RlbVByb21wdDogc3RyaW5nO1xyXG5cdGRlZmF1bHRNb2RlbDogc3RyaW5nO1xyXG5cdHByb21wdHNGb2xkZXI6IHN0cmluZztcclxuXHRlbmFibGVGaWxlUmVmZXJlbmNlczogYm9vbGVhbjtcclxuXHRlbmFibGVQcm9tcHRSZWZlcmVuY2VzOiBib29sZWFuO1xyXG5cdGV4Y2x1ZGVkRm9sZGVyczogc3RyaW5nW107XHJcblx0cmVmQ2FjaGVGb2xkZXI6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogTExNQWdlbnRTZXR0aW5ncyA9IHtcclxuXHRhcGlCYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo1MDAwL2FwaScsXHJcblx0c3lzdGVtUHJvbXB0OiAnXHUwNDIyXHUwNDRCIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNVx1MDQzN1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MThcdTA0MTggXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyLicsXHJcblx0ZGVmYXVsdE1vZGVsOiAnZ2VtaW5pLTIuNS1mbGFzaCcsXHJcblx0cHJvbXB0c0ZvbGRlcjogJ3Byb21wdHMnLCAvLyBcdTA0MUZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzAgXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFXHJcblx0ZW5hYmxlRmlsZVJlZmVyZW5jZXM6IHRydWUsXHJcblx0ZW5hYmxlUHJvbXB0UmVmZXJlbmNlczogdHJ1ZSxcclxuXHRleGNsdWRlZEZvbGRlcnM6IFsndGVtcGxhdGVzJ10sIC8vIFx1MDQxRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzMCBcInRlbXBsYXRlc1wiIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDMwXHJcblx0cmVmQ2FjaGVGb2xkZXI6ICdyZWYtY2FjaGUnIC8vIFx1MDQxRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFIHZhdWx0XHJcbn07XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIFBsdWdpbiBDbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExMTUFnZW50UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogTExNQWdlbnRTZXR0aW5ncztcclxuXHRldmVudEJ1czogRXZlbnRCdXM7XHJcblx0d2ViU29ja2V0U2VydmljZTogV2ViU29ja2V0U2VydmljZTtcclxuXHRhY3RpdmVTdHJlYW1Db250cm9sbGVyczogTWFwPHN0cmluZywgQWJvcnRDb250cm9sbGVyPjtcclxuXHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEV2ZW50QnVzKCk7XHJcblxyXG5cdFx0dGhpcy53ZWJTb2NrZXRTZXJ2aWNlID0gbmV3IFdlYlNvY2tldFNlcnZpY2UodGhpcy5ldmVudEJ1cywgdGhpcy5zZXR0aW5ncy5hcGlCYXNlVXJsKTtcclxuXHRcdHRoaXMud2ViU29ja2V0U2VydmljZS5jb25uZWN0KCk7XHJcblxyXG5cdFx0Ly8gXHUwNDIwXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzNSB2aWV3c1xyXG5cdFx0dGhpcy5yZWdpc3RlclZpZXcoR1JBUEhfVklFV19UWVBFLCAobGVhZikgPT4gbmV3IEdyYXBoVmlldyhsZWFmLCB0aGlzKSk7XHJcblx0XHR0aGlzLnJlZ2lzdGVyVmlldyhDSEFUX1ZJRVdfVFlQRSwgKGxlYWYpID0+IG5ldyBDaGF0VmlldyhsZWFmLCB0aGlzKSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNFx1MDQ0QlxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdvcGVuLWxsbS1hZ2VudC1ncmFwaCcsXHJcblx0XHRcdG5hbWU6ICdcdTA0MUVcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzMiBMTE0gQWdlbnQnLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5hY3RpdmF0ZUdyYXBoVmlldygpXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ29wZW4tbGxtLWFnZW50LWNoYXQnLFxyXG5cdFx0XHRuYW1lOiAnXHUwNDFFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQ0N1x1MDQzMFx1MDQ0MiBMTE0gQWdlbnQnLFxyXG5cdFx0XHRjYWxsYmFjazogKCkgPT4gdGhpcy5hY3RpdmF0ZUNoYXRWaWV3KClcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnbmV3LWxsbS1hZ2VudC1jaGF0JyxcclxuXHRcdFx0bmFtZTogJ1x1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDdcdTA0MzBcdTA0NDIgTExNIEFnZW50JyxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuaGFuZGxlTmV3Q2hhdCgpXHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQzIFx1MDQzMiByaWJib25cclxuXHRcdHRoaXMuYWRkUmliYm9uSWNvbignYnJhaW4tY2lyY3VpdCcsICdMTE0gQWdlbnQnLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuYWN0aXZhdGVHcmFwaFZpZXcoKTtcclxuXHRcdFx0dGhpcy5hY3RpdmF0ZUNoYXRWaWV3KCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRjb25zb2xlLmxvZygnTExNIEFnZW50IHBsdWdpbiBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0QnKTtcclxuXHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFib3J0Q29udHJvbGxlcj4oKTtcclxuXHJcblx0XHR0aGlzLmV2ZW50QnVzLm9uKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMuZXZlbnRCdXMub24oJ3N0cmVhbS1lbmRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtRW5kZWQuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cclxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2FtcGxlU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cdH1cclxuXHJcblx0b251bmxvYWQoKSB7XHJcblx0XHRpZiAodGhpcy53ZWJTb2NrZXRTZXJ2aWNlKSB7XHJcblx0XHRcdHRoaXMud2ViU29ja2V0U2VydmljZS5kaXNjb25uZWN0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hY3RpdmVTdHJlYW1Db250cm9sbGVycy5jbGVhcigpO1xyXG5cclxuXHRcdHRoaXMuZXZlbnRCdXMub2ZmKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZCk7XHJcblx0XHR0aGlzLmV2ZW50QnVzLm9mZignc3RyZWFtLWVuZGVkJywgdGhpcy5oYW5kbGVTdHJlYW1FbmRlZCk7XHJcblxyXG5cdFx0Y29uc29sZS5sb2coJ0xMTSBBZ2VudCBwbHVnaW4gXHUwNDMyXHUwNDRCXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNEJyk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXR0aW5ncyBNYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWaWV3IE1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdGFzeW5jIGFjdGl2YXRlR3JhcGhWaWV3KCkge1xyXG5cdFx0Y29uc3QgZXhpc3RpbmdMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShHUkFQSF9WSUVXX1RZUEUpWzBdO1xyXG5cdFx0aWYgKGV4aXN0aW5nTGVhZikge1xyXG5cdFx0XHR0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihleGlzdGluZ0xlYWYpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0YXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoJ3RhYicpLnNldFZpZXdTdGF0ZSh7XHJcblx0XHRcdFx0dHlwZTogR1JBUEhfVklFV19UWVBFLFxyXG5cdFx0XHRcdGFjdGl2ZTogdHJ1ZVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGFjdGl2YXRlQ2hhdFZpZXcoKSB7XHJcblx0XHRjb25zdCBleGlzdGluZ0xlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKENIQVRfVklFV19UWVBFKVswXTtcclxuXHRcdGlmIChleGlzdGluZ0xlYWYpIHtcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYoZXhpc3RpbmdMZWFmKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHJpZ2h0TGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRSaWdodExlYWYoZmFsc2UpO1xyXG5cdFx0XHRpZiAocmlnaHRMZWFmKSB7XHJcblx0XHRcdFx0YXdhaXQgcmlnaHRMZWFmLnNldFZpZXdTdGF0ZSh7XHJcblx0XHRcdFx0XHR0eXBlOiBDSEFUX1ZJRVdfVFlQRSxcclxuXHRcdFx0XHRcdGFjdGl2ZTogdHJ1ZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudCBIYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0aGFuZGxlTmV3Q2hhdCgpIHtcclxuXHRcdHRoaXMuZXZlbnRCdXMuZW1pdCgnbmV3LWNoYXQnKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0cmVhbVN0YXJ0ZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZzsgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMuYWN0aXZlU3RyZWFtQ29udHJvbGxlcnMuc2V0KGRhdGEubm9kZUlkLCBkYXRhLmNvbnRyb2xsZXIpO1xyXG5cdH1cclxuXHJcblx0aGFuZGxlU3RyZWFtRW5kZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzLmRlbGV0ZShkYXRhLm5vZGVJZCk7XHJcblx0fVxyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTYW1wbGUgU2V0dGluZyBUYWIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5jbGFzcyBTYW1wbGVTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogTExNQWdlbnRQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0FQSSBCYXNlIFVSTCcpXHJcblx0XHRcdC5zZXREZXNjKCdcdTA0MTFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgVVJMIFx1MDQzNFx1MDQzQlx1MDQ0RiBBUEkgTExNIEFnZW50JylcclxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdcdTA0MTJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgVVJMJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1x1MDQyMVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDInKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDJEXHUwNDQyXHUwNDNFXHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDQyXHUwNDRDXHUwNDQxXHUwNDRGIExMTSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDRCXHUwNDNDIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzQy4nKVxyXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+XHJcblx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdcdTA0MjJcdTA0NEIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDM1XHUwNDM3XHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQxOFx1MDQxOCBcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0RcdTA0NDIuJylcclxuXHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zeXN0ZW1Qcm9tcHQpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnN5c3RlbVByb21wdCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdcdTA0MUZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzAgXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFx1MDQzQ1x1MDQzOCcpXHJcblx0XHRcdC5zZXREZXNjKCdcdTA0MUZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSwgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDMwXHUwNDNEXHUwNDM0ICMvIyMnKVxyXG5cdFx0XHQuYWRkVGV4dCgodGV4dCkgPT5cclxuXHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ3Byb21wdHMnKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXIpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnXHUwNDFGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDMwIFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5JylcclxuXHRcdFx0LnNldERlc2MoJ1x1MDQxMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyJylcclxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+XHJcblx0XHRcdFx0dGV4dFxyXG5cdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdyZWYtY2FjaGUnKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnJlZkNhY2hlRm9sZGVyKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5yZWZDYWNoZUZvbGRlciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0RcdTA0MzAgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1x1MDQxMlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QicpXHJcblx0XHRcdC5zZXREZXNjKCdcdTA0MjBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IEAvQEAgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzQlx1MDQzOFx1MDQ0OVx1MDQzNScpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlRmlsZVJlZmVyZW5jZXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlRmlsZVJlZmVyZW5jZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDRCXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1x1MDQxMlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQ0QicpXHJcblx0XHRcdC5zZXREZXNjKCdcdTA0MjBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1ICMvIyMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0NEInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XHJcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmVuYWJsZVByb21wdFJlZmVyZW5jZXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlUHJvbXB0UmVmZXJlbmNlcyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzRVx1MDQzQVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdcdTA0MThcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EnKVxyXG5cdFx0XHQuc2V0RGVzYygnXHUwNDIxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzMFx1MDQzQywgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCIFx1MDQzOFx1MDQzNyBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0NEJcdTA0NDUgXHUwNDNEXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzBcdTA0NDJcdTA0NENcdTA0NDFcdTA0NEYgXHUwNDMyIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzNFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgKEAvQEApLicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cclxuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlRmlsZVJlZmVyZW5jZXMpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlRmlsZVJlZmVyZW5jZXMgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDNDXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBXHJcblx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5leGNsdWRlZEZvbGRlcnMuZm9yRWFjaCgoZm9sZGVyLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHQuc2V0Q2xhc3MoJ2xsbS1hZ2VudC1leGNsdWRlZC1mb2xkZXItaXRlbScpIC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOFxyXG5cdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcblx0XHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKCdcdTA0MUZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSAoXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCB0ZW1wbGF0ZXMvKScgKyBpbmRleClcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKGZvbGRlcilcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVkRm9sZGVyc1tpbmRleF0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHQvLyBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDREXHUwNDQ4IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzQVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3NldHRpbmdzLWNoYW5nZWQnKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xyXG5cdFx0XHRcdFx0YnV0dG9uXHJcblx0XHRcdFx0XHRcdC5zZXRJY29uKCd4JylcclxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAoJ1x1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0NDMnKVxyXG5cdFx0XHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZXhjbHVkZWRGb2xkZXJzLnNwbGljZShpbmRleCwgMSk7XHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7IC8vIFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzBcclxuXHRcdFx0XHRcdFx0XHQvLyBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDREXHUwNDQ4IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzQVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3NldHRpbmdzLWNoYW5nZWQnKTtcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbCkuYWRkQnV0dG9uKChidXR0b24pID0+IHtcclxuXHRcdFx0YnV0dG9uXHJcblx0XHRcdFx0LnNldEJ1dHRvblRleHQoJ1x1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0NDMnKVxyXG5cdFx0XHRcdC5zZXRJY29uKCdwbHVzJylcclxuXHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5leGNsdWRlZEZvbGRlcnMucHVzaCgnJyk7IC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDM1XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpOyAvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwXHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIiwgIi8qXHJcbiAqIEV2ZW50QnVzIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0NDZcdTA0MzVcdTA0M0RcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNDXHUwNDM1XHUwNDQ1XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM3XHUwNDNDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzggXHUwNDM4IFx1MDQzRlx1MDQ0M1x1MDQzMVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzlcclxuICogXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLCBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQzQlx1MDQzMFx1MDQzMVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0MzJcdTA0NEZcdTA0MzdcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50QnVzIHtcclxuXHRwcml2YXRlIGV2ZW50czogeyBba2V5OiBzdHJpbmddOiAoKGRhdGE/OiBhbnkpID0+IHZvaWQpW10gfSA9IHt9O1xyXG5cclxuXHRvbihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMuZXZlbnRzW2V2ZW50TmFtZV0pIHtcclxuXHRcdFx0dGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IFtdO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5ldmVudHNbZXZlbnROYW1lXS5wdXNoKGNhbGxiYWNrKTtcclxuXHR9XHJcblxyXG5cdG9mZihldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5ldmVudHNbZXZlbnROYW1lXSkge1xyXG5cdFx0XHR0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gdGhpcy5ldmVudHNbZXZlbnROYW1lXS5maWx0ZXIoKGNiKSA9PiBjYiAhPT0gY2FsbGJhY2spO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZW1pdChldmVudE5hbWU6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0pIHtcclxuXHRcdFx0dGhpcy5ldmVudHNbZXZlbnROYW1lXS5mb3JFYWNoKChjYWxsYmFjaykgPT4gY2FsbGJhY2soZGF0YSkpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQxRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzggXHUwNDQzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzQyBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0M0MgTExNIFx1MDQzMFx1MDQzM1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMC5cclxuICogXHUwNDE4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDQwXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDM4IFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzRVx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzNSBSZWFjdCBGbG93LlxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9ic2lkaWFuIEltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5pbXBvcnQgeyBJdGVtVmlldywgV29ya3NwYWNlTGVhZiwgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbHVnaW4gSW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nOyAvLyBcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzBcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBtYWluLnRzIFx1MDQ0RFx1MDQzQVx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBMTE1BZ2VudFBsdWdpbiBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDNDXHUwNDNFXHUwNDNCXHUwNDQ3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRFXHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XHJcblxyXG5pbXBvcnQgeyBIaXN0b3J5UGFuZWwgfSBmcm9tICcuLi9jb21wb25lbnRzL0hpc3RvcnlQYW5lbCc7IC8vIFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzM1x1MDQzMFx1MDQzNVx1MDQzQywgXHUwNDQ3XHUwNDQyXHUwNDNFIEhpc3RvcnlQYW5lbCBcdTA0NERcdTA0NDJcdTA0M0UgSlMtXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxXHJcbmltcG9ydCB7IEdyYXBoUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL0dyYXBoUGFuZWwnOyAvLyBcdTA0MThcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgUmVhY3QtXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzOCBSZWFjdERPTVxyXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICdzcmMvdXRpbHMvRGlhbG9nJztcclxuaW1wb3J0IHsgR3JhcGhTZXR0aW5nc01vZGFsIH0gZnJvbSAnLi4vbW9kYWxzL0dyYXBoU2V0dGluZ3NNb2RhbCc7XHJcblxyXG5leHBvcnQgY29uc3QgR1JBUEhfVklFV19UWVBFID0gJ2xsbS1hZ2VudC1ncmFwaC12aWV3JztcclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdyYXBoIFZpZXcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgR3JhcGhWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG5cdHBsdWdpbjogTExNQWdlbnRQbHVnaW47XHJcblx0Z3JhcGhEYXRhOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH07XHJcblx0Y3VycmVudE5vZGU6IHN0cmluZyB8IG51bGw7XHJcblx0Z3JhcGhzTGlzdDogYW55W107XHJcblx0c2VsZWN0ZWRHcmFwaElkOiBzdHJpbmcgfCBudWxsO1xyXG5cdHNlbGVjdGVkTm9kZUlkczogU2V0PHN0cmluZz47IC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBTZXQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBJRCBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyXHJcblx0c2VsZWN0ZWRHcmFwaFRpdGxlOiBzdHJpbmcgfCBudWxsO1xyXG5cdGN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbDtcclxuXHJcblx0Ly8gVUkgRWxlbWVudHNcclxuXHRoaXN0b3J5UGFuZWw6IEhpc3RvcnlQYW5lbCB8IG51bGw7XHJcblx0aGlzdG9yeUNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XHJcblx0Z3JhcGhDb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xyXG5cdHJlYWN0Um9vdDogUmVhY3RET00uUm9vdCB8IG51bGw7XHJcblx0dG9nZ2xlQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRpc0hpc3RvcnlDb2xsYXBzZWQ6IGJvb2xlYW47XHJcblxyXG5cdC8vIFx1MDQxM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDM5XHJcblx0Y29weVNlbGVjdGVkQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdGRlbGV0ZVNlbGVjdGVkQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cdG5ld0luZGVwZW5kZW50Q2hhdEFjdGlvbkJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHRncmFwaFNldHRpbmdzQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRhY3RpdmVTdHJlYW1Db250cm9sbGVyczogTWFwPHN0cmluZywgQWJvcnRDb250cm9sbGVyPjtcclxuXHJcblx0Y29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbikge1xyXG5cdFx0c3VwZXIobGVhZik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHRcdHRoaXMuZ3JhcGhEYXRhID0geyBub2RlczogW10sIGVkZ2VzOiBbXSB9O1xyXG5cdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XHJcblx0XHR0aGlzLmdyYXBoc0xpc3QgPSBbXTtcclxuXHRcdHRoaXMuc2VsZWN0ZWRHcmFwaElkID0gbnVsbDtcclxuXHRcdHRoaXMuaGlzdG9yeVBhbmVsID0gbnVsbDtcclxuXHRcdHRoaXMucmVhY3RSb290ID0gbnVsbDtcclxuXHRcdHRoaXMuaXNIaXN0b3J5Q29sbGFwc2VkID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2VsZWN0ZWROb2RlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzID0gbmV3IE1hcDxzdHJpbmcsIEFib3J0Q29udHJvbGxlcj4oKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFx1MDQyMlx1MDQzOFx1MDQzRiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0Z2V0Vmlld1R5cGUoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBHUkFQSF9WSUVXX1RZUEU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBcdTA0MUVcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKi9cclxuXHRnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlIHx8ICdMTE0gQWdlbnQgR3JhcGgnO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQHJldHVybnMge3N0cmluZ30gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKi9cclxuXHRnZXRJY29uKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gJ2JyYWluLWNpcmN1aXQnO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDEyXHUwNDRCXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLiBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgVUkgXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgb25PcGVuKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGNvbnRhaW5lci5lbXB0eSgpO1xyXG5cclxuXHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0VcdTA0NDFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwIFx1MDQ0MSBmbGV4Ym94IGxheW91dFxyXG5cdFx0Y29uc3QgbWFpbkNvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVEaXYoJ2xsbS1hZ2VudC1ncmFwaC1tYWluJyk7XHJcblx0XHRtYWluQ29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBgXHJcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQtcHJpbWFyeSk7XHJcbiAgICAgICAgYDtcclxuXHJcblx0XHQvLyBcdTA0MUJcdTA0MzVcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzhcclxuXHRcdHRoaXMuaGlzdG9yeUNvbnRhaW5lciA9IG1haW5Db250YWluZXIuY3JlYXRlRGl2KCdsbG0tYWdlbnQtaGlzdG9yeS1zaWRlYmFyJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblx0XHR0aGlzLmhpc3RvcnlDb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZCA/ICdjb2xsYXBzZWQnIDogJ2V4cGFuZGVkJyk7XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHR0aGlzLmdyYXBoQ29udGFpbmVyID0gbWFpbkNvbnRhaW5lci5jcmVhdGVEaXYoJ2xsbS1hZ2VudC1ncmFwaC1jb250YWluZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcclxuXHRcdHRoaXMuZ3JhcGhDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcclxuICAgICAgICAgICAgZmxleDogMTtcclxuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpO1xyXG4gICAgICAgIGA7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzhcclxuXHRcdHRoaXMuaGlzdG9yeVBhbmVsID0gbmV3IEhpc3RvcnlQYW5lbChcclxuXHRcdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Z3JhcGhzOiB0aGlzLmdyYXBoc0xpc3QsXHJcblx0XHRcdFx0ZXZlbnRCdXM6IHRoaXMucGx1Z2luLmV2ZW50QnVzXHJcblx0XHRcdH0sXHJcblx0XHRcdHRoaXMucGx1Z2luXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzOCBcdTA0MzNcdTA0M0JcdTA0M0VcdTA0MzFcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzOVxyXG5cdFx0dGhpcy5hZGRUb2dnbGVCdXR0b24oKTtcclxuXHRcdHRoaXMuYWRkR2xvYmFsQWN0aW9uQnV0dG9ucygpOyAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDNFXHUwNDMyIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgUmVhY3QgRmxvd1xyXG5cdFx0dGhpcy5pbml0aWFsaXplR3JhcGhQYW5lbCgpO1xyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQ1x1MDQ0MVx1MDQ0RiBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDRGXHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignbmV3LWNoYXQnLCB0aGlzLmhhbmRsZU5ld0NoYXQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignZ3JhcGgtc2VsZWN0ZWQnLCB0aGlzLmhhbmRsZUdyYXBoU2VsZWN0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignZGVsZXRlLW5vZGUnLCB0aGlzLmhhbmRsZURlbGV0ZU5vZGVGcm9tQ2hhdC5iaW5kKHRoaXMpKTsgLy8gXHUwNDIxXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzcgQ2hhdFBhbmVsXHJcblxyXG5cdFx0Ly8gV2ViU29ja2V0IEV2ZW50IEhhbmRsZXJzXHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignd3MtZ3JhcGgtdGl0bGUtdXBkYXRlZCcsIHRoaXMuaGFuZGxlR3JhcGhUaXRsZVVwZGF0ZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignd3Mtbm9kZS10aXRsZS11cGRhdGVkJywgdGhpcy5oYW5kbGVOb2RlVGl0bGVVcGRhdGVkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3dzLW5vZGUtdHlwZS1jaGFuZ2VkJywgdGhpcy5oYW5kbGVOb2RlVHlwZUNoYW5nZWQuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3N0cmVhbS1zdGFydGVkJywgdGhpcy5oYW5kbGVTdHJlYW1TdGFydGVkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3N0cmVhbS1lbmRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtRW5kZWQuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzJcclxuXHRcdGF3YWl0IHRoaXMuZmV0Y2hHcmFwaHNMaXN0KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NEJcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDNcdTA0NDBcdTA0NDFcdTA0NEIuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGlmICh0aGlzLmhpc3RvcnlQYW5lbCkge1xyXG5cdFx0XHR0aGlzLmhpc3RvcnlQYW5lbC5kZXN0cm95KCk7XHJcblx0XHRcdHRoaXMuaGlzdG9yeVBhbmVsID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0M0NcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgUmVhY3QtXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyXHJcblx0XHRpZiAodGhpcy5yZWFjdFJvb3QpIHtcclxuXHRcdFx0dGhpcy5yZWFjdFJvb3QudW5tb3VudCgpO1xyXG5cdFx0XHR0aGlzLnJlYWN0Um9vdCA9IG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCduZXctY2hhdCcsIHRoaXMuaGFuZGxlTmV3Q2hhdCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ2dyYXBoLXNlbGVjdGVkJywgdGhpcy5oYW5kbGVHcmFwaFNlbGVjdGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignZGVsZXRlLW5vZGUnLCB0aGlzLmhhbmRsZURlbGV0ZU5vZGVGcm9tQ2hhdCk7XHJcblxyXG5cdFx0Ly8gV2ViU29ja2V0IEV2ZW50IENsZWFudXBcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignd3MtZ3JhcGgtdGl0bGUtdXBkYXRlZCcsIHRoaXMuaGFuZGxlR3JhcGhUaXRsZVVwZGF0ZWQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCd3cy1ub2RlLXRpdGxlLXVwZGF0ZWQnLCB0aGlzLmhhbmRsZU5vZGVUaXRsZVVwZGF0ZWQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCd3cy1ub2RlLXR5cGUtY2hhbmdlZCcsIHRoaXMuaGFuZGxlTm9kZVR5cGVDaGFuZ2VkKTtcclxuXHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3N0cmVhbS1zdGFydGVkJywgdGhpcy5oYW5kbGVTdHJlYW1TdGFydGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignc3RyZWFtLWVuZGVkJywgdGhpcy5oYW5kbGVTdHJlYW1FbmRlZCk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDdXN0b20gVGl0bGUgVXBkYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqIFx1MDQyRFx1MDQ0Mlx1MDQzRVx1MDQ0MiBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0VcdTA0MzQgXHUwNDM0XHUwNDNFXHUwNDNCXHUwNDM2XHUwNDM1XHUwNDNEIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzNFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQzQ1x1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDMwXHJcblx0ICogXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzRVx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqL1xyXG5cdHVwZGF0ZVRpdGxlKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgdGl0bGVFbGVtZW50ID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKCcudmlldy1oZWFkZXItdGl0bGUnKTtcclxuXHRcdGlmICh0aXRsZUVsZW1lbnQpIHtcclxuXHRcdFx0dGl0bGVFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgfHwgJ0xMTSBBZ2VudCBHcmFwaCc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIaXN0b3J5IFBhbmVsIFRvZ2dsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0Qlx1MDQzQyBcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDRCXHUwNDNDLlxyXG5cdCAqL1xyXG5cdHRvZ2dsZUhpc3RvcnlQYW5lbCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXNIaXN0b3J5Q29sbGFwc2VkID0gIXRoaXMuaXNIaXN0b3J5Q29sbGFwc2VkO1xyXG5cclxuXHRcdGlmICh0aGlzLmlzSGlzdG9yeUNvbGxhcHNlZCkge1xyXG5cdFx0XHR0aGlzLmhpc3RvcnlDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kZWQnKTtcclxuXHRcdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NvbGxhcHNlZCcpO1xyXG5cdFx0XHR0aGlzLnRvZ2dsZUJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQ0InO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5oaXN0b3J5Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbGxhcHNlZCcpO1xyXG5cdFx0XHR0aGlzLmhpc3RvcnlDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZXhwYW5kZWQnKTtcclxuXHRcdFx0dGhpcy50b2dnbGVCdXR0b24udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdyYXBoIFBhbmVsIEludGVncmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdGFkZFRvZ2dsZUJ1dHRvbigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGJ1dHRvbldyYXBwZXIgPSB0aGlzLmdyYXBoQ29udGFpbmVyLmNyZWF0ZURpdih7IGNsczogJ2dyYXBoLXZpZXctdG9vbGJhcicgfSk7IC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M0RcdTA0MzVcdTA0NDAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQVxyXG5cdFx0dGhpcy50b2dnbGVCdXR0b24gPSBidXR0b25XcmFwcGVyLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogJ2dsb2JhbC1hY3Rpb24tYnV0dG9uJyB9KTsgLy8gaGlzdG9yeS10b2dnbGUtYnV0dG9uXHJcblx0XHR0aGlzLnRvZ2dsZUJ1dHRvbi50ZXh0Q29udGVudCA9IHRoaXMuaXNIaXN0b3J5Q29sbGFwc2VkID8gJ1x1RDgzRFx1RENDQicgOiAnXHUyNzRDJztcclxuXHRcdHRoaXMudG9nZ2xlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50b2dnbGVIaXN0b3J5UGFuZWwuYmluZCh0aGlzKSk7XHJcblx0XHRjb25zb2xlLmxvZygnVG9nZ2xlIGJ1dHRvbiBjcmVhdGVkIGFuZCBhcHBlbmRlZDonLCB0aGlzLnRvZ2dsZUJ1dHRvbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzkgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIuXHJcblx0ICovXHJcblx0YWRkR2xvYmFsQWN0aW9uQnV0dG9ucygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHRvb2xiYXIgPSB0aGlzLmdyYXBoQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5ncmFwaC12aWV3LXRvb2xiYXInKTtcclxuXHRcdGlmICghdG9vbGJhcikgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMuY29weVNlbGVjdGVkQnV0dG9uID0gdG9vbGJhci5jcmVhdGVFbCgnYnV0dG9uJywge1xyXG5cdFx0XHRjbHM6ICdnbG9iYWwtYWN0aW9uLWJ1dHRvbicsXHJcblx0XHRcdGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEInLCAnZGF0YS10b29sdGlwJzogJ1x1MDQxQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCJyB9LFxyXG5cdFx0XHR0ZXh0OiAnXHVEODNEXHVEQ0M0J1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmNvcHlTZWxlY3RlZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ29weVNlbGVjdGVkTm9kZXMuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5kZWxldGVTZWxlY3RlZEJ1dHRvbiA9IHRvb2xiYXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAnZ2xvYmFsLWFjdGlvbi1idXR0b24nLFxyXG5cdFx0XHRhdHRyOiB7ICdhcmlhLWxhYmVsJzogJ1x1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCJywgJ2RhdGEtdG9vbHRpcCc6ICdcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QicgfSxcclxuXHRcdFx0dGV4dDogJ1x1RDgzRFx1REREMVx1RkUwRidcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5kZWxldGVTZWxlY3RlZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlRGVsZXRlU2VsZWN0ZWROb2Rlcy5iaW5kKHRoaXMpKTtcclxuXHJcblx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24gPSB0b29sYmFyLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcblx0XHRcdGNsczogJ2dsb2JhbC1hY3Rpb24tYnV0dG9uJyxcclxuXHRcdFx0YXR0cjogeyAnYXJpYS1sYWJlbCc6ICdcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwJywgJ2RhdGEtdG9vbHRpcCc6ICdcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCcgfSxcclxuXHRcdFx0dGV4dDogJ1x1MjY5OVx1RkUwRicgLy8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQ0OFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzQVx1MDQzOFxyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUdyYXBoU2V0dGluZ3NDbGljay5iaW5kKHRoaXMpKTtcclxuXHRcdC8vIFx1MDQxNFx1MDQzNVx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0NDMgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzQlx1MDQ0N1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RSwgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHJcblx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uc2V0QXR0cignZGlzYWJsZWQnLCAndHJ1ZScpO1xyXG5cclxuXHRcdHRoaXMubmV3SW5kZXBlbmRlbnRDaGF0QWN0aW9uQnV0dG9uID0gdG9vbGJhci5jcmVhdGVFbCgnYnV0dG9uJywge1xyXG5cdFx0XHRjbHM6ICdnbG9iYWwtYWN0aW9uLWJ1dHRvbicsXHJcblx0XHRcdGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAnXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQzRFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzOSBcdTA0NDdcdTA0MzBcdTA0NDInLCAnZGF0YS10b29sdGlwJzogJ1x1MDQxRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0NDNcdTA0NEUgXHUwNDMxXHUwNDM1XHUwNDQxXHUwNDM1XHUwNDM0XHUwNDQzLCBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzhcdTA0NDBcdTA0NDNcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5LCBcdTA0M0RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M0NcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0JyB9LFxyXG5cdFx0XHR0ZXh0OiAnXHUyNzI4JyAvLyBcdTA0MThcdTA0M0JcdTA0MzggJ1x1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDdcdTA0MzBcdTA0NDInXHJcblx0XHR9KTtcclxuXHRcdHRoaXMubmV3SW5kZXBlbmRlbnRDaGF0QWN0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MkRcdTA0M0NcdTA0MzhcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDhcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDIyXHUwNDFFXHUwNDFCXHUwNDJDXHUwNDFBXHUwNDFFIENoYXRWaWV3XHJcblx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3N0YXJ0LW5ldy1pbmRlcGVuZGVudC1jaGF0Jyk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdyYXBoIFBhbmVsIEludGVncmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzNSBcIlx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcIi5cclxuXHQgKi9cclxuXHRoYW5kbGVHcmFwaFNldHRpbmdzQ2xpY2soKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRHcmFwaElkIHx8ICF0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSkge1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MjFcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzAgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4LicsIDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0bmV3IEdyYXBoU2V0dGluZ3NNb2RhbCh0aGlzLmFwcCwge1xyXG5cdFx0XHRhcHA6IHRoaXMuYXBwLFxyXG5cdFx0XHRncmFwaElkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCxcclxuXHRcdFx0Z3JhcGhUaXRsZTogdGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUsXHJcblx0XHRcdGluaXRpYWxDdXN0b21TeXN0ZW1Qcm9tcHQ6IHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0LFxyXG5cdFx0XHRvblNhdmU6IHRoaXMuc2F2ZUdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0LmJpbmQodGhpcylcclxuXHRcdH0pLm9wZW4oKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZ3JhcGhJZCAtIElEIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGN1c3RvbVN5c3RlbVByb21wdCAtIFx1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzOFx1MDQzQlx1MDQzOCBudWxsIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDFcdTA0MzAuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgc2F2ZUdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0KGdyYXBoSWQ6IHN0cmluZywgY3VzdG9tU3lzdGVtUHJvbXB0OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAoIWdyYXBoSWQpIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDEzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzRFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0EuJywgMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L2dyYXBocy8ke2dyYXBoSWR9L3NldHRpbmdzYCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BBVENIJyxcclxuXHRcdFx0XHRoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGN1c3RvbV9zeXN0ZW1fcHJvbXB0OiBjdXN0b21TeXN0ZW1Qcm9tcHQgfSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDIxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDQzXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ4XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRC4nLCAyMDAwKTtcclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFVJXHJcblx0XHRcdGF3YWl0IHRoaXMuZmV0Y2hHcmFwaERhdGEoZ3JhcGhJZCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgJHtncmFwaElkfTpgLCBlcnJvcik7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzA6ICR7ZXJyb3IubWVzc2FnZX1gLCA1MDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBHcmFwaFBhbmVsQ29tcG9uZW50IChSZWFjdCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIpIFx1MDQzMiBncmFwaENvbnRhaW5lci5cclxuXHQgKiBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDIgUmVhY3RET00uY3JlYXRlUm9vdCBcdTA0MzRcdTA0M0JcdTA0NEYgUmVhY3QgMTguXHJcblx0ICovXHJcblx0aW5pdGlhbGl6ZUdyYXBoUGFuZWwoKTogdm9pZCB7XHJcblx0XHR0aGlzLmdyYXBoQ29udGFpbmVyLmVtcHR5KCk7XHJcblx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzRFx1MDQzRSBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNBXHUwNDM4LCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDNEXHUwNDM4IFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzOCBcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NENcdTA0NEUgZ3JhcGhDb250YWluZXJcclxuXHRcdHRoaXMuYWRkVG9nZ2xlQnV0dG9uKCk7XHJcblx0XHR0aGlzLmFkZEdsb2JhbEFjdGlvbkJ1dHRvbnMoKTtcclxuXHJcblx0XHRjb25zdCB3cmFwcGVyID0gdGhpcy5ncmFwaENvbnRhaW5lci5jcmVhdGVEaXYoKTtcclxuXHRcdHdyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICd3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyc7XHJcblxyXG5cdFx0aWYgKCF3cmFwcGVyKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQyXHUwNDRDIHdyYXBwZXIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQ1x1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBSZWFjdCBGbG93LicpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKFJlYWN0RE9NICYmIHR5cGVvZiBSZWFjdERPTS5jcmVhdGVSb290ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHRoaXMucmVhY3RSb290ID0gUmVhY3RET00uY3JlYXRlUm9vdCh3cmFwcGVyKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJHcmFwaFBhbmVsKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdSZWFjdERPTS5jcmVhdGVSb290IFx1MDQzRFx1MDQzNSBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0QuIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MVx1MDQ0QywgXHUwNDQ3XHUwNDQyXHUwNDNFIFwicmVhY3QtZG9tL2NsaWVudFwiIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSBcdTA0MzhcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0QuJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDIgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBHcmFwaFBhbmVsQ29tcG9uZW50IFx1MDQzMiBET00uXHJcblx0ICovXHJcblx0cmVuZGVyR3JhcGhQYW5lbCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnJlYWN0Um9vdCkge1xyXG5cdFx0XHR0aGlzLnJlYWN0Um9vdC5yZW5kZXIoXHJcblx0XHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudChHcmFwaFBhbmVsQ29tcG9uZW50LCB7XHJcblx0XHRcdFx0XHRncmFwaERhdGE6IHtcclxuXHRcdFx0XHRcdFx0bm9kZXM6IHRoaXMuZ3JhcGhEYXRhLm5vZGVzLFxyXG5cdFx0XHRcdFx0XHRlZGdlczogdGhpcy5ncmFwaERhdGEuZWRnZXNcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRvbk5vZGVDbGljazogdGhpcy5oYW5kbGVOb2RlQ2xpY2suYmluZCh0aGlzKSxcclxuXHRcdFx0XHRcdG9uTm9kZVNlbGVjdGlvbkNoYW5nZTogdGhpcy5oYW5kbGVOb2RlU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksXHJcblx0XHRcdFx0XHRvbk5vZGVEZWxldGU6IHRoaXMuaGFuZGxlRGVsZXRlTm9kZS5iaW5kKHRoaXMpLFxyXG5cdFx0XHRcdFx0c2VsZWN0ZWROb2RlSWRzOiB0aGlzLnNlbGVjdGVkTm9kZUlkcyxcclxuXHRcdFx0XHRcdGFjdGl2ZU5vZGVJZDogdGhpcy5jdXJyZW50Tm9kZSxcclxuXHRcdFx0XHRcdGFwcDogdGhpcy5wbHVnaW4uYXBwXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignUmVhY3Qgcm9vdCBcdTA0M0RcdTA0MzUgXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzAgR3JhcGhQYW5lbENvbXBvbmVudC4nKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQzMlx1MDQ0MVx1MDQzNVx1MDQ0NSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzIgXHUwNDQxIFx1MDQzMVx1MDQ0RFx1MDQzQVx1MDQzNVx1MDQzRFx1MDQzNFx1MDQzMC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyBmZXRjaEdyYXBoc0xpc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L2dyYXBoc2ApO1xyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cdFx0XHR0aGlzLmdyYXBoc0xpc3QgPSBkYXRhO1xyXG5cdFx0XHRpZiAodGhpcy5oaXN0b3J5UGFuZWwpIHtcclxuXHRcdFx0XHR0aGlzLmhpc3RvcnlQYW5lbC51cGRhdGVHcmFwaHModGhpcy5ncmFwaHNMaXN0KTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyOicsIGVycm9yKTtcclxuXHRcdFx0Ly8gT3B0aW9uYWxseTogc2hvdyBhIG5vdGljZSB0byB0aGUgdXNlclxyXG5cdFx0XHQvLyBuZXcgTm90aWNlKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzI6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0M0ZcdTA0M0UgXHUwNDM1XHUwNDMzXHUwNDNFIElELlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBncmFwaElkIC0gSUQgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzguXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgZmV0Y2hHcmFwaERhdGEoZ3JhcGhJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIWdyYXBoSWQpIHtcclxuXHRcdFx0XHR0aGlzLmdyYXBoRGF0YSA9IHsgbm9kZXM6IFtdLCBlZGdlczogW10gfTtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5jbGVhcigpOyAvLyBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBudWxsOyAvLyBcdTA0MjFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDMwXHJcblx0XHRcdFx0dGhpcy51cGRhdGVUaXRsZSgpOyAvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNBXHJcblx0XHRcdFx0dGhpcy5yZW5kZXJHcmFwaFBhbmVsKCk7XHJcblx0XHRcdFx0Ly8gXHUwNDFEXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzRVx1MDQzMjogdGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnY2hhdC1oaXN0b3J5LXVwZGF0ZWQnLCB7IGdyYXBoSWQ6IG51bGwsIG1lc3NhZ2VzOiBbXSwgY3VycmVudF9ub2RlX2lkOiBudWxsIH0pO1xyXG5cdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcsIHsgZ3JhcGhfaWQ6IG51bGwsIGN1c3RvbV9zeXN0ZW1fcHJvbXB0OiBudWxsIH0pOyAvLyBcdTA0MjNcdTA0MzJcdTA0MzVcdTA0MzRcdTA0M0VcdTA0M0NcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgQ2hhdFZpZXcgXHUwNDNFIFx1MDQ0MVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQzNVxyXG5cdFx0XHRcdGlmICh0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24pIHtcclxuXHRcdFx0XHRcdHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbi5zZXRBdHRyKCdkaXNhYmxlZCcsICd0cnVlJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9ncmFwaHMvJHtncmFwaElkfWApO1xyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwOiAke3Jlc3BvbnNlLnN0YXR1c30gLSAke2Vycm9yVGV4dH1gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDI3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzRFx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0NDNcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDXHUwNDRCXHUwNDM1IFx1MDQ0RFx1MDQzRFx1MDQzNFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzVcclxuXHRcdFx0Y29uc3Qgbm9kZXNXaXRoR3JhcGhJZCA9IGRhdGEuZ3JhcGhfbm9kZXMgPyBkYXRhLmdyYXBoX25vZGVzLm1hcCgobm9kZTogYW55KSA9PiAoeyAuLi5ub2RlLCBncmFwaF9pZDogZ3JhcGhJZCB9KSkgOiBbXTtcclxuXHJcblx0XHRcdHRoaXMuZ3JhcGhEYXRhID0ge1xyXG5cdFx0XHRcdG5vZGVzOiBub2Rlc1dpdGhHcmFwaElkLFxyXG5cdFx0XHRcdGVkZ2VzOiBkYXRhLmdyYXBoX2VkZ2VzIHx8IFtdXHJcblx0XHRcdH07XHJcblx0XHRcdHRoaXMuY3VycmVudE5vZGUgPSBkYXRhLmN1cnJlbnRfbm9kZV9pZDtcclxuXHJcblx0XHRcdC8vIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaFRpdGxlID0gZGF0YS50aXRsZSB8fCBkYXRhLmZpcnN0X21lc3NhZ2UgfHwgYFx1MDQxM1x1MDQ0MFx1MDQzMFx1MDQ0NCAke2dyYXBoSWQuc3Vic3RyaW5nKDAsIDgpfS4uLmA7XHJcblx0XHRcdHRoaXMudXBkYXRlVGl0bGUoKTtcclxuXHJcblx0XHRcdHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gZGF0YS5jdXN0b21fc3lzdGVtX3Byb21wdCB8fCBudWxsO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbikge1xyXG5cdFx0XHRcdHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbi5zZXRBdHRyKCdkaXNhYmxlZCcsIG51bGwpOyAvLyBcdTA0MTBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0NcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFxyXG5cdFx0XHR0aGlzLnJlbmRlckdyYXBoUGFuZWwoKTtcclxuXHJcblx0XHRcdC8vIFx1MDQyMlx1MDQzMFx1MDQzQVx1MDQzNlx1MDQzNSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgQ2hhdFZpZXcgXHUwNDQxIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0M0NcclxuXHRcdFx0LyogXHUwNDFEXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzRVx1MDQzMjogdGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnY2hhdC1oaXN0b3J5LXVwZGF0ZWQnLCB7XHJcblx0XHRcdFx0Z3JhcGhJZDogZ3JhcGhJZCxcclxuXHRcdFx0XHRtZXNzYWdlczogZGF0YS5tZXNzYWdlcyB8fCBbXSxcclxuXHRcdFx0XHRjdXJyZW50X25vZGVfaWQ6IGRhdGEuY3VycmVudF9ub2RlX2lkIC8vIFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzBcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgY3VycmVudF9ub2RlX2lkXHJcblx0XHRcdH0pOyovXHJcblx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcsIHtcclxuXHRcdFx0XHRncmFwaF9pZDogZ3JhcGhJZCxcclxuXHRcdFx0XHRjdXN0b21fc3lzdGVtX3Byb21wdDogdGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHRcclxuXHRcdFx0fSk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzA6JywgZXJyb3IpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSA9IG51bGw7XHJcblx0XHRcdHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gbnVsbDsgLy8gXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxIFx1MDQzQVx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzNVxyXG5cdFx0XHR0aGlzLnVwZGF0ZVRpdGxlKCk7IC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0VcdTA0M0FcclxuXHRcdFx0aWYgKHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbikge1xyXG5cdFx0XHRcdHRoaXMuZ3JhcGhTZXR0aW5nc0J1dHRvbi5zZXRBdHRyKCdkaXNhYmxlZCcsICd0cnVlJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnZ3JhcGgtY3VzdG9tLXByb21wdC11cGRhdGVkJywgeyBncmFwaF9pZDogZ3JhcGhJZCwgY3VzdG9tX3N5c3RlbV9wcm9tcHQ6IG51bGwgfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0M0ZcdTA0M0UgXHUwNDM1XHUwNDMzXHUwNDNFIElELlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBncmFwaElkIC0gSUQgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBub2RlSWQgLSBJRCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVEZWxldGVOb2RlKG5vZGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0QgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLicsIDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9ncmFwaHMvJHt0aGlzLnNlbGVjdGVkR3JhcGhJZH0vbm9kZXMvJHtub2RlSWR9YCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ0RFTEVURSdcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzA6ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7ZXJyb3JUZXh0fWApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MjNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDQzXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ4XHUwNDNEXHUwNDNFIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRC4nLCAyMDAwKTtcclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAsIFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzNVx1MDQzM1x1MDQzRS5cclxuXHRcdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQ0Mlx1MDQzMFx1MDQzQVx1MDQzNlx1MDQzNSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDIgQ2hhdFBhbmVsLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0NEJcdTA0M0JcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQxXHUwNDQyXHUwNDRDXHUwNDRFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzOSBcdTA0MzJcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzguXHJcblx0XHRcdGF3YWl0IHRoaXMuZmV0Y2hHcmFwaERhdGEodGhpcy5zZWxlY3RlZEdyYXBoSWQpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDMxXHUwNDRCXHUwNDNCIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5kZWxldGUobm9kZUlkKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAke25vZGVJZH06YCwgZXJyb3IpO1xyXG5cdFx0XHRuZXcgTm90aWNlKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzA6ICR7ZXJyb3IubWVzc2FnZX1gLCA1MDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2ZW50IEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NDMgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG5cdCAqIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzOCBcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1ICdub2RlLXNlbGVjdGVkJy5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIC0gSUQgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMC5cclxuXHQgKi9cclxuXHRoYW5kbGVOb2RlQ2xpY2sobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBub2RlSWQ7XHJcblx0XHQvLyBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRCXHUwNDM0XHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzNVxyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWROb2RlSWRzLnNpemUgPiAwKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWROb2RlSWRzLmNsZWFyKCk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdub2RlLXNlbGVjdGVkJywgeyBub2RlSWQsIGdyYXBoSWQ6IHRoaXMuc2VsZWN0ZWRHcmFwaElkIH0pO1xyXG5cdFx0dGhpcy5yZW5kZXJHcmFwaFBhbmVsKCk7IC8vIFx1MDQxMlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcIlx1MDQzNlx1MDQzOFx1MDQ0MFx1MDQzRFx1MDQzRVx1MDQzNVwiIFx1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDEgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzRVx1MDQzOSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzQyBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDBcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBub2RlSWQgLSBJRCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcblx0ICogQHBhcmFtIHtib29sZWFufSBpc1NlbGVjdGVkIC0gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0aGFuZGxlTm9kZVNlbGVjdGlvbkNoYW5nZShub2RlSWQ6IHN0cmluZywgaXNTZWxlY3RlZDogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0aWYgKGlzU2VsZWN0ZWQpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZE5vZGVJZHMuYWRkKG5vZGVJZCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5kZWxldGUobm9kZUlkKTtcclxuXHRcdH1cclxuXHRcdHRoaXMucmVuZGVyR3JhcGhQYW5lbCgpOyAvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzMCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLlxyXG5cdCAqIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzNVx1MDQzM1x1MDQzRS5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVOZXdDaGF0KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dGhpcy5ncmFwaERhdGEgPSB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH07XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcclxuXHRcdHRoaXMuc2VsZWN0ZWROb2RlSWRzLmNsZWFyKCk7XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9ncmFwaHMvbmV3YCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDMxXHUwNDREXHUwNDNBXHUwNDM1XHUwNDNEXHUwNDM0XHUwNDM1OiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cdFx0XHRjb25zdCBuZXdHcmFwaElkID0gcmVzdWx0LmdyYXBoX2lkO1xyXG5cclxuXHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoSWQgPSBuZXdHcmFwaElkO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkR3JhcGhUaXRsZSA9ICdcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0JzsgLy8gXHUwNDExXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRCBmZXRjaEdyYXBoRGF0YSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMVx1MDQ0RFx1MDQzQVx1MDQzNVx1MDQzRFx1MDQzNCBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0MzVcdTA0NDIgdGl0bGVcclxuXHJcblx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLXNlbGVjdGVkJywgeyBncmFwaElkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCwgY3VycmVudE5vZGU6IG51bGwgfSk7XHJcblxyXG5cdFx0XHR0aGlzLmZldGNoR3JhcGhzTGlzdCgpOyAvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDNBIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMiBcdTA0MzIgSGlzdG9yeVBhbmVsXHJcblxyXG5cdFx0XHQvLyBcdTA0MURcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDNGXHUwNDM4XHUwNDQxXHUwNDQ3XHUwNDM4XHUwNDNBXHUwNDNFXHUwNDMyOiB0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdjaGF0LWhpc3RvcnktdXBkYXRlZCcsIHsgZ3JhcGhJZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsIG1lc3NhZ2VzOiBbXSwgY3VycmVudF9ub2RlX2lkOiBudWxsIH0pO1xyXG5cdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1jdXN0b20tcHJvbXB0LXVwZGF0ZWQnLCB7IGdyYXBoX2lkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCwgY3VzdG9tX3N5c3RlbV9wcm9tcHQ6IG51bGwgfSk7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5ncmFwaFNldHRpbmdzQnV0dG9uLnNldEF0dHIoJ2Rpc2FibGVkJywgbnVsbCk7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMDonLCBlcnJvcik7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzA6ICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3J9YCwgNTAwMCk7XHJcblx0XHRcdC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MSBcdTA0NDFcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQ0MVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNSBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzgsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDMxXHUwNDRCXHUwNDNCXHUwNDNFIFwiXHUwNDQ0XHUwNDMwXHUwNDNEXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFXCIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRHcmFwaElkID0gbnVsbDtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBudWxsO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRpdGxlKCk7XHJcblx0XHRcdGlmICh0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24pIHtcclxuXHRcdFx0XHR0aGlzLmdyYXBoU2V0dGluZ3NCdXR0b24uc2V0QXR0cignZGlzYWJsZWQnLCAndHJ1ZScpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzhcdTA0MzcgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOC5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVHcmFwaFNlbGVjdGVkKGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBjdXJyZW50Tm9kZTogc3RyaW5nIHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhJZCA9IGRhdGEuZ3JhcGhJZDtcclxuXHRcdHRoaXMuc2VsZWN0ZWROb2RlSWRzLmNsZWFyKCk7XHJcblx0XHRhd2FpdCB0aGlzLmZldGNoR3JhcGhEYXRhKGRhdGEuZ3JhcGhJZCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDM4XHUwNDM3IENoYXRQYW5lbC5cclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVEZWxldGVOb2RlRnJvbUNoYXQoZGF0YTogeyBncmFwaElkOiBzdHJpbmc7IG5vZGVJZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGlmIChkYXRhLmdyYXBoSWQgPT09IHRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlRGVsZXRlTm9kZShkYXRhLm5vZGVJZCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MjFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDQzLiBcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNEXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM3XHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzOFx1MDQzNyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwLicsIDMwMDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXCJcdTA0MUFcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QlwiLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGhhbmRsZUNvcHlTZWxlY3RlZE5vZGVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWROb2RlSWRzLnNpemUgPT09IDApIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDEyXHUwNDRCXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGLicsIDIwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbWVzc2FnZXNUb0NvcHk6IHN0cmluZ1tdID0gW107XHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzFcdTA0MzhcdTA0NDBcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NEZcdTA0MzRcdTA0M0FcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0XHQvLyBcdTA0MURcdTA0MzVcdTA0M0VcdTA0MzFcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0NcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDQyXHUwNDM4XHUwNDQxXHUwNDRDIFx1MDQzRlx1MDQzRSBub2RlcyBcdTA0MzIgZ3JhcGhEYXRhLCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XHJcblx0XHRjb25zdCBvcmRlcmVkTm9kZUlkcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZE5vZGVJZHMpOyAvLyBcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDNFXHUwNDNBXHJcblx0XHRmb3IgKGNvbnN0IG5vZGVJZCBvZiBvcmRlcmVkTm9kZUlkcykge1xyXG5cdFx0XHRjb25zdCBub2RlID0gdGhpcy5ncmFwaERhdGEubm9kZXMuZmluZCgobikgPT4gbi5pZCA9PT0gbm9kZUlkKTtcclxuXHRcdFx0aWYgKG5vZGUgJiYgbm9kZS5kYXRhICYmIG5vZGUuZGF0YS5tZXNzYWdlICYmIG5vZGUuZGF0YS5tZXNzYWdlLmNvbnRlbnQpIHtcclxuXHRcdFx0XHRtZXNzYWdlc1RvQ29weS5wdXNoKG5vZGUuZGF0YS5tZXNzYWdlLmNvbnRlbnQpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG1lc3NhZ2VzVG9Db3B5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChtZXNzYWdlc1RvQ29weS5qb2luKCdcXG5cXG4tLS0gXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDIC0tLSBcXG5cXG4nKSk7XHJcblx0XHRcdFx0bmV3IE5vdGljZShgXHUwNDIxXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNFICR7bWVzc2FnZXNUb0NvcHkubGVuZ3RofSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkuYCwgMjAwMCk7XHJcblx0XHRcdH0gY2F0Y2ggKGVycikge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RjonLCBlcnIpO1xyXG5cdFx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOS4nLCAzMDAwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDFEXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwXHUwNDQ1LicsIDIwMDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXCJcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QlwiLlxyXG5cdCAqL1xyXG5cdGFzeW5jIGhhbmRsZURlbGV0ZVNlbGVjdGVkTm9kZXMoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZE5vZGVJZHMuc2l6ZSA9PT0gMCkge1xyXG5cdFx0XHRuZXcgTm90aWNlKCdcdTA0MTJcdTA0NEJcdTA0MzFcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuJywgMjAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRHcmFwaElkKSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRFx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0QgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyLicsIDMwMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY29uZmlybWVkID0gYXdhaXQgRGlhbG9nLmNvbmZpcm0oXHJcblx0XHRcdHRoaXMucGx1Z2luLmFwcCxcclxuXHRcdFx0YFx1MDQxMlx1MDQ0QiBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NEIsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDICR7dGhpcy5zZWxlY3RlZE5vZGVJZHMuc2l6ZX0gXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMj9gXHJcblx0XHQpO1xyXG5cdFx0aWYgKCFjb25maXJtZWQpIHJldHVybjtcclxuXHJcblx0XHRuZXcgTm90aWNlKGBcdTA0MURcdTA0MzBcdTA0NDdcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NEUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1ICR7dGhpcy5zZWxlY3RlZE5vZGVJZHMuc2l6ZX0gXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyLi4uYCwgMjAwMCk7XHJcblx0XHRjb25zdCBub2Rlc1RvRGVsZXRlID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkTm9kZUlkcyk7IC8vIFx1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NEZcdTA0MzRcdTA0M0VcdTA0M0EgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblxyXG5cdFx0Zm9yIChjb25zdCBub2RlSWQgb2Ygbm9kZXNUb0RlbGV0ZSkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vZ3JhcGhzLyR7dGhpcy5zZWxlY3RlZEdyYXBoSWR9L25vZGVzLyR7bm9kZUlkfWAsIHtcclxuXHRcdFx0XHRcdG1ldGhvZDogJ0RFTEVURSdcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKCFyZXNwb25zZS5vaykge1xyXG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAke25vZGVJZH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAtICR7ZXJyb3JUZXh0fWApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRuZXcgTm90aWNlKGBcdTA0MjNcdTA0MzdcdTA0MzVcdTA0M0IgJHtub2RlSWQuc3Vic3RyaW5nKDAsIDgpfS4uLiBcdTA0NDNcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDhcdTA0M0RcdTA0M0UgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNELmAsIDEwMDApO1xyXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAke25vZGVJZH06YCwgZXJyb3IpO1xyXG5cdFx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAke25vZGVJZC5zdWJzdHJpbmcoMCwgOCl9Li4uOiAke2Vycm9yLm1lc3NhZ2V9YCwgNTAwMCk7XHJcblx0XHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDNFXHUwNDNCXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiwgXHUwNDNEXHUwNDNFIFx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0NDNcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0NDUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDXHUwNDRFXHJcblx0XHR0aGlzLnNlbGVjdGVkTm9kZUlkcy5jbGVhcigpO1xyXG5cdFx0YXdhaXQgdGhpcy5mZXRjaEdyYXBoRGF0YSh0aGlzLnNlbGVjdGVkR3JhcGhJZCk7IC8vIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0Q1x1MDQ0RSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzOCBcdTA0NDdcdTA0MzBcdTA0NDItXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDXHJcblx0XHRuZXcgTm90aWNlKCdcdTA0MUVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzMC4nLCAyMDAwKTtcclxuXHR9XHJcblxyXG5cdGhhbmRsZVN0cmVhbVN0YXJ0ZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZzsgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMuYWN0aXZlU3RyZWFtQ29udHJvbGxlcnMuc2V0KGRhdGEubm9kZUlkLCBkYXRhLmNvbnRyb2xsZXIpO1xyXG5cdH1cclxuXHJcblx0aGFuZGxlU3RyZWFtRW5kZWQoZGF0YTogeyBub2RlSWQ6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHR0aGlzLmFjdGl2ZVN0cmVhbUNvbnRyb2xsZXJzLmRlbGV0ZShkYXRhLm5vZGVJZCk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXZWJTb2NrZXQgRXZlbnQgSGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzcgV2ViU29ja2V0XHJcblx0ICovXHJcblx0aGFuZGxlTm9kZVR5cGVDaGFuZ2VkKGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBub2RlSWQ6IHN0cmluZzsgbm9kZVR5cGU6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkR3JhcGhJZCAhPT0gZGF0YS5ncmFwaElkKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MURcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0MgXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0MzhcdTA0M0YgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzMiBncmFwaERhdGFcclxuXHRcdGNvbnN0IG5vZGVJbmRleCA9IHRoaXMuZ3JhcGhEYXRhLm5vZGVzLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gZGF0YS5ub2RlSWQpO1xyXG5cdFx0aWYgKG5vZGVJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0dGhpcy5ncmFwaERhdGEubm9kZXNbbm9kZUluZGV4XS50eXBlID0gZGF0YS5ub2RlVHlwZTtcclxuXHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDQxIFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQyBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0M0VcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwXHJcblx0XHRcdHRoaXMucmVuZGVyR3JhcGhQYW5lbCgpO1xyXG5cclxuXHRcdFx0Y29uc29sZS5sb2coYFx1MjcwNSBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0QgXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCAke2RhdGEubm9kZUlkfTogXCIke2RhdGEubm9kZVR5cGV9XCJgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzcgV2ViU29ja2V0XHJcblx0ICovXHJcblx0aGFuZGxlR3JhcGhUaXRsZVVwZGF0ZWQoZGF0YTogeyBncmFwaF9pZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0pOiB2b2lkIHtcclxuXHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQgPT09IGRhdGEuZ3JhcGhfaWQpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEdyYXBoVGl0bGUgPSBkYXRhLnRpdGxlO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVRpdGxlKCk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MjJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4XHJcblx0XHRcdGlmICh0aGlzLmhpc3RvcnlQYW5lbCkge1xyXG5cdFx0XHRcdHRoaXMuZmV0Y2hHcmFwaHNMaXN0KCk7IC8vIFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzcgV2ViU29ja2V0XHJcblx0ICovXHJcblx0aGFuZGxlTm9kZVRpdGxlVXBkYXRlZChkYXRhOiB7IGdyYXBoX2lkOiBzdHJpbmc7IG5vZGVfaWQ6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkR3JhcGhJZCAhPT0gZGF0YS5ncmFwaF9pZCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDIFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzMiBncmFwaERhdGFcclxuXHRcdGNvbnN0IG5vZGVJbmRleCA9IHRoaXMuZ3JhcGhEYXRhLm5vZGVzLmZpbmRJbmRleCgobikgPT4gbi5pZCA9PT0gZGF0YS5ub2RlX2lkKTtcclxuXHRcdGlmIChub2RlSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzJcdTA0M0VcdTA0M0EgXHUwNDM4IFx1MDQ0NFx1MDQzQlx1MDQzMFx1MDQzMyBcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHRcdFx0dGhpcy5ncmFwaERhdGEubm9kZXNbbm9kZUluZGV4XS5kYXRhLnRpdGxlID0gZGF0YS50aXRsZTtcclxuXHRcdFx0dGhpcy5ncmFwaERhdGEubm9kZXNbbm9kZUluZGV4XS5kYXRhLnRpdGxlX2dlbmVyYXRlZCA9IHRydWU7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQ0MSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDNDXHUwNDM4XHJcblx0XHRcdC8vIFJlYWN0IEZsb3cgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDM4IFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0MiBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQlxyXG5cdFx0XHR0aGlzLnJlbmRlckdyYXBoUGFuZWwoKTtcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKGBcdTI3MDUgXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgJHtkYXRhLm5vZGVfaWR9OiBcIiR7ZGF0YS50aXRsZX1cImApO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCB9IGZyb20gJ29ic2lkaWFuJztcclxuXHJcbnR5cGUgRGlhbG9nVHlwZSA9ICdhbGVydCcgfCAnY29uZmlybScgfCAncHJvbXB0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2cgZXh0ZW5kcyBNb2RhbCB7XHJcblx0cHJpdmF0ZSB0eXBlOiBEaWFsb2dUeXBlO1xyXG5cdHByaXZhdGUgbWVzc2FnZTogc3RyaW5nO1xyXG5cdHByaXZhdGUgcmVzb2x2ZUZuOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuXHRwcml2YXRlIGlucHV0VmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cdHByaXZhdGUgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHR5cGU6IERpYWxvZ1R5cGUsIG1lc3NhZ2U6IHN0cmluZywgcGxhY2Vob2xkZXIgPSAnJykge1xyXG5cdFx0c3VwZXIoYXBwKTtcclxuXHRcdHRoaXMudHlwZSA9IHR5cGU7XHJcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG5cdFx0dGhpcy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xyXG5cdH1cclxuXHJcblx0b3BlbigpOiBQcm9taXNlPGFueT4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblx0XHRcdHRoaXMucmVzb2x2ZUZuID0gcmVzb2x2ZTtcclxuXHRcdFx0c3VwZXIub3BlbigpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRvbk9wZW4oKSB7XHJcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cclxuXHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiB0aGlzLm1lc3NhZ2UsIGNsczogJ2RpYWxvZy1tZXNzYWdlJyB9KTtcclxuXHJcblx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggcHJvbXB0IFx1MjAxNCBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgaW5wdXRcclxuXHRcdGlmICh0aGlzLnR5cGUgPT09ICdwcm9tcHQnKSB7XHJcblx0XHRcdGNvbnN0IGlucHV0ID0gY29udGVudEVsLmNyZWF0ZUVsKCdpbnB1dCcsIHtcclxuXHRcdFx0XHR0eXBlOiAndGV4dCcsXHJcblx0XHRcdFx0Y2xzOiAnZGlhbG9nLWlucHV0JyxcclxuXHRcdFx0XHRhdHRyOiB7IHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyIH1cclxuXHRcdFx0fSkgYXMgSFRNTElucHV0RWxlbWVudDtcclxuXHJcblx0XHRcdGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5pbnB1dFZhbHVlID0gaW5wdXQudmFsdWU7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpbnB1dC5mb2N1cygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNFXHUwNDNBXHJcblx0XHRjb25zdCBidXR0b25zRGl2ID0gY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogJ2RpYWxvZy1idXR0b25zJyB9KTtcclxuXHJcblx0XHRpZiAodGhpcy50eXBlID09PSAnYWxlcnQnKSB7XHJcblx0XHRcdC8vIFx1MDQyMlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBPS1xyXG5cdFx0XHRjb25zdCBva0J0biA9IGJ1dHRvbnNEaXYuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdGV4dDogJ09LJywgY2xzOiAnbW9kLWN0YScgfSk7XHJcblx0XHRcdG9rQnRuLm9uY2xpY2sgPSAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZXNvbHZlRm4odW5kZWZpbmVkKTtcclxuXHRcdFx0XHR0aGlzLmNsb3NlKCk7XHJcblx0XHRcdH07XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbmZpcm0nIHx8IHRoaXMudHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDQyXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDMwXHJcblx0XHRcdGNvbnN0IGNhbmNlbEJ0biA9IGJ1dHRvbnNEaXYuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdGV4dDogJ1x1MDQxRVx1MDQ0Mlx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzMCcgfSk7XHJcblx0XHRcdGNhbmNlbEJ0bi5vbmNsaWNrID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVzb2x2ZUZuKHRoaXMudHlwZSA9PT0gJ3Byb21wdCcgPyBudWxsIDogZmFsc2UpO1xyXG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8vIE9LXHJcblx0XHRcdGNvbnN0IG9rQnRuID0gYnV0dG9uc0Rpdi5jcmVhdGVFbCgnYnV0dG9uJywgeyB0ZXh0OiAnT0snLCBjbHM6ICdtb2QtY3RhJyB9KTtcclxuXHRcdFx0b2tCdG4ub25jbGljayA9ICgpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRcdFx0dGhpcy5yZXNvbHZlRm4odGhpcy5pbnB1dFZhbHVlKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5yZXNvbHZlRm4odHJ1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uQ2xvc2UoKSB7XHJcblx0XHR0aGlzLmNvbnRlbnRFbC5lbXB0eSgpO1xyXG5cdH1cclxuXHJcblx0Ly8gXHUwNDIxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzNFx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFxyXG5cclxuXHRzdGF0aWMgc2hvdyhhcHA6IEFwcCwgdHlwZTogRGlhbG9nVHlwZSwgbWVzc2FnZTogc3RyaW5nLCBwbGFjZWhvbGRlciA9ICcnKTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdGNvbnN0IGRpYWxvZyA9IG5ldyBEaWFsb2coYXBwLCB0eXBlLCBtZXNzYWdlLCBwbGFjZWhvbGRlcik7XHJcblx0XHRyZXR1cm4gZGlhbG9nLm9wZW4oKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBhbGVydChhcHA6IEFwcCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRyZXR1cm4gRGlhbG9nLnNob3coYXBwLCAnYWxlcnQnLCBtZXNzYWdlKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjb25maXJtKGFwcDogQXBwLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuXHRcdHJldHVybiBEaWFsb2cuc2hvdyhhcHAsICdjb25maXJtJywgbWVzc2FnZSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgcHJvbXB0KGFwcDogQXBwLCBtZXNzYWdlOiBzdHJpbmcsIHBsYWNlaG9sZGVyID0gJycpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuXHRcdHJldHVybiBEaWFsb2cuc2hvdyhhcHAsICdwcm9tcHQnLCBtZXNzYWdlLCBwbGFjZWhvbGRlcik7XHJcblx0fVxyXG59XHJcbiIsICIvKlxyXG4gKiBcdTA0MjNcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDM4IFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC4gXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwXHJcbiAqIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0OFx1MDQzQlx1MDQ0Qlx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzNcdTA0M0VcdTA0MzJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0MzIsIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzMCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDM1XHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzRVx1MDQzMi5cclxuICovXHJcblxyXG5pbXBvcnQgTExNQWdlbnRQbHVnaW4gZnJvbSAnbWFpbic7XHJcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSAnLi4vdXRpbHMvRXZlbnRCdXMnO1xyXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICdzcmMvdXRpbHMvRGlhbG9nJztcclxuXHJcbmV4cG9ydCBjbGFzcyBIaXN0b3J5UGFuZWwge1xyXG5cdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcblx0cHJvcHM6IHtcclxuXHRcdGdyYXBoczogYW55W107XHJcblx0XHRldmVudEJ1czogRXZlbnRCdXM7XHJcblx0fTtcclxuXHRwbHVnaW46IExMTUFnZW50UGx1Z2luO1xyXG5cdGdyYXBoczogYW55W107XHJcblx0bmV3Q2hhdEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0Y2xlYXJBbGxCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdGNoYXRMaXN0OiBIVE1MRWxlbWVudDtcclxuXHRjb250ZXh0TWVudTogSFRNTEVsZW1lbnQ7XHJcblx0ZGVsZXRlQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRyZW5hbWVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdGNvbnRleHRNZW51R3JhcGhJZDogc3RyaW5nIHwgbnVsbDtcclxuXHRjdXJyZW50UGFnZTogbnVtYmVyO1xyXG5cdGl0ZW1zUGVyUGFnZTogbnVtYmVyO1xyXG5cdHBhZ2luYXRpb25Db250YWluZXI6IEhUTUxFbGVtZW50O1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXHJcblx0XHRwcm9wczoge1xyXG5cdFx0XHRncmFwaHM6IGFueVtdO1xyXG5cdFx0XHRldmVudEJ1czogRXZlbnRCdXM7XHJcblx0XHR9LFxyXG5cdFx0cGx1Z2luOiBMTE1BZ2VudFBsdWdpblxyXG5cdCkge1xyXG5cdFx0dGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcblx0XHR0aGlzLnByb3BzID0gcHJvcHM7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHRcdHRoaXMuZ3JhcGhzID0gcHJvcHMuZ3JhcGhzIHx8IFtdO1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLml0ZW1zUGVyUGFnZSA9IDQwO1xyXG5cclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0aW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IGBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxsbS1hZ2VudC1oaXN0b3J5LXBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlzdG9yeS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDM+XHUwNDE4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzMjwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpc3RvcnktaGVhZGVyLWJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cIm5ldy1jaGF0LWJ1dHRvblwiIGNsYXNzPVwibmV3LWNoYXQtYnV0dG9uXCI+KyBcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDQ3XHUwNDMwXHUwNDQyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjbGVhci1hbGwtYnV0dG9uXCIgY2xhc3M9XCJjbGVhci1hbGwtYnV0dG9uXCI+XHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQ0QjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1saXN0XCIgaWQ9XCJjaGF0LWxpc3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLWNvbnRhaW5lclwiIGlkPVwicGFnaW5hdGlvbi1jb250YWluZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51XCIgaWQ9XCJjb250ZXh0LW1lbnVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInJlbmFtZS1ncmFwaC1idXR0b25cIj5cdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLWdyYXBoLWJ1dHRvblwiPlx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIGA7XHJcblxyXG5cdFx0dGhpcy5uZXdDaGF0QnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI25ldy1jaGF0LWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdFx0dGhpcy5jbGVhckFsbEJ1dHRvbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNjbGVhci1hbGwtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7IC8vIFx1MDQxNFx1MDQxRVx1MDQxMVx1MDQxMFx1MDQxMlx1MDQxQlx1MDQxNVx1MDQxRFx1MDQxRVxyXG5cdFx0dGhpcy5jaGF0TGlzdCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNjaGF0LWxpc3QnKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdHRoaXMucGFnaW5hdGlvbkNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNwYWdpbmF0aW9uLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50OyAvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUVcclxuXHRcdHRoaXMuY29udGV4dE1lbnUgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY29udGV4dC1tZW51JykgYXMgSFRNTEVsZW1lbnQ7XHJcblx0XHR0aGlzLnJlbmFtZUJ1dHRvbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNyZW5hbWUtZ3JhcGgtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7IC8vIFx1MDQxNFx1MDQxRVx1MDQxMVx1MDQxMFx1MDQxMlx1MDQxQlx1MDQxNVx1MDQxRFx1MDQxRVxyXG5cdFx0dGhpcy5kZWxldGVCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjZGVsZXRlLWdyYXBoLWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xyXG5cclxuXHRcdHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xyXG5cdFx0dGhpcy5yZW5kZXJHcmFwaHMoKTtcclxuXHR9XHJcblxyXG5cdHNldHVwRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcblx0XHR0aGlzLm5ld0NoYXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMucHJvcHMuZXZlbnRCdXMuZW1pdCgnbmV3LWNoYXQnKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuY2xlYXJBbGxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuaGFuZGxlQ2xlYXJBbGxDaGF0cygpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5hbWVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmNvbnRleHRNZW51R3JhcGhJZCkge1xyXG5cdFx0XHRcdHRoaXMuaGFuZGxlUmVuYW1lR3JhcGgodGhpcy5jb250ZXh0TWVudUdyYXBoSWQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmRlbGV0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMuY29udGV4dE1lbnVHcmFwaElkKSB7XHJcblx0XHRcdFx0dGhpcy5oYW5kbGVEZWxldGVHcmFwaCh0aGlzLmNvbnRleHRNZW51R3JhcGhJZCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRFIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzUgXHUwNDMyXHUwNDNEXHUwNDM1IFx1MDQzNVx1MDQzM1x1MDQzRVxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRpZiAoIXRoaXMuY29udGV4dE1lbnUuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpIHtcclxuXHRcdFx0XHR0aGlzLmNvbnRleHRNZW51LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cmVuZGVyR3JhcGhzKCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qgc3RhcnRJbmRleCA9ICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLml0ZW1zUGVyUGFnZTtcclxuXHRcdGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHRoaXMuaXRlbXNQZXJQYWdlO1xyXG5cdFx0Y29uc3QgZ3JhcGhzVG9TaG93ID0gdGhpcy5ncmFwaHMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xyXG5cclxuXHRcdHRoaXMuY2hhdExpc3QuaW5uZXJIVE1MID0gZ3JhcGhzVG9TaG93XHJcblx0XHRcdC5tYXAoKGdyYXBoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdGl0bGVDbGFzcyA9IGdyYXBoLnRpdGxlX2dlbmVyYXRlZCA/ICdncmFwaC10aXRsZS1nZW5lcmF0ZWQnIDogJ2dyYXBoLXRpdGxlLXBlbmRpbmcnO1xyXG5cdFx0XHRcdGNvbnN0IGRpc3BsYXlUaXRsZSA9IGdyYXBoLnRpdGxlIHx8IGdyYXBoLmZpcnN0X21lc3NhZ2UgfHwgYFx1MDQxM1x1MDQ0MFx1MDQzMFx1MDQ0NCAke2dyYXBoLmlkfWA7XHJcblxyXG5cdFx0XHRcdHJldHVybiBgXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1saXN0LWl0ZW1cIiBkYXRhLWdyYXBoLWlkPVwiJHtncmFwaC5pZH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1pdGVtLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtaXRlbS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRydW5jYXRlICR7dGl0bGVDbGFzc31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2Rpc3BsYXlUaXRsZX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWl0ZW0tYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNoYXQtaXRlbS1vcHRpb25zLWJ1dHRvblwiIGRhdGEtZ3JhcGgtaWQ9XCIke2dyYXBoLmlkfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjJFRVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIGA7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5qb2luKCcnKTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdFx0dGhpcy5jaGF0TGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuY2hhdC1saXN0LWl0ZW0nKS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcblx0XHRcdGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRcdGlmICghKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoJ2NoYXQtaXRlbS1vcHRpb25zLWJ1dHRvbicpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBncmFwaElkID0gKGl0ZW0gYXMgSFRNTEVsZW1lbnQpLmRhdGFzZXQuZ3JhcGhJZDtcclxuXHRcdFx0XHRcdGlmIChncmFwaElkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucHJvcHMuZXZlbnRCdXMuZW1pdCgnZ3JhcGgtc2VsZWN0ZWQnLCB7IGdyYXBoSWQ6IGdyYXBoSWQsIGN1cnJlbnROb2RlOiBudWxsIH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmNoYXRMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jaGF0LWl0ZW0tb3B0aW9ucy1idXR0b24nKS5mb3JFYWNoKChidXR0b24pID0+IHtcclxuXHRcdFx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdHRoaXMuc2hvd0NvbnRleHRNZW51KGUsIChidXR0b24gYXMgSFRNTEVsZW1lbnQpLmRhdGFzZXQuZ3JhcGhJZCB8fCAnJyk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5yZW5kZXJQYWdpbmF0aW9uKCk7XHJcblx0fVxyXG5cclxuXHRyZW5kZXJQYWdpbmF0aW9uKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLmdyYXBocy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyUGFnZSk7XHJcblxyXG5cdFx0aWYgKHRvdGFsUGFnZXMgPD0gMSkge1xyXG5cdFx0XHR0aGlzLnBhZ2luYXRpb25Db250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgcGFnaW5hdGlvbkhUTUwgPSAnPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tYnV0dG9uc1wiPic7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDRCXHUwNDM0XHUwNDQzXHUwNDQ5XHUwNDMwXHUwNDRGXCJcclxuXHRcdGlmICh0aGlzLmN1cnJlbnRQYWdlID4gMSkge1xyXG5cdFx0XHRwYWdpbmF0aW9uSFRNTCArPSBgPGJ1dHRvbiBjbGFzcz1cInBhZ2luYXRpb24tYnV0dG9uXCIgZGF0YS1wYWdlPVwiJHt0aGlzLmN1cnJlbnRQYWdlIC0gMX1cIj5cdTIxOTA8L2J1dHRvbj5gO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDZcclxuXHRcdGNvbnN0IG1heFZpc2libGVQYWdlcyA9IDU7XHJcblx0XHRsZXQgc3RhcnRQYWdlID0gTWF0aC5tYXgoMSwgdGhpcy5jdXJyZW50UGFnZSAtIE1hdGguZmxvb3IobWF4VmlzaWJsZVBhZ2VzIC8gMikpO1xyXG5cdFx0bGV0IGVuZFBhZ2UgPSBNYXRoLm1pbih0b3RhbFBhZ2VzLCBzdGFydFBhZ2UgKyBtYXhWaXNpYmxlUGFnZXMgLSAxKTtcclxuXHJcblx0XHRpZiAoZW5kUGFnZSAtIHN0YXJ0UGFnZSA8IG1heFZpc2libGVQYWdlcyAtIDEpIHtcclxuXHRcdFx0c3RhcnRQYWdlID0gTWF0aC5tYXgoMSwgZW5kUGFnZSAtIG1heFZpc2libGVQYWdlcyArIDEpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChzdGFydFBhZ2UgPiAxKSB7XHJcblx0XHRcdHBhZ2luYXRpb25IVE1MICs9IGA8YnV0dG9uIGNsYXNzPVwicGFnaW5hdGlvbi1idXR0b25cIiBkYXRhLXBhZ2U9XCIxXCI+MTwvYnV0dG9uPmA7XHJcblx0XHRcdGlmIChzdGFydFBhZ2UgPiAyKSB7XHJcblx0XHRcdFx0cGFnaW5hdGlvbkhUTUwgKz0gYDxzcGFuIGNsYXNzPVwicGFnaW5hdGlvbi1lbGxpcHNpc1wiPi4uLjwvc3Bhbj5gO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0UGFnZTsgaSA8PSBlbmRQYWdlOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgYWN0aXZlQ2xhc3MgPSBpID09PSB0aGlzLmN1cnJlbnRQYWdlID8gJ2FjdGl2ZScgOiAnJztcclxuXHRcdFx0cGFnaW5hdGlvbkhUTUwgKz0gYDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWJ1dHRvbiAke2FjdGl2ZUNsYXNzfVwiIGRhdGEtcGFnZT1cIiR7aX1cIj4ke2l9PC9idXR0b24+YDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZW5kUGFnZSA8IHRvdGFsUGFnZXMpIHtcclxuXHRcdFx0aWYgKGVuZFBhZ2UgPCB0b3RhbFBhZ2VzIC0gMSkge1xyXG5cdFx0XHRcdHBhZ2luYXRpb25IVE1MICs9IGA8c3BhbiBjbGFzcz1cInBhZ2luYXRpb24tZWxsaXBzaXNcIj4uLi48L3NwYW4+YDtcclxuXHRcdFx0fVxyXG5cdFx0XHRwYWdpbmF0aW9uSFRNTCArPSBgPGJ1dHRvbiBjbGFzcz1cInBhZ2luYXRpb24tYnV0dG9uXCIgZGF0YS1wYWdlPVwiJHt0b3RhbFBhZ2VzfVwiPiR7dG90YWxQYWdlc308L2J1dHRvbj5gO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzMCBcIlx1MDQyMVx1MDQzQlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzMFx1MDQ0RlwiXHJcblx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA8IHRvdGFsUGFnZXMpIHtcclxuXHRcdFx0cGFnaW5hdGlvbkhUTUwgKz0gYDxidXR0b24gY2xhc3M9XCJwYWdpbmF0aW9uLWJ1dHRvblwiIGRhdGEtcGFnZT1cIiR7dGhpcy5jdXJyZW50UGFnZSArIDF9XCI+XHUyMTkyPC9idXR0b24+YDtcclxuXHRcdH1cclxuXHJcblx0XHRwYWdpbmF0aW9uSFRNTCArPSAnPC9kaXY+JztcclxuXHRcdHRoaXMucGFnaW5hdGlvbkNvbnRhaW5lci5pbm5lckhUTUwgPSBwYWdpbmF0aW9uSFRNTDtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0FcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0MzNcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHRcdHRoaXMucGFnaW5hdGlvbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcucGFnaW5hdGlvbi1idXR0b24nKS5mb3JFYWNoKChidXR0b24pID0+IHtcclxuXHRcdFx0YnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0XHRjb25zdCBwYWdlID0gcGFyc2VJbnQoKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0LnBhZ2UgfHwgJzEnKTtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlckdyYXBocygpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0c2hvd0NvbnRleHRNZW51KGV2ZW50OiBFdmVudCwgZ3JhcGhJZDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdHRoaXMuY29udGV4dE1lbnVHcmFwaElkID0gZ3JhcGhJZDtcclxuXHJcblx0XHRjb25zdCBidXR0b25FbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0Y29uc3QgcmVjdCA9IGJ1dHRvbkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG5cdFx0Y29uc3Qgd29ya3NwYWNlTGVhZkNvbnRlbnQgPSBidXR0b25FbGVtZW50LmNsb3Nlc3QoJy53b3Jrc3BhY2UtbGVhZi1jb250ZW50JykgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG5cdFx0bGV0IHJlbGF0aXZlQ29udGFpbmVyUmVjdCA9IHsgbGVmdDogMCwgdG9wOiAwIH07XHJcblx0XHRpZiAod29ya3NwYWNlTGVhZkNvbnRlbnQpIHtcclxuXHRcdFx0cmVsYXRpdmVDb250YWluZXJSZWN0ID0gd29ya3NwYWNlTGVhZkNvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggLndvcmtzcGFjZS1sZWFmLWNvbnRlbnQgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCwgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIGNvbnRhaW5lciBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDM3XHUwNDMwXHUwNDNGXHUwNDMwXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzMlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzMFx1MDQzRFx1MDQ0MlxyXG5cdFx0XHRyZWxhdGl2ZUNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmNvbnRleHRNZW51LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblx0XHR0aGlzLmNvbnRleHRNZW51LnN0eWxlLmxlZnQgPSBgJHtyZWN0LmxlZnQgLSByZWxhdGl2ZUNvbnRhaW5lclJlY3QubGVmdH1weGA7XHJcblx0XHR0aGlzLmNvbnRleHRNZW51LnN0eWxlLnRvcCA9IGAke3JlY3QuYm90dG9tIC0gcmVsYXRpdmVDb250YWluZXJSZWN0LnRvcCArIDR9cHhgO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgaGFuZGxlUmVuYW1lR3JhcGgoZ3JhcGhJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBncmFwaCA9IHRoaXMuZ3JhcGhzLmZpbmQoKGcpID0+IGcuaWQgPT09IGdyYXBoSWQpO1xyXG5cdFx0XHRpZiAoIWdyYXBoKSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBjdXJyZW50VGl0bGUgPSBncmFwaC50aXRsZSB8fCBncmFwaC5maXJzdF9tZXNzYWdlIHx8ICcnO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDUxXHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzMCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNEXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0XHRcdGNvbnN0IG5ld1RpdGxlID0gYXdhaXQgRGlhbG9nLnByb21wdCh0aGlzLnBsdWdpbi5hcHAsICdcdTA0MTJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNTonLCBjdXJyZW50VGl0bGUpO1xyXG5cclxuXHRcdFx0aWYgKG5ld1RpdGxlID09PSBudWxsIHx8IG5ld1RpdGxlLnRyaW0oKSA9PT0gJycpIHtcclxuXHRcdFx0XHRyZXR1cm47IC8vIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0M0VcdTA0NDJcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzhcdTA0M0IgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQzMlx1MDQ1MVx1MDQzQiBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvZ3JhcGhzLyR7Z3JhcGhJZH0vcmVuYW1lYCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BBVENIJyxcclxuXHRcdFx0XHRoZWFkZXJzOiB7XHJcblx0XHRcdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRpdGxlOiBuZXdUaXRsZS50cmltKCkgfSlcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBIVFRQIFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCEgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQxOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDNFXHUwNDMyXHJcblx0XHRcdGNvbnN0IGdyYXBoSW5kZXggPSB0aGlzLmdyYXBocy5maW5kSW5kZXgoKGcpID0+IGcuaWQgPT09IGdyYXBoSWQpO1xyXG5cdFx0XHRpZiAoZ3JhcGhJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmdyYXBoc1tncmFwaEluZGV4XS50aXRsZSA9IG5ld1RpdGxlLnRyaW0oKTtcclxuXHRcdFx0XHR0aGlzLmdyYXBoc1tncmFwaEluZGV4XS50aXRsZV9nZW5lcmF0ZWQgPSB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR0aGlzLnJlbmRlckdyYXBocygpO1xyXG5cdFx0XHR0aGlzLmNvbnRleHRNZW51LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMDonLCBlcnJvcik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBoYW5kbGVDbGVhckFsbENoYXRzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY29uZmlybWVkID0gY29uZmlybSgnXHUwNDEyXHUwNDRCIFx1MDQ0M1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQ0QiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQ0NVx1MDQzRVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQ0Qj8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0NENcdTA0MzdcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDQyXHUwNDRDLicpO1xyXG5cclxuXHRcdFx0aWYgKCFjb25maXJtZWQpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9hcGkvZ3JhcGhzYCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ0RFTEVURSdcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBIVFRQIFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCEgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQxOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzJcclxuXHRcdFx0dGhpcy5ncmFwaHMgPSBbXTtcclxuXHRcdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHRcdHRoaXMucmVuZGVyR3JhcGhzKCk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MjNcdTA0MzJcdTA0MzVcdTA0MzRcdTA0M0VcdTA0M0NcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDMxIFx1MDQzRVx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzQVx1MDQzNVxyXG5cdFx0XHR0aGlzLnByb3BzLmV2ZW50QnVzLmVtaXQoJ2FsbC1jaGF0cy1jbGVhcmVkJyk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNBXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQzNVx1MDQ0NSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0M0VcdTA0MzI6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgaGFuZGxlRGVsZXRlR3JhcGgoZ3JhcGhJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjUwMDAvYXBpL2dyYXBocy8ke2dyYXBoSWR9YCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ0RFTEVURSdcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBIVFRQIFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCEgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDQzXHUwNDQxOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzJcclxuXHRcdFx0dGhpcy5ncmFwaHMgPSB0aGlzLmdyYXBocy5maWx0ZXIoKGdyYXBoKSA9PiBncmFwaC5pZCAhPT0gZ3JhcGhJZCk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUFcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0MyBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFXHJcblx0XHRcdGNvbnN0IHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5ncmFwaHMubGVuZ3RoIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xyXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50UGFnZSA+IHRvdGFsUGFnZXMgJiYgdG90YWxQYWdlcyA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gdG90YWxQYWdlcztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJHcmFwaHMoKTtcclxuXHRcdFx0dGhpcy5jb250ZXh0TWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzA6JywgZXJyb3IpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlR3JhcGhzKG5ld0dyYXBoczogYW55W10pOiB2b2lkIHtcclxuXHRcdHRoaXMuZ3JhcGhzID0gbmV3R3JhcGhzO1xyXG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcblx0XHR0aGlzLnJlbmRlckdyYXBocygpO1xyXG5cdH1cclxuXHJcblx0ZGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQyRFx1MDQ0Mlx1MDQzRVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFJlYWN0IFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0MiBHcmFwaFBhbmVsQ29tcG9uZW50LCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzBcdTA0MzdcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOFxyXG4gKiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDMyLiBcdTA0MUVcdTA0M0QgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzQlx1MDQzOFx1MDQzRVx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MyBSZWFjdCBGbG93IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcbiAqIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzggXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDM1XHUwNDQwLCBcdTA0MzAgXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1IFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzQlx1MDQzOFx1MDQzRVx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MyBEYWdyZSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG4gKiBcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQ0QiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzVcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlYWN0ICYgUmVhY3QgRmxvdyBJbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnOyAvLyA8LS0gXHUwNDE4XHUwNDIxXHUwNDFGXHUwNDIwXHUwNDEwXHUwNDEyXHUwNDFCXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MzRcdTA0M0JcdTA0NEYgY3JlYXRlUm9vdCBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0QgJ3JlYWN0LWRvbS9jbGllbnQnXHJcbmltcG9ydCBSZWFjdEZsb3csIHtcclxuXHRhZGRFZGdlLFxyXG5cdHVzZU5vZGVzU3RhdGUsXHJcblx0dXNlRWRnZXNTdGF0ZSxcclxuXHRCYWNrZ3JvdW5kLFxyXG5cdENvbnRyb2xzLFxyXG5cdFJlYWN0Rmxvd1Byb3ZpZGVyLFxyXG5cdENvbm5lY3Rpb24sXHJcblx0RWRnZSxcclxuXHRCYWNrZ3JvdW5kVmFyaWFudFxyXG59IGZyb20gJ3JlYWN0Zmxvdyc7XHJcbmltcG9ydCB7IEFwcCwgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSAnc3JjL3V0aWxzL0RpYWxvZyc7XHJcblxyXG4vLyA8LS0gXHUwNDE4XHUwNDIxXHUwNDFGXHUwNDIwXHUwNDEwXHUwNDEyXHUwNDFCXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQzQ1x1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mi4gXHUwNDIzXHUwNDMxXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDQxXHUwNDRDLCBcdTA0NDdcdTA0NDJcdTA0M0UgZXNidWlsZCBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0QgXHUwNDNEXHUwNDMwIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQ0MyBDU1MgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDMyLlxyXG4vLyBcdTA0MUVcdTA0MzFcdTA0NEJcdTA0NDdcdTA0M0RcdTA0M0UsIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzggZXNidWlsZCBcdTA0MzRcdTA0M0JcdTA0NEYgUmVhY3QtXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDNFXHUwNDMyLCBcdTA0MzJcdTA0NEIgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDM1IENTUyBcdTA0M0ZcdTA0NDBcdTA0NEZcdTA0M0NcdTA0M0UgXHUwNDMyIEpTL1RTIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQi5cclxuLy8gZXNidWlsZCBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0MzVcdTA0M0QgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzRCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFIENTUy5cclxuLy8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDRFXHUwNDQyXHUwNDQxXHUwNDRGLCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NENcdTA0NDJcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQ0XHUwNDM4XHUwNDMzXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRFIGVzYnVpbGQgKFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgXHUwNDQ3XHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM3IFx1MDQzRlx1MDQzQlx1MDQzMFx1MDQzM1x1MDQzOFx1MDQzRCBlc2J1aWxkLXBsdWdpbi1jc3MtYnVuZGxlKS5cclxuaW1wb3J0ICdyZWFjdGZsb3cvZGlzdC9zdHlsZS5jc3MnOyAvLyBcdTA0MThcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNCXHUwNDM4IFJlYWN0Rmxvd1xyXG5cclxuLy8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQ0QiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDNBXHUwNDM4XHUwNDM1LVx1MDQzQlx1MDQzOFx1MDQzMVx1MDQzRSBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNEXHUwNDNFXHUwNDM0XHUwNDRCLCBcdTA0MzhcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDM4XHUwNDQ1IFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQ0MVx1MDQ0Q1xyXG4vLyBpbXBvcnQgQ3VzdG9tTm9kZSBmcm9tICcuL0N1c3RvbU5vZGUnO1xyXG4vLyBjb25zdCBub2RlVHlwZXMgPSB7IGN1c3RvbTogQ3VzdG9tTm9kZSB9O1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ3VzdG9tIE5vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5pbXBvcnQgeyBIYW5kbGUsIFBvc2l0aW9uIH0gZnJvbSAncmVhY3RmbG93JztcclxuXHJcbi8qKlxyXG4gKiBcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDEsIFx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NDMgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1LCBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0NcdTA0NEJcdTA0NDUgXHUwNDMyIEJhc2VOb2RlV3JhcHBlci5cclxuICovXHJcbmludGVyZmFjZSBCYXNlTm9kZVdyYXBwZXJEYXRhIHtcclxuXHRsYWJlbDogc3RyaW5nO1xyXG5cdHRpdGxlPzogc3RyaW5nO1xyXG5cdHRpdGxlX2dlbmVyYXRlZD86IGJvb2xlYW47XHJcblx0aXNTZWxlY3RlZDogYm9vbGVhbjtcclxuXHRub2RlSWQ6IHN0cmluZztcclxuXHRncmFwaElkOiBzdHJpbmc7XHJcblx0b25Ob2RlRGVsZXRlOiAobm9kZUlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XHJcblx0aXNBY3RpdmU6IGJvb2xlYW47XHJcblx0YXBwOiBBcHA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDEsIFx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0MzJcdTA0M0VcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwIEJhc2VOb2RlV3JhcHBlci5cclxuICovXHJcbmludGVyZmFjZSBCYXNlTm9kZVdyYXBwZXJQcm9wcyB7XHJcblx0ZGF0YTogQmFzZU5vZGVXcmFwcGVyRGF0YTtcclxuXHRpc0Nvbm5lY3RhYmxlOiBib29sZWFuO1xyXG5cdC8vIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7IC8vIFx1MDQyMVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSwgXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDQ3XHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0MzAgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIChcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsIFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzMClcclxufVxyXG5cclxuLyoqXHJcbiAqIEJhc2VOb2RlV3JhcHBlciAtIFx1MDQxRVx1MDQzMVx1MDQ0OVx1MDQzMFx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NTFcdTA0NDBcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQ0MVx1MDQzNVx1MDQ0NSBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyLFxyXG4gKiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0NEVcdTA0NDlcdTA0MzBcdTA0NEYgXHUwNDQ1XHUwNDREXHUwNDNEXHUwNDM0XHUwNDNCXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0M0VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDM4IFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcbiAqIEBwYXJhbSB7QmFzZU5vZGVXcmFwcGVyUHJvcHN9IHByb3BzIC0gXHUwNDIxXHUwNDMyXHUwNDNFXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMC5cclxuICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFJlYWN0LlxyXG4gKi9cclxuY29uc3QgQmFzZU5vZGVXcmFwcGVyOiBSZWFjdC5GQzxCYXNlTm9kZVdyYXBwZXJQcm9wcz4gPSAoeyBkYXRhLCBpc0Nvbm5lY3RhYmxlLCBjaGlsZHJlbiB9KSA9PiB7XHJcblx0Y29uc3QgZGVsZXRlSWNvblJlZiA9IFJlYWN0LnVzZVJlZjxIVE1MU3BhbkVsZW1lbnQ+KG51bGwpO1xyXG5cdGNvbnN0IHJlZ2VuZXJhdGVJY29uUmVmID0gUmVhY3QudXNlUmVmPEhUTUxTcGFuRWxlbWVudD4obnVsbCk7XHJcblxyXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XHJcblx0XHRpZiAoZGVsZXRlSWNvblJlZi5jdXJyZW50KSB7XHJcblx0XHRcdHNldEljb24oZGVsZXRlSWNvblJlZi5jdXJyZW50LCAndHJhc2gtMicpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHJlZ2VuZXJhdGVJY29uUmVmLmN1cnJlbnQpIHtcclxuXHRcdFx0c2V0SWNvbihyZWdlbmVyYXRlSWNvblJlZi5jdXJyZW50LCAncmVmcmVzaC1jdycpO1xyXG5cdFx0fVxyXG5cdH0sIFtdKTtcclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnQgSGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcblx0ICogQHBhcmFtIHtSZWFjdC5Nb3VzZUV2ZW50fSBldmVudCAtIFx1MDQyMVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzAuXHJcblx0ICovXHJcblx0Y29uc3QgaGFuZGxlTm9kZURlbGV0ZSA9IGFzeW5jIChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgb25Ob2RlQ2xpY2sgXHUwNDNEXHUwNDMwIFx1MDQ0MFx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzVcclxuXHJcblx0XHRjb25zdCBjb25maXJtZWQgPSBhd2FpdCBEaWFsb2cuY29uZmlybShkYXRhLmFwcCwgJ1x1MDQxMlx1MDQ0QiBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NEIsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQ0MiBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0I/Jyk7XHJcblx0XHRpZiAoY29uZmlybWVkKSB7XHJcblx0XHRcdGF3YWl0IGRhdGEub25Ob2RlRGVsZXRlKGRhdGEubm9kZUlkKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRjb25zdCBoYW5kbGVSZWdlbmVyYXRlID0gYXN5bmMgKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdC8vIFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBFdmVudEJ1cyBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0Ugd29ya3NwYWNlLnRyaWdnZXJcclxuXHRcdGNvbnN0IGV2ZW50QnVzID0gKGRhdGEuYXBwIGFzIGFueSkucGx1Z2lucz8ucGx1Z2lucz8uWydsbG0tYWdlbnQtcGx1Z2luJ10/LmV2ZW50QnVzO1xyXG5cdFx0aWYgKGV2ZW50QnVzKSB7XHJcblx0XHRcdGV2ZW50QnVzLmVtaXQoJ3JlZ2VuZXJhdGUtbWVzc2FnZScsIHtcclxuXHRcdFx0XHRncmFwaElkOiBkYXRhLmdyYXBoSWQsXHJcblx0XHRcdFx0bm9kZUlkOiBkYXRhLm5vZGVJZCxcclxuXHRcdFx0XHRtb2RlbDogKGRhdGEuYXBwIGFzIGFueSkucGx1Z2lucz8ucGx1Z2lucz8uWydsbG0tYWdlbnQtcGx1Z2luJ10/LnNldHRpbmdzPy5kZWZhdWx0TW9kZWwgfHwgJ2dlbWluaS0yLjUtZmxhc2gnIC8vIFx1MDQxRFx1MDQxRVx1MDQxMlx1MDQxRVx1MDQxNTogXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Q1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9O1xyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdFJlYWN0LkZyYWdtZW50LFxyXG5cdFx0bnVsbCxcclxuXHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCB7XHJcblx0XHRcdHR5cGU6ICdzb3VyY2UnLFxyXG5cdFx0XHRwb3NpdGlvbjogUG9zaXRpb24uQm90dG9tLFxyXG5cdFx0XHRpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlXHJcblx0XHR9KSxcclxuXHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlLCB7XHJcblx0XHRcdHR5cGU6ICd0YXJnZXQnLFxyXG5cdFx0XHRwb3NpdGlvbjogUG9zaXRpb24uVG9wLFxyXG5cdFx0XHRpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlXHJcblx0XHR9KSxcclxuXHRcdGNoaWxkcmVuLCAvLyBcdTA0MTdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NEMgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQ0Q1x1MDQ0MVx1MDQ0RiBcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0NDRcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFxyXG5cdFx0UmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdFx0J2RpdicsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjbGFzc05hbWU6ICdub2RlLXRvb2xiYXInIC8vIFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0NDFcdTA0NDEgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0Mlx1MDQ0M1x1MDQzQlx1MDQzMVx1MDQzMFx1MDQ0MFx1MDQzMFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0XHRcdCdidXR0b24nLFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdG9uQ2xpY2s6IGhhbmRsZU5vZGVEZWxldGUsXHJcblx0XHRcdFx0XHQnYXJpYS1sYWJlbCc6ICdcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCJyxcclxuXHRcdFx0XHRcdGNsYXNzTmFtZTogJ25vZGUtYWN0aW9uLWJ1dHRvbiBub2RlLWRlbGV0ZS1idXR0b24nIC8vIFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0NDFcdTA0NDFcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzOFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgcmVmOiBkZWxldGVJY29uUmVmIH0pIC8vIFx1MDQyRFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHQpLFxyXG5cdFx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0XHRcdCdidXR0b24nLFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdG9uQ2xpY2s6IGhhbmRsZVJlZ2VuZXJhdGUsXHJcblx0XHRcdFx0XHQnYXJpYS1sYWJlbCc6ICdcdTA0MjBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMnLFxyXG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnbm9kZS1hY3Rpb24tYnV0dG9uIG5vZGUtcmVnZW5lcmF0ZS1idXR0b24nIC8vIFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0NDFcdTA0NDFcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRFx1MDQzRVx1MDQzRlx1MDQzQVx1MDQzOFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0UmVhY3QuY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgcmVmOiByZWdlbmVyYXRlSWNvblJlZiB9KSAvLyBcdTA0MkRcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHRcdFx0KVxyXG5cdFx0KVxyXG5cdCk7XHJcbn07XHJcblxyXG4vLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgQ3VzdG9tTm9kZSwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzMlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0NDMgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcbi8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0MzAgJ3VzZXInXHJcbmNvbnN0IFVzZXJOb2RlOiBSZWFjdC5GQzxhbnk+ID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSB9KSA9PiB7XHJcblx0Y29uc3QgZGlzcGxheUxhYmVsID0gZGF0YS50aXRsZSB8fCBkYXRhLmxhYmVsIHx8ICdcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NEMnO1xyXG5cdC8vIC4uLiAodGl0bGVHZW5lcmF0ZWQgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDQ4XHUwNDM1IFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0QgXHUwNDMyIFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzUsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzNcdTA0MzApXHJcblxyXG5cdHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0QmFzZU5vZGVXcmFwcGVyLFxyXG5cdFx0eyBkYXRhOiBkYXRhLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0sXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCBudWxsLCBkaXNwbGF5TGFiZWwpXHJcblx0KTtcclxufTtcclxuXHJcbi8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDRCIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiAoTExNTm9kZSwgVG9vbE5vZGUsIEVycm9yTm9kZSkgXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDNCXHUwNDNFXHUwNDMzXHUwNDM4XHUwNDQ3XHUwNDNEXHUwNDNFXHJcbmNvbnN0IExMTU5vZGU6IFJlYWN0LkZDPGFueT4gPSAoeyBkYXRhLCBpc0Nvbm5lY3RhYmxlIH0pID0+IHtcclxuXHRjb25zdCBkaXNwbGF5TGFiZWwgPSBkYXRhLnRpdGxlIHx8IGRhdGEubGFiZWwgfHwgJ0xMTSc7XHJcblx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzNVx1MDQzQiBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDNBXHUwNDNFXHUwNDM5LCBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHRjb25zdCBub2RlQ2xhc3NOYW1lID0gZGF0YS5pc19wbGFjZWhvbGRlciA/ICdsbG0tbm9kZS1wbGFjZWhvbGRlcicgOiAnJztcclxuXHJcblx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHRCYXNlTm9kZVdyYXBwZXIsXHJcblx0XHR7IGRhdGE6IGRhdGEsIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUgfSxcclxuXHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiBub2RlQ2xhc3NOYW1lIH0sIGRpc3BsYXlMYWJlbClcclxuXHQpO1xyXG59O1xyXG5cclxuLy8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDM5IFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQzMCAndG9vbCdcclxuY29uc3QgVG9vbE5vZGU6IFJlYWN0LkZDPGFueT4gPSAoeyBkYXRhLCBpc0Nvbm5lY3RhYmxlIH0pID0+IHtcclxuXHRjb25zdCBkaXNwbGF5TGFiZWwgPSBkYXRhLnRpdGxlIHx8IGRhdGEubGFiZWwgfHwgJ1x1MDQxOFx1MDQzRFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mic7XHJcblx0Ly8gLi4uXHJcblxyXG5cdHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0QmFzZU5vZGVXcmFwcGVyLFxyXG5cdFx0eyBkYXRhOiBkYXRhLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0sXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCBudWxsLCBkaXNwbGF5TGFiZWwpXHJcblx0KTtcclxufTtcclxuXHJcbi8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0NDJcdTA0MzhcdTA0M0ZcdTA0MzAgJ2Vycm9yJ1xyXG5jb25zdCBFcnJvck5vZGU6IFJlYWN0LkZDPGFueT4gPSAoeyBkYXRhLCBpc0Nvbm5lY3RhYmxlIH0pID0+IHtcclxuXHRjb25zdCBkaXNwbGF5TGFiZWwgPSBkYXRhLnRpdGxlIHx8IGRhdGEubGFiZWwgfHwgJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCc7XHJcblx0Ly8gLi4uXHJcblxyXG5cdHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFxyXG5cdFx0QmFzZU5vZGVXcmFwcGVyLFxyXG5cdFx0eyBkYXRhOiBkYXRhLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0sXHJcblx0XHRSZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCBudWxsLCBkaXNwbGF5TGFiZWwpXHJcblx0KTtcclxufTtcclxuXHJcbi8vIFx1MDQyMFx1MDQzNVx1MDQzM1x1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDRCIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMlxyXG5jb25zdCBub2RlVHlwZXMgPSB7XHJcblx0dXNlcjogVXNlck5vZGUsXHJcblx0bGxtOiBMTE1Ob2RlLFxyXG5cdHRvb2w6IFRvb2xOb2RlLFxyXG5cdGVycm9yOiBFcnJvck5vZGVcclxuXHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQzIFx1MDQ0Mlx1MDQzNVx1MDQzMVx1MDQ0RiBcdTA0MzVcdTA0NDFcdTA0NDJcdTA0NEMgbm9kZS50eXBlID09PSAnZGVmYXVsdCcsIFx1MDQ0Mlx1MDQzRSBcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDhcdTA0NEMgXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzRVx1MDQzNlx1MDQzNSBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMsXHJcblx0Ly8gXHUwNDNCXHUwNDM4XHUwNDMxXHUwNDNFIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgJ2RlZmF1bHQnIFJlYWN0IEZsb3cuXHJcbn07XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEYWdyZSBMYXlvdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuaW1wb3J0IGRhZ3JlIGZyb20gJ2RhZ3JlJzsgLy8gXHUwNDE4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzMVx1MDQzOFx1MDQzMVx1MDQzQlx1MDQzOFx1MDQzRVx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MyBkYWdyZVxyXG5cclxuLy8gXHUwNDIyXHUwNDM4XHUwNDNGXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBEYWdyZSAoXHUwNDMxXHUwNDRCXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0M0RcdTA0NEIpXHJcbmludGVyZmFjZSBEYWdyZU5vZGUge1xyXG5cdHg6IG51bWJlcjtcclxuXHR5OiBudW1iZXI7XHJcblx0d2lkdGg6IG51bWJlcjtcclxuXHRoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuLy8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0QVx1MDQzNVx1MDQzQVx1MDQ0MiBEYWdyZSBHcmFwaFxyXG5jb25zdCBkYWdyZUdyYXBoID0gbmV3IGRhZ3JlLmdyYXBobGliLkdyYXBoKCkuc2V0RGVmYXVsdEVkZ2VMYWJlbCgoKSA9PiAoe30pKTtcclxuXHJcbi8vIFx1MDQxRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0NcdTA0MzVcdTA0NDBcdTA0NEIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG4vLyBcdTA0MUNcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzRVx1MDQ0MiBcdTA0NDBcdTA0MzVcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzIgQ1NTLlxyXG5jb25zdCBub2RlV2lkdGggPSAxMjA7XHJcbmNvbnN0IG5vZGVIZWlnaHQgPSA0MDtcclxuXHJcbi8qKlxyXG4gKiBcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDMwXHUwNDNCXHUwNDMzXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDNDIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBEYWdyZSBcdTA0M0EgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwXHUwNDNDIFx1MDQzOCBcdTA0NDBcdTA0NTFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0MgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLlxyXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IG5vZGVzIC0gXHUwNDFDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBSZWFjdCBGbG93LlxyXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGVkZ2VzIC0gXHUwNDFDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQ0MFx1MDQ1MVx1MDQzMVx1MDQzNVx1MDQ0MCBSZWFjdCBGbG93LlxyXG4gKiBAcGFyYW0geydUQicgfCAnTFInfSBbZGlyZWN0aW9uPSdUQiddIC0gXHUwNDFEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCAoJ1RCJyAtIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0MyBcdTA0MzJcdTA0M0RcdTA0MzhcdTA0MzcsICdMUicgLSBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzJcdTA0MzAgXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNFKS5cclxuICogQHJldHVybnMge3tub2RlczogYW55W10sIGVkZ2VzOiBhbnlbXX19IFx1MDQxRVx1MDQzMVx1MDQ0QVx1MDQzNVx1MDQzQVx1MDQ0MiBcdTA0NDEgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDUxXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDNDXHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM4LCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzBcdTA0NDlcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDM4LlxyXG4gKi9cclxuY29uc3QgZ2V0TGF5b3V0ZWRFbGVtZW50cyA9IChub2RlczogYW55W10sIGVkZ2VzOiBhbnlbXSwgZGlyZWN0aW9uOiAnVEInIHwgJ0xSJyA9ICdUQicpID0+IHtcclxuXHRjb25zdCBpc0hvcml6b250YWwgPSBkaXJlY3Rpb24gPT09ICdMUic7XHJcblx0Ly8gXHUwNDFBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiAyIFx1MDQ0MFx1MDQ0Rlx1MDQzNFx1MDQzMFxyXG5cdGRhZ3JlR3JhcGguc2V0R3JhcGgoe1xyXG5cdFx0cmFua2RpcjogZGlyZWN0aW9uLFxyXG5cdFx0cmFua3NlcDogNDAsIC8vIFx1MDQyM1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzMFx1MDQzQ1x1MDQzOCAoXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDMwXHUwNDNDXHUwNDM4KVxyXG5cdFx0bm9kZXNlcDogMTAsIC8vIFx1MDQyM1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NEZcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzIgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzNVxyXG5cdFx0ZWRnZXNlcDogMjAsIC8vIFx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM4XHJcblx0XHRtYXJnaW54OiAyMCwgLy8gXHUwNDFFXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDRCIFx1MDQzRlx1MDQzRSBYXHJcblx0XHRtYXJnaW55OiAyMCAvLyBcdTA0MUVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0NEIgXHUwNDNGXHUwNDNFIFlcclxuXHR9KTtcclxuXHJcblx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QiBcdTA0MzIgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IERhZ3JlIFx1MDQ0MSBcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzBcdTA0M0NcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM4XHJcblx0bm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG5cdFx0Ly8gXHUwNDFGXHUwNDRCXHUwNDQyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDQxXHUwNDRGIFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzMiBET00gXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDNFXHUwNDMyXHJcblx0XHRjb25zdCBub2RlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWlkPVwiJHtub2RlLmlkfVwiXWApIGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0Y29uc3QgZGltZW5zaW9ucyA9IGdldE5vZGVEaW1lbnNpb25zKG5vZGVFbGVtZW50KTtcclxuXHJcblx0XHRkYWdyZUdyYXBoLnNldE5vZGUobm9kZS5pZCwge1xyXG5cdFx0XHR3aWR0aDogTWF0aC5taW4oZGltZW5zaW9ucy53aWR0aCArIDEwLCAxNDApLCAvLyBcdTA0MUVcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQ0M1xyXG5cdFx0XHRoZWlnaHQ6IE1hdGgubWluKGRpbWVuc2lvbnMuaGVpZ2h0ICsgMTAsIDUwKSAvLyBcdTA0MUVcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQzMlx1MDQ0Qlx1MDQ0MVx1MDQzRVx1MDQ0Mlx1MDQ0M1xyXG5cdFx0fSk7XHJcblx0fSk7XHJcblxyXG5cdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDBcdTA0NTFcdTA0MzFcdTA0NDBcdTA0MzAgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBEYWdyZVxyXG5cdGVkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcclxuXHRcdC8vIERhZ3JlIFx1MDQzRVx1MDQzNlx1MDQzOFx1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBpZCwgc291cmNlLCB0YXJnZXRcclxuXHRcdGRhZ3JlR3JhcGguc2V0RWRnZShlZGdlLnNvdXJjZSwgZWRnZS50YXJnZXQpO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBcdTA0MTJcdTA0NEJcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDQ3XHUwNDUxXHUwNDQyIFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcclxuXHRkYWdyZS5sYXlvdXQoZGFncmVHcmFwaCk7XHJcblxyXG5cdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyIFJlYWN0IEZsb3cgXHUwNDNEXHUwNDMwIFx1MDQzRVx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzNSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDdcdTA0NTFcdTA0NDJcdTA0M0VcdTA0MzIgRGFncmVcclxuXHRjb25zdCBuZXdOb2RlcyA9IG5vZGVzLm1hcCgobm9kZSkgPT4ge1xyXG5cdFx0Y29uc3Qgbm9kZVdpdGhQb3NpdGlvbjogRGFncmVOb2RlID0gZGFncmVHcmFwaC5ub2RlKG5vZGUuaWQpO1xyXG5cdFx0Y29uc3Qgbm9kZURpbWVuc2lvbnMgPSBkYWdyZUdyYXBoLm5vZGUobm9kZS5pZCk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0Li4ubm9kZSxcclxuXHRcdFx0dGFyZ2V0UG9zaXRpb246IGlzSG9yaXpvbnRhbCA/ICdsZWZ0JyA6ICd0b3AnLFxyXG5cdFx0XHRzb3VyY2VQb3NpdGlvbjogaXNIb3Jpem9udGFsID8gJ3JpZ2h0JyA6ICdib3R0b20nLFxyXG5cdFx0XHRwb3NpdGlvbjoge1xyXG5cdFx0XHRcdHg6IG5vZGVXaXRoUG9zaXRpb24ueCAtIG5vZGVEaW1lbnNpb25zLndpZHRoIC8gMixcclxuXHRcdFx0XHR5OiBub2RlV2l0aFBvc2l0aW9uLnkgLSBub2RlRGltZW5zaW9ucy5oZWlnaHQgLyAyXHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSk7XHJcblxyXG5cdHJldHVybiB7IG5vZGVzOiBuZXdOb2RlcywgZWRnZXMgfTtcclxufTtcclxuXHJcbi8vIFx1MDQyNFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MFx1MDQzNVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0NcdTA0MzVcdTA0NDBcdTA0M0VcdTA0MzIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzOFx1MDQzNyBET01cclxuY29uc3QgZ2V0Tm9kZURpbWVuc2lvbnMgPSAobm9kZUVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSA9PiB7XHJcblx0aWYgKCFub2RlRWxlbWVudCkge1xyXG5cdFx0cmV0dXJuIHsgd2lkdGg6IDEyMCwgaGVpZ2h0OiA0MCB9OyAvLyBGYWxsYmFjayBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0NcdTA0MzVcdTA0NDBcdTA0NEJcclxuXHR9XHJcblxyXG5cdGNvbnN0IHJlY3QgPSBub2RlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRyZXR1cm4ge1xyXG5cdFx0d2lkdGg6IE1hdGgubWF4KE1hdGgubWluKHJlY3Qud2lkdGgsIDEzMCksIDEwMCksIC8vIFx1MDQxRVx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDM6IFx1MDQzQ1x1MDQzOFx1MDQzRCAxMDBweCwgXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDQxIDEzMHB4XHJcblx0XHRoZWlnaHQ6IE1hdGgubWF4KE1hdGgubWluKHJlY3QuaGVpZ2h0LCA0NSksIDMwKSAvLyBcdTA0MUVcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDQxXHUwNDNFXHUwNDQyXHUwNDQzOiBcdTA0M0NcdTA0MzhcdTA0M0QgMzBweCwgXHUwNDNDXHUwNDMwXHUwNDNBXHUwNDQxIDQ1cHhcclxuXHR9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdyYXBoUGFuZWxQcm9wc1xyXG4gKiBAcHJvcGVydHkge3sgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W107IH19IGdyYXBoRGF0YSAtIFx1MDQxNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiAoXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCIFx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDBcdTA0MzApLlxyXG4gKiBAcHJvcGVydHkgeyhub2RlSWQ6IHN0cmluZykgPT4gdm9pZH0gb25Ob2RlQ2xpY2sgLSBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NDMuXHJcbiAqIEBwcm9wZXJ0eSB7KG5vZGVJZDogc3RyaW5nLCBpc1NlbGVjdGVkOiBib29sZWFuKSA9PiB2b2lkfSBvbk5vZGVTZWxlY3Rpb25DaGFuZ2UgLSBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcbiAqIEBwcm9wZXJ0eSB7KG5vZGVJZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBvbk5vZGVEZWxldGUgLSBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMC5cclxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gc2VsZWN0ZWROb2RlSWRzIC0gXHUwNDFEXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQwIElEIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0M0VcdTA0MzIuXHJcbiAqL1xyXG5pbnRlcmZhY2UgR3JhcGhQYW5lbFByb3BzIHtcclxuXHRncmFwaERhdGE6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfTtcclxuXHRvbk5vZGVDbGljazogKG5vZGVJZDogc3RyaW5nKSA9PiB2b2lkO1xyXG5cdG9uTm9kZVNlbGVjdGlvbkNoYW5nZTogKG5vZGVJZDogc3RyaW5nLCBpc1NlbGVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xyXG5cdG9uTm9kZURlbGV0ZTogKG5vZGVJZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cdHNlbGVjdGVkTm9kZUlkczogU2V0PHN0cmluZz47XHJcblx0YWN0aXZlTm9kZUlkOiBzdHJpbmcgfCBudWxsOyBcclxuXHRhcHA6IEFwcDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdyYXBoUGFuZWxDb21wb25lbnQgLSBSZWFjdCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDM0XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDMyIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MgUmVhY3QgRmxvdyBcdTA0MzggRGFncmUuXHJcbiAqIEBwYXJhbSB7R3JhcGhQYW5lbFByb3BzfSBwcm9wcyAtIFx1MDQyMVx1MDQzMlx1MDQzRVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzMCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0VcdTA0M0RcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXHJcbiAqIEByZXR1cm5zIHtSZWFjdC5SZWFjdEVsZW1lbnR9IFx1MDQyRFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBSZWFjdC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBHcmFwaFBhbmVsQ29tcG9uZW50OiBSZWFjdC5GQzxHcmFwaFBhbmVsUHJvcHM+ID0gKHtcclxuXHRncmFwaERhdGEsXHJcblx0b25Ob2RlQ2xpY2ssXHJcblx0b25Ob2RlU2VsZWN0aW9uQ2hhbmdlLFxyXG5cdG9uTm9kZURlbGV0ZSxcclxuXHRzZWxlY3RlZE5vZGVJZHMsXHJcblx0YWN0aXZlTm9kZUlkLFxyXG5cdGFwcFxyXG59KSA9PiB7XHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVhY3QgSG9va3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0NDBcdTA0NTFcdTA0MzFcdTA0MzVcdTA0NDAgUmVhY3QgRmxvd1xyXG5cdGNvbnN0IFtub2Rlcywgc2V0Tm9kZXMsIG9uTm9kZXNDaGFuZ2VdID0gdXNlTm9kZXNTdGF0ZShbXSk7XHJcblx0Y29uc3QgW2VkZ2VzLCBzZXRFZGdlcywgb25FZGdlc0NoYW5nZV0gPSB1c2VFZGdlc1N0YXRlKFtdKTsgLy8gb25FZGdlc1N0YXRlIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzAgb25FZGdlc0NoYW5nZVxyXG5cclxuXHQvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgdXNlRWZmZWN0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgRGFncmUgbGF5b3V0IFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMFxyXG5cdFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XHJcblx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0M0JcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwXHJcblx0XHRpZiAoZ3JhcGhEYXRhLm5vZGVzLmxlbmd0aCA+IDAgfHwgZ3JhcGhEYXRhLmVkZ2VzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0FwcGx5aW5nIERhZ3JlIGxheW91dCB3aXRoIGRhdGE6JywgZ3JhcGhEYXRhKTtcclxuXHJcblx0XHRcdGNvbnN0IGluaXRpYWxOb2Rlc0ZvckxheW91dCA9IGdyYXBoRGF0YS5ub2Rlcy5tYXAoKG5vZGUpID0+ICh7XHJcblx0XHRcdFx0aWQ6IG5vZGUuaWQsXHJcblx0XHRcdFx0dHlwZTogbm9kZS50eXBlIHx8ICdkZWZhdWx0JyxcclxuXHRcdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0XHRsYWJlbDogbm9kZS5kYXRhPy5sYWJlbCB8fCBgTm9kZSAke25vZGUuaWR9YCxcclxuXHRcdFx0XHRcdHRpdGxlOiBub2RlLmRhdGE/LnRpdGxlLFxyXG5cdFx0XHRcdFx0dGl0bGVfZ2VuZXJhdGVkOiBub2RlLmRhdGE/LnRpdGxlX2dlbmVyYXRlZCB8fCBmYWxzZSxcclxuXHRcdFx0XHRcdG9uTm9kZURlbGV0ZTogb25Ob2RlRGVsZXRlLFxyXG5cdFx0XHRcdFx0aXNTZWxlY3RlZDogc2VsZWN0ZWROb2RlSWRzLmhhcyhub2RlLmlkKSxcclxuXHRcdFx0XHRcdGdyYXBoSWQ6IG5vZGUuZ3JhcGhfaWQgfHwgJ3Vua25vd24nLCAvLyBcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQ1MVx1MDQzQyBpZCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAgXHUwNDQxIFx1MDQ0RFx1MDQzRFx1MDQzNFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDREXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNFXHUwNDNDXHUwNDM4XHUwNDM4IFx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQzMCAtIFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0NDJcdTA0MzBcdTA0M0EsIFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzNSBcdTA0MzFcdTA0NEIgXHUwNDMxXHUwNDRCXHUwNDNCXHUwNDNFIFx1MDQ0N1x1MDQ0Mlx1MDQzRS1cdTA0NDJcdTA0M0UgXHUwNDQyXHUwNDM4XHUwNDNGXHUwNDNFIG5vZGUuZGF0YS5tZXNzYWdlLmdyYXBoX2lkXHJcblx0XHRcdFx0XHRub2RlSWQ6IG5vZGUuaWQsXHJcblx0XHRcdFx0XHRhcHA6IGFwcCxcclxuXHRcdFx0XHRcdGlzX3BsYWNlaG9sZGVyOiBub2RlLmRhdGE/LmlzX3BsYWNlaG9sZGVyIHx8IGZhbHNlLCAvLyBcdTA0MURcdTA0MUVcdTA0MTJcdTA0MUVcdTA0MTU6IFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NDNcdTA0NDEgcGxhY2Vob2xkZXJcclxuXHRcdFx0XHRcdGlzQWN0aXZlOiBub2RlLmlkID09PSBhY3RpdmVOb2RlSWRcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcclxuXHRcdFx0XHRjbGFzc05hbWU6IGAke3NlbGVjdGVkTm9kZUlkcy5oYXMobm9kZS5pZCkgPyAnc2VsZWN0ZWQtbm9kZScgOiAnJ30gJHtcclxuXHRcdFx0XHRcdG5vZGUuaWQgPT09IGFjdGl2ZU5vZGVJZCA/ICdhY3RpdmUtbm9kZScgOiAnJ1xyXG5cdFx0XHRcdH1gXHJcblx0XHRcdH0pKTtcclxuXHJcblx0XHRcdGNvbnN0IGluaXRpYWxFZGdlc0ZvckxheW91dCA9IGdyYXBoRGF0YS5lZGdlcy5tYXAoKGVkZ2UpID0+ICh7XHJcblx0XHRcdFx0aWQ6IGVkZ2UuaWQsXHJcblx0XHRcdFx0c291cmNlOiBlZGdlLnNvdXJjZSxcclxuXHRcdFx0XHR0YXJnZXQ6IGVkZ2UudGFyZ2V0LFxyXG5cdFx0XHRcdHR5cGU6IGVkZ2UudHlwZSB8fCAnZGVmYXVsdCdcclxuXHRcdFx0fSkpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDMwIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDMxXHUwNDM1XHUwNDM3IGxheW91dFxyXG5cdFx0XHRzZXROb2Rlcyhpbml0aWFsTm9kZXNGb3JMYXlvdXQpO1xyXG5cdFx0XHRzZXRFZGdlcyhpbml0aWFsRWRnZXNGb3JMYXlvdXQpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIGxheW91dCBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNBXHUwNDNFXHUwNDM5LCBcdTA0NDdcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NEIgRE9NIFx1MDQ0M1x1MDQ0MVx1MDQzRlx1MDQzNVx1MDQzQiBcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCXHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHsgbm9kZXM6IGxheW91dGVkTm9kZXMsIGVkZ2VzOiBsYXlvdXRlZEVkZ2VzIH0gPSBnZXRMYXlvdXRlZEVsZW1lbnRzKGluaXRpYWxOb2Rlc0ZvckxheW91dCwgaW5pdGlhbEVkZ2VzRm9yTGF5b3V0KTtcclxuXHRcdFx0XHRzZXROb2RlcyhsYXlvdXRlZE5vZGVzKTtcclxuXHRcdFx0XHRzZXRFZGdlcyhsYXlvdXRlZEVkZ2VzKTtcclxuXHRcdFx0fSwgMTAwKTsgLy8gXHUwNDE3XHUwNDMwXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDNBXHUwNDMwIDEwMG1zIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzNcdTA0MzAgRE9NXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRFx1MDQzNVx1MDQ0MiwgXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFxyXG5cdFx0XHRzZXROb2RlcyhbXSk7XHJcblx0XHRcdHNldEVkZ2VzKFtdKTtcclxuXHRcdH1cclxuXHR9LCBbZ3JhcGhEYXRhLm5vZGVzLCBncmFwaERhdGEuZWRnZXMsIG9uTm9kZURlbGV0ZSwgc2VsZWN0ZWROb2RlSWRzLCBhY3RpdmVOb2RlSWRdKTsgLy8gXHUwNDE3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4OiBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQ0NSBcdTA0MzggXHUwNDQwXHUwNDUxXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQ1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCwgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDMxXHUwNDREXHUwNDNBIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiwgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QlxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmVudCBIYW5kbGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCAoXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRSkuXHJcblx0ICogQHBhcmFtIHtDb25uZWN0aW9uIHwgRWRnZX0gcGFyYW1zIC0gXHUwNDFGXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDQwXHUwNDRCIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0Y29uc3Qgb25Db25uZWN0ID0gUmVhY3QudXNlQ2FsbGJhY2soKHBhcmFtczogQ29ubmVjdGlvbiB8IEVkZ2UpID0+IHNldEVkZ2VzKChlZHMpID0+IGFkZEVkZ2UocGFyYW1zLCBlZHMpKSwgW3NldEVkZ2VzXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0My5cclxuXHQgKiBAcGFyYW0ge1JlYWN0Lk1vdXNlRXZlbnR9IGV2ZW50IC0gXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQ0RiBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzAuXHJcblx0ICogQHBhcmFtIHthbnl9IG5vZGUgLSBcdTA0MTRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLCBcdTA0M0ZcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDQzIFx1MDQzMVx1MDQ0Qlx1MDQzQiBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0EuXHJcblx0ICovXHJcblx0Y29uc3Qgbm9kZUNsaWNrSGFuZGxlciA9IFJlYWN0LnVzZUNhbGxiYWNrKFxyXG5cdFx0KGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50LCBub2RlOiBhbnkpID0+IHtcclxuXHRcdFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzNlx1MDQzMFx1MDQ0MiBTaGlmdCwgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0XHRcdG9uTm9kZVNlbGVjdGlvbkNoYW5nZShub2RlLmlkLCAhc2VsZWN0ZWROb2RlSWRzLmhhcyhub2RlLmlkKSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1LCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQSBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDQzXHJcblx0XHRcdFx0b25Ob2RlQ2xpY2sobm9kZS5pZCk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRbb25Ob2RlQ2xpY2ssIG9uTm9kZVNlbGVjdGlvbkNoYW5nZSwgc2VsZWN0ZWROb2RlSWRzXVxyXG5cdCk7XHJcblxyXG5cdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM0XHUwNDNCXHUwNDRGIFJlYWN0RmxvdywgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDNFIFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcclxuXHRjb25zdCBvblBhbmVDbGljayA9IFJlYWN0LnVzZUNhbGxiYWNrKFxyXG5cdFx0KGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDMxXHUwNDRCXHUwNDNCIFx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0EgXHUwNDNGXHUwNDNFIFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDMgKFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDQzIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDBcdTA0NDMpXHJcblx0XHRcdGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0aWYgKCF0YXJnZXQuY2xvc2VzdCgnLnJlYWN0LWZsb3dfX25vZGUnKSAmJiAhdGFyZ2V0LmNsb3Nlc3QoJy5yZWFjdC1mbG93X19lZGdlJykpIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBIFx1MDQzMVx1MDQ0Qlx1MDQzQiBcdTA0M0RcdTA0MzUgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0MyBcdTA0MzggXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQzRSBcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDBcdTA0NDMsIFx1MDQ0MVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHRcdFx0XHRpZiAoc2VsZWN0ZWROb2RlSWRzLnNpemUgPiAwKSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTJcdTA0NEJcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDMxXHUwNDREXHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0M0VcdTA0NDFcdTA0MzAgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVxyXG5cdFx0XHRcdFx0c2VsZWN0ZWROb2RlSWRzLmZvckVhY2goKG5vZGVJZCkgPT4gb25Ob2RlU2VsZWN0aW9uQ2hhbmdlKG5vZGVJZCwgZmFsc2UpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRbc2VsZWN0ZWROb2RlSWRzLCBvbk5vZGVTZWxlY3Rpb25DaGFuZ2VdXHJcblx0KTtcclxuXHJcblx0Ly8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0MzJcdTA0MzhcdTA0MzBcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NEIgKEVzY2FwZSlcclxuXHRSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xyXG5cdFx0Y29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG5cdFx0XHRpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG5cdFx0XHRcdGlmIChzZWxlY3RlZE5vZGVJZHMuc2l6ZSA+IDApIHtcclxuXHRcdFx0XHRcdHNlbGVjdGVkTm9kZUlkcy5mb3JFYWNoKChub2RlSWQpID0+IG9uTm9kZVNlbGVjdGlvbkNoYW5nZShub2RlSWQsIGZhbHNlKSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xyXG5cdFx0cmV0dXJuICgpID0+IHtcclxuXHRcdFx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xyXG5cdFx0fTtcclxuXHR9LCBbc2VsZWN0ZWROb2RlSWRzLCBvbk5vZGVTZWxlY3Rpb25DaGFuZ2VdKTtcclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVuZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHQnZGl2JyxcclxuXHRcdHsgY2xhc3NOYW1lOiAnZ3JhcGgtcGFuZWwnLCBzdHlsZTogeyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJyB9IH0sXHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0M0VcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgUmVhY3RGbG93UHJvdmlkZXIgXHUwNDMyXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDMzIFJlYWN0RmxvdyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDMwIFx1MDQzQSBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0NDMgUmVhY3QgRmxvd1xyXG5cdFx0UmVhY3QuY3JlYXRlRWxlbWVudChcclxuXHRcdFx0UmVhY3RGbG93UHJvdmlkZXIsXHJcblx0XHRcdG51bGwsXHJcblx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcblx0XHRcdFx0UmVhY3RGbG93LFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdG5vZGVzLFxyXG5cdFx0XHRcdFx0ZWRnZXMsXHJcblx0XHRcdFx0XHRvbk5vZGVzQ2hhbmdlLCAvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMlxyXG5cdFx0XHRcdFx0b25FZGdlc0NoYW5nZSwgLy8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDBcdTA0NTFcdTA0MzFcdTA0MzVcdTA0NDBcclxuXHRcdFx0XHRcdG9uQ29ubmVjdCwgLy8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRcdFx0b25Ob2RlQ2xpY2s6IG5vZGVDbGlja0hhbmRsZXIsIC8vIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0M1xyXG5cdFx0XHRcdFx0b25QYW5lQ2xpY2s6IG9uUGFuZUNsaWNrLCAvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRSBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0MzhcclxuXHRcdFx0XHRcdGZpdFZpZXc6IHRydWUsIC8vIFx1MDQxMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOCBcdTA0NDZcdTA0MzVcdTA0M0RcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDM4IFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzNVxyXG5cdFx0XHRcdFx0YXR0cmlidXRpb25Qb3NpdGlvbjogJ2JvdHRvbS1yaWdodCcsIC8vIFx1MDQxRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzFcdTA0NDNcdTA0NDZcdTA0MzhcdTA0MzggUmVhY3QgRmxvd1xyXG5cdFx0XHRcdFx0bm9kZVR5cGVzLFxyXG5cdFx0XHRcdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzRlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0MFx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDQ4XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRcdFx0em9vbU9uU2Nyb2xsOiB0cnVlLFxyXG5cdFx0XHRcdFx0cGFuT25EcmFnOiB0cnVlLFxyXG5cdFx0XHRcdFx0bWluWm9vbTogMC4xLFxyXG5cdFx0XHRcdFx0bWF4Wm9vbTogMlxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0Ly8gXHUwNDFBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDRCIENvbnRyb2xzIFx1MDQzOCBCYWNrZ3JvdW5kIFx1MDQ0Rlx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQ0RVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0VcdTA0NDdcdTA0MzVcdTA0NDBcdTA0M0RcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFJlYWN0Rmxvd1xyXG5cdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbHMsIG51bGwpLFxyXG5cdFx0XHRcdFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFja2dyb3VuZCwgeyB2YXJpYW50OiBCYWNrZ3JvdW5kVmFyaWFudC5Eb3RzLCBnYXA6IDEyLCBzaXplOiAxIH0pXHJcblx0XHRcdClcclxuXHRcdClcclxuXHQpO1xyXG59O1xyXG4iLCAiaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZU1lbW8sIG1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2MgZnJvbSAnY2xhc3NjYXQnO1xuaW1wb3J0IHsgdXNlU3RvcmVXaXRoRXF1YWxpdHlGbiwgY3JlYXRlV2l0aEVxdWFsaXR5Rm4gfSBmcm9tICd6dXN0YW5kL3RyYWRpdGlvbmFsJztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICd6dXN0YW5kL3NoYWxsb3cnO1xuaW1wb3J0IHsgem9vbUlkZW50aXR5LCB6b29tIH0gZnJvbSAnZDMtem9vbSc7XG5pbXBvcnQgeyBzZWxlY3QsIHBvaW50ZXIgfSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHsgZHJhZyB9IGZyb20gJ2QzLWRyYWcnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcblxuY29uc3QgU3RvcmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dChudWxsKTtcbmNvbnN0IFByb3ZpZGVyJDEgPSBTdG9yZUNvbnRleHQuUHJvdmlkZXI7XG5cbmNvbnN0IGVycm9yTWVzc2FnZXMgPSB7XG4gICAgZXJyb3IwMDE6ICgpID0+ICdbUmVhY3QgRmxvd106IFNlZW1zIGxpa2UgeW91IGhhdmUgbm90IHVzZWQgenVzdGFuZCBwcm92aWRlciBhcyBhbiBhbmNlc3Rvci4gSGVscDogaHR0cHM6Ly9yZWFjdGZsb3cuZGV2L2Vycm9yIzAwMScsXG4gICAgZXJyb3IwMDI6ICgpID0+IFwiSXQgbG9va3MgbGlrZSB5b3UndmUgY3JlYXRlZCBhIG5ldyBub2RlVHlwZXMgb3IgZWRnZVR5cGVzIG9iamVjdC4gSWYgdGhpcyB3YXNuJ3Qgb24gcHVycG9zZSBwbGVhc2UgZGVmaW5lIHRoZSBub2RlVHlwZXMvZWRnZVR5cGVzIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCBvciBtZW1vaXplIHRoZW0uXCIsXG4gICAgZXJyb3IwMDM6IChub2RlVHlwZSkgPT4gYE5vZGUgdHlwZSBcIiR7bm9kZVR5cGV9XCIgbm90IGZvdW5kLiBVc2luZyBmYWxsYmFjayB0eXBlIFwiZGVmYXVsdFwiLmAsXG4gICAgZXJyb3IwMDQ6ICgpID0+ICdUaGUgUmVhY3QgRmxvdyBwYXJlbnQgY29udGFpbmVyIG5lZWRzIGEgd2lkdGggYW5kIGEgaGVpZ2h0IHRvIHJlbmRlciB0aGUgZ3JhcGguJyxcbiAgICBlcnJvcjAwNTogKCkgPT4gJ09ubHkgY2hpbGQgbm9kZXMgY2FuIHVzZSBhIHBhcmVudCBleHRlbnQuJyxcbiAgICBlcnJvcjAwNjogKCkgPT4gXCJDYW4ndCBjcmVhdGUgZWRnZS4gQW4gZWRnZSBuZWVkcyBhIHNvdXJjZSBhbmQgYSB0YXJnZXQuXCIsXG4gICAgZXJyb3IwMDc6IChpZCkgPT4gYFRoZSBvbGQgZWRnZSB3aXRoIGlkPSR7aWR9IGRvZXMgbm90IGV4aXN0LmAsXG4gICAgZXJyb3IwMDk6ICh0eXBlKSA9PiBgTWFya2VyIHR5cGUgXCIke3R5cGV9XCIgZG9lc24ndCBleGlzdC5gLFxuICAgIGVycm9yMDA4OiAoc291cmNlSGFuZGxlLCBlZGdlKSA9PiBgQ291bGRuJ3QgY3JlYXRlIGVkZ2UgZm9yICR7IXNvdXJjZUhhbmRsZSA/ICdzb3VyY2UnIDogJ3RhcmdldCd9IGhhbmRsZSBpZDogXCIkeyFzb3VyY2VIYW5kbGUgPyBlZGdlLnNvdXJjZUhhbmRsZSA6IGVkZ2UudGFyZ2V0SGFuZGxlfVwiLCBlZGdlIGlkOiAke2VkZ2UuaWR9LmAsXG4gICAgZXJyb3IwMTA6ICgpID0+ICdIYW5kbGU6IE5vIG5vZGUgaWQgZm91bmQuIE1ha2Ugc3VyZSB0byBvbmx5IHVzZSBhIEhhbmRsZSBpbnNpZGUgYSBjdXN0b20gTm9kZS4nLFxuICAgIGVycm9yMDExOiAoZWRnZVR5cGUpID0+IGBFZGdlIHR5cGUgXCIke2VkZ2VUeXBlfVwiIG5vdCBmb3VuZC4gVXNpbmcgZmFsbGJhY2sgdHlwZSBcImRlZmF1bHRcIi5gLFxuICAgIGVycm9yMDEyOiAoaWQpID0+IGBOb2RlIHdpdGggaWQgXCIke2lkfVwiIGRvZXMgbm90IGV4aXN0LCBpdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgbm9kZSBpcyBkZWxldGVkIGJlZm9yZSB0aGUgXCJvbk5vZGVDbGlja1wiIGhhbmRsZXIgaXMgY2FsbGVkLmAsXG59O1xuXG5jb25zdCB6dXN0YW5kRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlc1snZXJyb3IwMDEnXSgpO1xuZnVuY3Rpb24gdXNlU3RvcmUoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZUNvbnRleHQoU3RvcmVDb250ZXh0KTtcbiAgICBpZiAoc3RvcmUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHp1c3RhbmRFcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlU3RvcmVXaXRoRXF1YWxpdHlGbihzdG9yZSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xufVxuY29uc3QgdXNlU3RvcmVBcGkgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VDb250ZXh0KFN0b3JlQ29udGV4dCk7XG4gICAgaWYgKHN0b3JlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih6dXN0YW5kRXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBzZXRTdGF0ZTogc3RvcmUuc2V0U3RhdGUsXG4gICAgICAgIHN1YnNjcmliZTogc3RvcmUuc3Vic2NyaWJlLFxuICAgICAgICBkZXN0cm95OiBzdG9yZS5kZXN0cm95LFxuICAgIH0pLCBbc3RvcmVdKTtcbn07XG5cbmNvbnN0IHNlbGVjdG9yJGcgPSAocykgPT4gKHMudXNlclNlbGVjdGlvbkFjdGl2ZSA/ICdub25lJyA6ICdhbGwnKTtcbmZ1bmN0aW9uIFBhbmVsKHsgcG9zaXRpb24sIGNoaWxkcmVuLCBjbGFzc05hbWUsIHN0eWxlLCAuLi5yZXN0IH0pIHtcbiAgICBjb25zdCBwb2ludGVyRXZlbnRzID0gdXNlU3RvcmUoc2VsZWN0b3IkZyk7XG4gICAgY29uc3QgcG9zaXRpb25DbGFzc2VzID0gYCR7cG9zaXRpb259YC5zcGxpdCgnLScpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2MoWydyZWFjdC1mbG93X19wYW5lbCcsIGNsYXNzTmFtZSwgLi4ucG9zaXRpb25DbGFzc2VzXSksIHN0eWxlOiB7IC4uLnN0eWxlLCBwb2ludGVyRXZlbnRzIH0sIC4uLnJlc3QgfSwgY2hpbGRyZW4pKTtcbn1cblxuZnVuY3Rpb24gQXR0cmlidXRpb24oeyBwcm9PcHRpb25zLCBwb3NpdGlvbiA9ICdib3R0b20tcmlnaHQnIH0pIHtcbiAgICBpZiAocHJvT3B0aW9ucz8uaGlkZUF0dHJpYnV0aW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGFuZWwsIHsgcG9zaXRpb246IHBvc2l0aW9uLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fYXR0cmlidXRpb25cIiwgXCJkYXRhLW1lc3NhZ2VcIjogXCJQbGVhc2Ugb25seSBoaWRlIHRoaXMgYXR0cmlidXRpb24gd2hlbiB5b3UgYXJlIHN1YnNjcmliZWQgdG8gUmVhY3QgRmxvdyBQcm86IGh0dHBzOi8vcmVhY3RmbG93LmRldi9wcm9cIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7IGhyZWY6IFwiaHR0cHM6Ly9yZWFjdGZsb3cuZGV2XCIsIHRhcmdldDogXCJfYmxhbmtcIiwgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiwgXCJhcmlhLWxhYmVsXCI6IFwiUmVhY3QgRmxvdyBhdHRyaWJ1dGlvblwiIH0sIFwiUmVhY3QgRmxvd1wiKSkpO1xufVxuXG5jb25zdCBFZGdlVGV4dCA9ICh7IHgsIHksIGxhYmVsLCBsYWJlbFN0eWxlID0ge30sIGxhYmVsU2hvd0JnID0gdHJ1ZSwgbGFiZWxCZ1N0eWxlID0ge30sIGxhYmVsQmdQYWRkaW5nID0gWzIsIDRdLCBsYWJlbEJnQm9yZGVyUmFkaXVzID0gMiwgY2hpbGRyZW4sIGNsYXNzTmFtZSwgLi4ucmVzdCB9KSA9PiB7XG4gICAgY29uc3QgZWRnZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBbZWRnZVRleHRCYm94LCBzZXRFZGdlVGV4dEJib3hdID0gdXNlU3RhdGUoeyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgIGNvbnN0IGVkZ2VUZXh0Q2xhc3NlcyA9IGNjKFsncmVhY3QtZmxvd19fZWRnZS10ZXh0d3JhcHBlcicsIGNsYXNzTmFtZV0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChlZGdlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRCYm94ID0gZWRnZVJlZi5jdXJyZW50LmdldEJCb3goKTtcbiAgICAgICAgICAgIHNldEVkZ2VUZXh0QmJveCh7XG4gICAgICAgICAgICAgICAgeDogdGV4dEJib3gueCxcbiAgICAgICAgICAgICAgICB5OiB0ZXh0QmJveC55LFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0ZXh0QmJveC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRleHRCYm94LmhlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwgW2xhYmVsXSk7XG4gICAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWxhYmVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7eCAtIGVkZ2VUZXh0QmJveC53aWR0aCAvIDJ9ICR7eSAtIGVkZ2VUZXh0QmJveC5oZWlnaHQgLyAyfSlgLCBjbGFzc05hbWU6IGVkZ2VUZXh0Q2xhc3NlcywgdmlzaWJpbGl0eTogZWRnZVRleHRCYm94LndpZHRoID8gJ3Zpc2libGUnIDogJ2hpZGRlbicsIC4uLnJlc3QgfSxcbiAgICAgICAgbGFiZWxTaG93QmcgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHsgd2lkdGg6IGVkZ2VUZXh0QmJveC53aWR0aCArIDIgKiBsYWJlbEJnUGFkZGluZ1swXSwgeDogLWxhYmVsQmdQYWRkaW5nWzBdLCB5OiAtbGFiZWxCZ1BhZGRpbmdbMV0sIGhlaWdodDogZWRnZVRleHRCYm94LmhlaWdodCArIDIgKiBsYWJlbEJnUGFkZGluZ1sxXSwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2VkZ2UtdGV4dGJnXCIsIHN0eWxlOiBsYWJlbEJnU3R5bGUsIHJ4OiBsYWJlbEJnQm9yZGVyUmFkaXVzLCByeTogbGFiZWxCZ0JvcmRlclJhZGl1cyB9KSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2VkZ2UtdGV4dFwiLCB5OiBlZGdlVGV4dEJib3guaGVpZ2h0IC8gMiwgZHk6IFwiMC4zZW1cIiwgcmVmOiBlZGdlUmVmLCBzdHlsZTogbGFiZWxTdHlsZSB9LCBsYWJlbCksXG4gICAgICAgIGNoaWxkcmVuKSk7XG59O1xudmFyIEVkZ2VUZXh0JDEgPSBtZW1vKEVkZ2VUZXh0KTtcblxuY29uc3QgZ2V0RGltZW5zaW9ucyA9IChub2RlKSA9PiAoe1xuICAgIHdpZHRoOiBub2RlLm9mZnNldFdpZHRoLFxuICAgIGhlaWdodDogbm9kZS5vZmZzZXRIZWlnaHQsXG59KTtcbmNvbnN0IGNsYW1wID0gKHZhbCwgbWluID0gMCwgbWF4ID0gMSkgPT4gTWF0aC5taW4oTWF0aC5tYXgodmFsLCBtaW4pLCBtYXgpO1xuY29uc3QgY2xhbXBQb3NpdGlvbiA9IChwb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9LCBleHRlbnQpID0+ICh7XG4gICAgeDogY2xhbXAocG9zaXRpb24ueCwgZXh0ZW50WzBdWzBdLCBleHRlbnRbMV1bMF0pLFxuICAgIHk6IGNsYW1wKHBvc2l0aW9uLnksIGV4dGVudFswXVsxXSwgZXh0ZW50WzFdWzFdKSxcbn0pO1xuLy8gcmV0dXJucyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgdGhhdCByZXByZXNlbnRzIHRoZSB2ZWxvY2l0eSBvZiB0aGUgbW92ZW1lbnRcbi8vIHdoZW4gdGhlIG1vdXNlIGlzIGNsb3NlIHRvIHRoZSBlZGdlIG9mIHRoZSBjYW52YXNcbmNvbnN0IGNhbGNBdXRvUGFuVmVsb2NpdHkgPSAodmFsdWUsIG1pbiwgbWF4KSA9PiB7XG4gICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgIHJldHVybiBjbGFtcChNYXRoLmFicyh2YWx1ZSAtIG1pbiksIDEsIDUwKSAvIDUwO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICByZXR1cm4gLWNsYW1wKE1hdGguYWJzKHZhbHVlIC0gbWF4KSwgMSwgNTApIC8gNTA7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcbmNvbnN0IGNhbGNBdXRvUGFuID0gKHBvcywgYm91bmRzKSA9PiB7XG4gICAgY29uc3QgeE1vdmVtZW50ID0gY2FsY0F1dG9QYW5WZWxvY2l0eShwb3MueCwgMzUsIGJvdW5kcy53aWR0aCAtIDM1KSAqIDIwO1xuICAgIGNvbnN0IHlNb3ZlbWVudCA9IGNhbGNBdXRvUGFuVmVsb2NpdHkocG9zLnksIDM1LCBib3VuZHMuaGVpZ2h0IC0gMzUpICogMjA7XG4gICAgcmV0dXJuIFt4TW92ZW1lbnQsIHlNb3ZlbWVudF07XG59O1xuY29uc3QgZ2V0SG9zdEZvckVsZW1lbnQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC5nZXRSb290Tm9kZT8uKCkgfHwgd2luZG93Py5kb2N1bWVudDtcbmNvbnN0IGdldEJvdW5kc09mQm94ZXMgPSAoYm94MSwgYm94MikgPT4gKHtcbiAgICB4OiBNYXRoLm1pbihib3gxLngsIGJveDIueCksXG4gICAgeTogTWF0aC5taW4oYm94MS55LCBib3gyLnkpLFxuICAgIHgyOiBNYXRoLm1heChib3gxLngyLCBib3gyLngyKSxcbiAgICB5MjogTWF0aC5tYXgoYm94MS55MiwgYm94Mi55MiksXG59KTtcbmNvbnN0IHJlY3RUb0JveCA9ICh7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSkgPT4gKHtcbiAgICB4LFxuICAgIHksXG4gICAgeDI6IHggKyB3aWR0aCxcbiAgICB5MjogeSArIGhlaWdodCxcbn0pO1xuY29uc3QgYm94VG9SZWN0ID0gKHsgeCwgeSwgeDIsIHkyIH0pID0+ICh7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoOiB4MiAtIHgsXG4gICAgaGVpZ2h0OiB5MiAtIHksXG59KTtcbmNvbnN0IG5vZGVUb1JlY3QgPSAobm9kZSkgPT4gKHtcbiAgICAuLi4obm9kZS5wb3NpdGlvbkFic29sdXRlIHx8IHsgeDogMCwgeTogMCB9KSxcbiAgICB3aWR0aDogbm9kZS53aWR0aCB8fCAwLFxuICAgIGhlaWdodDogbm9kZS5oZWlnaHQgfHwgMCxcbn0pO1xuY29uc3QgZ2V0Qm91bmRzT2ZSZWN0cyA9IChyZWN0MSwgcmVjdDIpID0+IGJveFRvUmVjdChnZXRCb3VuZHNPZkJveGVzKHJlY3RUb0JveChyZWN0MSksIHJlY3RUb0JveChyZWN0MikpKTtcbmNvbnN0IGdldE92ZXJsYXBwaW5nQXJlYSA9IChyZWN0QSwgcmVjdEIpID0+IHtcbiAgICBjb25zdCB4T3ZlcmxhcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3RBLnggKyByZWN0QS53aWR0aCwgcmVjdEIueCArIHJlY3RCLndpZHRoKSAtIE1hdGgubWF4KHJlY3RBLngsIHJlY3RCLngpKTtcbiAgICBjb25zdCB5T3ZlcmxhcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3RBLnkgKyByZWN0QS5oZWlnaHQsIHJlY3RCLnkgKyByZWN0Qi5oZWlnaHQpIC0gTWF0aC5tYXgocmVjdEEueSwgcmVjdEIueSkpO1xuICAgIHJldHVybiBNYXRoLmNlaWwoeE92ZXJsYXAgKiB5T3ZlcmxhcCk7XG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGlzUmVjdE9iamVjdCA9IChvYmopID0+IGlzTnVtZXJpYyhvYmoud2lkdGgpICYmIGlzTnVtZXJpYyhvYmouaGVpZ2h0KSAmJiBpc051bWVyaWMob2JqLngpICYmIGlzTnVtZXJpYyhvYmoueSk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuY29uc3QgaXNOdW1lcmljID0gKG4pID0+ICFpc05hTihuKSAmJiBpc0Zpbml0ZShuKTtcbmNvbnN0IGludGVybmFsc1N5bWJvbCA9IFN5bWJvbC5mb3IoJ2ludGVybmFscycpO1xuLy8gdXNlZCBmb3IgYTExeSBrZXkgYm9hcmQgY29udHJvbHMgZm9yIG5vZGVzIGFuZCBlZGdlc1xuY29uc3QgZWxlbWVudFNlbGVjdGlvbktleXMgPSBbJ0VudGVyJywgJyAnLCAnRXNjYXBlJ107XG5jb25zdCBkZXZXYXJuID0gKGlkLCBtZXNzYWdlKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1JlYWN0IEZsb3ddOiAke21lc3NhZ2V9IEhlbHA6IGh0dHBzOi8vcmVhY3RmbG93LmRldi9lcnJvciMke2lkfWApO1xuICAgIH1cbn07XG5jb25zdCBpc1JlYWN0S2V5Ym9hcmRFdmVudCA9IChldmVudCkgPT4gJ25hdGl2ZUV2ZW50JyBpbiBldmVudDtcbmZ1bmN0aW9uIGlzSW5wdXRET01Ob2RlKGV2ZW50KSB7XG4gICAgY29uc3Qga2JFdmVudCA9IGlzUmVhY3RLZXlib2FyZEV2ZW50KGV2ZW50KSA/IGV2ZW50Lm5hdGl2ZUV2ZW50IDogZXZlbnQ7XG4gICAgLy8gdXNpbmcgY29tcG9zZWQgcGF0aCBmb3IgaGFuZGxpbmcgc2hhZG93IGRvbVxuICAgIGNvbnN0IHRhcmdldCA9IChrYkV2ZW50LmNvbXBvc2VkUGF0aD8uKCk/LlswXSB8fCBldmVudC50YXJnZXQpO1xuICAgIGNvbnN0IGlzSW5wdXQgPSBbJ0lOUFVUJywgJ1NFTEVDVCcsICdURVhUQVJFQSddLmluY2x1ZGVzKHRhcmdldD8ubm9kZU5hbWUpIHx8IHRhcmdldD8uaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtcbiAgICAvLyB3aGVuIGFuIGlucHV0IGZpZWxkIGlzIGZvY3VzZWQgd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIGRlbGV0aW9uIG9yIG1vdmVtZW50IG9mIG5vZGVzXG4gICAgcmV0dXJuIGlzSW5wdXQgfHwgISF0YXJnZXQ/LmNsb3Nlc3QoJy5ub2tleScpO1xufVxuY29uc3QgaXNNb3VzZUV2ZW50ID0gKGV2ZW50KSA9PiAnY2xpZW50WCcgaW4gZXZlbnQ7XG5jb25zdCBnZXRFdmVudFBvc2l0aW9uID0gKGV2ZW50LCBib3VuZHMpID0+IHtcbiAgICBjb25zdCBpc01vdXNlVHJpZ2dlcmVkID0gaXNNb3VzZUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBldnRYID0gaXNNb3VzZVRyaWdnZXJlZCA/IGV2ZW50LmNsaWVudFggOiBldmVudC50b3VjaGVzPy5bMF0uY2xpZW50WDtcbiAgICBjb25zdCBldnRZID0gaXNNb3VzZVRyaWdnZXJlZCA/IGV2ZW50LmNsaWVudFkgOiBldmVudC50b3VjaGVzPy5bMF0uY2xpZW50WTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBldnRYIC0gKGJvdW5kcz8ubGVmdCA/PyAwKSxcbiAgICAgICAgeTogZXZ0WSAtIChib3VuZHM/LnRvcCA/PyAwKSxcbiAgICB9O1xufTtcbmNvbnN0IGlzTWFjT3MgPSAoKSA9PiB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5kZXhPZignTWFjJykgPj0gMDtcblxuY29uc3QgQmFzZUVkZ2UgPSAoeyBpZCwgcGF0aCwgbGFiZWxYLCBsYWJlbFksIGxhYmVsLCBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGUsIG1hcmtlckVuZCwgbWFya2VyU3RhcnQsIGludGVyYWN0aW9uV2lkdGggPSAyMCwgfSkgPT4ge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBpZDogaWQsIHN0eWxlOiBzdHlsZSwgZDogcGF0aCwgZmlsbDogXCJub25lXCIsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlLXBhdGhcIiwgbWFya2VyRW5kOiBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBtYXJrZXJTdGFydCB9KSxcbiAgICAgICAgaW50ZXJhY3Rpb25XaWR0aCAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBwYXRoLCBmaWxsOiBcIm5vbmVcIiwgc3Ryb2tlT3BhY2l0eTogMCwgc3Ryb2tlV2lkdGg6IGludGVyYWN0aW9uV2lkdGgsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19lZGdlLWludGVyYWN0aW9uXCIgfSkpLFxuICAgICAgICBsYWJlbCAmJiBpc051bWVyaWMobGFiZWxYKSAmJiBpc051bWVyaWMobGFiZWxZKSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KEVkZ2VUZXh0JDEsIHsgeDogbGFiZWxYLCB5OiBsYWJlbFksIGxhYmVsOiBsYWJlbCwgbGFiZWxTdHlsZTogbGFiZWxTdHlsZSwgbGFiZWxTaG93Qmc6IGxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGU6IGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmc6IGxhYmVsQmdQYWRkaW5nLCBsYWJlbEJnQm9yZGVyUmFkaXVzOiBsYWJlbEJnQm9yZGVyUmFkaXVzIH0pKSA6IG51bGwpKTtcbn07XG5CYXNlRWRnZS5kaXNwbGF5TmFtZSA9ICdCYXNlRWRnZSc7XG5cbmNvbnN0IGdldE1hcmtlckVuZCA9IChtYXJrZXJUeXBlLCBtYXJrZXJFbmRJZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWFya2VyRW5kSWQgIT09ICd1bmRlZmluZWQnICYmIG1hcmtlckVuZElkKSB7XG4gICAgICAgIHJldHVybiBgdXJsKCMke21hcmtlckVuZElkfSlgO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG1hcmtlclR5cGUgIT09ICd1bmRlZmluZWQnID8gYHVybCgjcmVhY3QtZmxvd19fJHttYXJrZXJUeXBlfSlgIDogJ25vbmUnO1xufTtcbmZ1bmN0aW9uIGdldE1vdXNlSGFuZGxlciQxKGlkLCBnZXRTdGF0ZSwgaGFuZGxlcikge1xuICAgIHJldHVybiBoYW5kbGVyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBoYW5kbGVyXG4gICAgICAgIDogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlZGdlID0gZ2V0U3RhdGUoKS5lZGdlcy5maW5kKChlKSA9PiBlLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAoZWRnZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoZXZlbnQsIHsgLi4uZWRnZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbn1cbi8vIHRoaXMgaXMgdXNlZCBmb3Igc3RyYWlnaHQgZWRnZXMgYW5kIHNpbXBsZSBzbW9vdGhzdGVwIGVkZ2VzIChMVFIsIFJUTCwgQlRULCBUVEIpXG5mdW5jdGlvbiBnZXRFZGdlQ2VudGVyKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgfSkge1xuICAgIGNvbnN0IHhPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXRYIC0gc291cmNlWCkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclggPSB0YXJnZXRYIDwgc291cmNlWCA/IHRhcmdldFggKyB4T2Zmc2V0IDogdGFyZ2V0WCAtIHhPZmZzZXQ7XG4gICAgY29uc3QgeU9mZnNldCA9IE1hdGguYWJzKHRhcmdldFkgLSBzb3VyY2VZKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IHRhcmdldFkgPCBzb3VyY2VZID8gdGFyZ2V0WSArIHlPZmZzZXQgOiB0YXJnZXRZIC0geU9mZnNldDtcbiAgICByZXR1cm4gW2NlbnRlclgsIGNlbnRlclksIHhPZmZzZXQsIHlPZmZzZXRdO1xufVxuZnVuY3Rpb24gZ2V0QmV6aWVyRWRnZUNlbnRlcih7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFksIHNvdXJjZUNvbnRyb2xYLCBzb3VyY2VDb250cm9sWSwgdGFyZ2V0Q29udHJvbFgsIHRhcmdldENvbnRyb2xZLCB9KSB7XG4gICAgLy8gY3ViaWMgYmV6aWVyIHQ9MC41IG1pZCBwb2ludCwgbm90IHRoZSBhY3R1YWwgbWlkIHBvaW50LCBidXQgZWFzeSB0byBjYWxjdWxhdGVcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82NzUxNjEwMS9ob3ctdG8tZmluZC1kaXN0YW5jZS1taWQtcG9pbnQtb2YtYmV6aWVyLWN1cnZlXG4gICAgY29uc3QgY2VudGVyWCA9IHNvdXJjZVggKiAwLjEyNSArIHNvdXJjZUNvbnRyb2xYICogMC4zNzUgKyB0YXJnZXRDb250cm9sWCAqIDAuMzc1ICsgdGFyZ2V0WCAqIDAuMTI1O1xuICAgIGNvbnN0IGNlbnRlclkgPSBzb3VyY2VZICogMC4xMjUgKyBzb3VyY2VDb250cm9sWSAqIDAuMzc1ICsgdGFyZ2V0Q29udHJvbFkgKiAwLjM3NSArIHRhcmdldFkgKiAwLjEyNTtcbiAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5hYnMoY2VudGVyWCAtIHNvdXJjZVgpO1xuICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLmFicyhjZW50ZXJZIC0gc291cmNlWSk7XG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZLCBvZmZzZXRYLCBvZmZzZXRZXTtcbn1cblxudmFyIENvbm5lY3Rpb25Nb2RlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uTW9kZSkge1xuICAgIENvbm5lY3Rpb25Nb2RlW1wiU3RyaWN0XCJdID0gXCJzdHJpY3RcIjtcbiAgICBDb25uZWN0aW9uTW9kZVtcIkxvb3NlXCJdID0gXCJsb29zZVwiO1xufSkoQ29ubmVjdGlvbk1vZGUgfHwgKENvbm5lY3Rpb25Nb2RlID0ge30pKTtcbnZhciBQYW5PblNjcm9sbE1vZGU7XG4oZnVuY3Rpb24gKFBhbk9uU2Nyb2xsTW9kZSkge1xuICAgIFBhbk9uU2Nyb2xsTW9kZVtcIkZyZWVcIl0gPSBcImZyZWVcIjtcbiAgICBQYW5PblNjcm9sbE1vZGVbXCJWZXJ0aWNhbFwiXSA9IFwidmVydGljYWxcIjtcbiAgICBQYW5PblNjcm9sbE1vZGVbXCJIb3Jpem9udGFsXCJdID0gXCJob3Jpem9udGFsXCI7XG59KShQYW5PblNjcm9sbE1vZGUgfHwgKFBhbk9uU2Nyb2xsTW9kZSA9IHt9KSk7XG52YXIgU2VsZWN0aW9uTW9kZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uTW9kZSkge1xuICAgIFNlbGVjdGlvbk1vZGVbXCJQYXJ0aWFsXCJdID0gXCJwYXJ0aWFsXCI7XG4gICAgU2VsZWN0aW9uTW9kZVtcIkZ1bGxcIl0gPSBcImZ1bGxcIjtcbn0pKFNlbGVjdGlvbk1vZGUgfHwgKFNlbGVjdGlvbk1vZGUgPSB7fSkpO1xuXG52YXIgQ29ubmVjdGlvbkxpbmVUeXBlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uTGluZVR5cGUpIHtcbiAgICBDb25uZWN0aW9uTGluZVR5cGVbXCJCZXppZXJcIl0gPSBcImRlZmF1bHRcIjtcbiAgICBDb25uZWN0aW9uTGluZVR5cGVbXCJTdHJhaWdodFwiXSA9IFwic3RyYWlnaHRcIjtcbiAgICBDb25uZWN0aW9uTGluZVR5cGVbXCJTdGVwXCJdID0gXCJzdGVwXCI7XG4gICAgQ29ubmVjdGlvbkxpbmVUeXBlW1wiU21vb3RoU3RlcFwiXSA9IFwic21vb3Roc3RlcFwiO1xuICAgIENvbm5lY3Rpb25MaW5lVHlwZVtcIlNpbXBsZUJlemllclwiXSA9IFwic2ltcGxlYmV6aWVyXCI7XG59KShDb25uZWN0aW9uTGluZVR5cGUgfHwgKENvbm5lY3Rpb25MaW5lVHlwZSA9IHt9KSk7XG52YXIgTWFya2VyVHlwZTtcbihmdW5jdGlvbiAoTWFya2VyVHlwZSkge1xuICAgIE1hcmtlclR5cGVbXCJBcnJvd1wiXSA9IFwiYXJyb3dcIjtcbiAgICBNYXJrZXJUeXBlW1wiQXJyb3dDbG9zZWRcIl0gPSBcImFycm93Y2xvc2VkXCI7XG59KShNYXJrZXJUeXBlIHx8IChNYXJrZXJUeXBlID0ge30pKTtcblxudmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIFBvc2l0aW9uW1wiTGVmdFwiXSA9IFwibGVmdFwiO1xuICAgIFBvc2l0aW9uW1wiVG9wXCJdID0gXCJ0b3BcIjtcbiAgICBQb3NpdGlvbltcIlJpZ2h0XCJdID0gXCJyaWdodFwiO1xuICAgIFBvc2l0aW9uW1wiQm90dG9tXCJdID0gXCJib3R0b21cIjtcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG5cbmZ1bmN0aW9uIGdldENvbnRyb2woeyBwb3MsIHgxLCB5MSwgeDIsIHkyIH0pIHtcbiAgICBpZiAocG9zID09PSBQb3NpdGlvbi5MZWZ0IHx8IHBvcyA9PT0gUG9zaXRpb24uUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFswLjUgKiAoeDEgKyB4MiksIHkxXTtcbiAgICB9XG4gICAgcmV0dXJuIFt4MSwgMC41ICogKHkxICsgeTIpXTtcbn1cbmZ1bmN0aW9uIGdldFNpbXBsZUJlemllclBhdGgoeyBzb3VyY2VYLCBzb3VyY2VZLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0WCwgdGFyZ2V0WSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIH0pIHtcbiAgICBjb25zdCBbc291cmNlQ29udHJvbFgsIHNvdXJjZUNvbnRyb2xZXSA9IGdldENvbnRyb2woe1xuICAgICAgICBwb3M6IHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICB4MTogc291cmNlWCxcbiAgICAgICAgeTE6IHNvdXJjZVksXG4gICAgICAgIHgyOiB0YXJnZXRYLFxuICAgICAgICB5MjogdGFyZ2V0WSxcbiAgICB9KTtcbiAgICBjb25zdCBbdGFyZ2V0Q29udHJvbFgsIHRhcmdldENvbnRyb2xZXSA9IGdldENvbnRyb2woe1xuICAgICAgICBwb3M6IHRhcmdldFBvc2l0aW9uLFxuICAgICAgICB4MTogdGFyZ2V0WCxcbiAgICAgICAgeTE6IHRhcmdldFksXG4gICAgICAgIHgyOiBzb3VyY2VYLFxuICAgICAgICB5Mjogc291cmNlWSxcbiAgICB9KTtcbiAgICBjb25zdCBbbGFiZWxYLCBsYWJlbFksIG9mZnNldFgsIG9mZnNldFldID0gZ2V0QmV6aWVyRWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVgsXG4gICAgICAgIHNvdXJjZVksXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgICAgIHNvdXJjZUNvbnRyb2xYLFxuICAgICAgICBzb3VyY2VDb250cm9sWSxcbiAgICAgICAgdGFyZ2V0Q29udHJvbFgsXG4gICAgICAgIHRhcmdldENvbnRyb2xZLFxuICAgIH0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIGBNJHtzb3VyY2VYfSwke3NvdXJjZVl9IEMke3NvdXJjZUNvbnRyb2xYfSwke3NvdXJjZUNvbnRyb2xZfSAke3RhcmdldENvbnRyb2xYfSwke3RhcmdldENvbnRyb2xZfSAke3RhcmdldFh9LCR7dGFyZ2V0WX1gLFxuICAgICAgICBsYWJlbFgsXG4gICAgICAgIGxhYmVsWSxcbiAgICAgICAgb2Zmc2V0WCxcbiAgICAgICAgb2Zmc2V0WSxcbiAgICBdO1xufVxuY29uc3QgU2ltcGxlQmV6aWVyRWRnZSA9IG1lbW8oKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCBpbnRlcmFjdGlvbldpZHRoLCB9KSA9PiB7XG4gICAgY29uc3QgW3BhdGgsIGxhYmVsWCwgbGFiZWxZXSA9IGdldFNpbXBsZUJlemllclBhdGgoe1xuICAgICAgICBzb3VyY2VYLFxuICAgICAgICBzb3VyY2VZLFxuICAgICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0WCxcbiAgICAgICAgdGFyZ2V0WSxcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24sXG4gICAgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VFZGdlLCB7IHBhdGg6IHBhdGgsIGxhYmVsWDogbGFiZWxYLCBsYWJlbFk6IGxhYmVsWSwgbGFiZWw6IGxhYmVsLCBsYWJlbFN0eWxlOiBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZTogbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlOiBzdHlsZSwgbWFya2VyRW5kOiBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aDogaW50ZXJhY3Rpb25XaWR0aCB9KSk7XG59KTtcblNpbXBsZUJlemllckVkZ2UuZGlzcGxheU5hbWUgPSAnU2ltcGxlQmV6aWVyRWRnZSc7XG5cbmNvbnN0IGhhbmRsZURpcmVjdGlvbnMgPSB7XG4gICAgW1Bvc2l0aW9uLkxlZnRdOiB7IHg6IC0xLCB5OiAwIH0sXG4gICAgW1Bvc2l0aW9uLlJpZ2h0XTogeyB4OiAxLCB5OiAwIH0sXG4gICAgW1Bvc2l0aW9uLlRvcF06IHsgeDogMCwgeTogLTEgfSxcbiAgICBbUG9zaXRpb24uQm90dG9tXTogeyB4OiAwLCB5OiAxIH0sXG59O1xuY29uc3QgZ2V0RGlyZWN0aW9uID0gKHsgc291cmNlLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0LCB9KSA9PiB7XG4gICAgaWYgKHNvdXJjZVBvc2l0aW9uID09PSBQb3NpdGlvbi5MZWZ0IHx8IHNvdXJjZVBvc2l0aW9uID09PSBQb3NpdGlvbi5SaWdodCkge1xuICAgICAgICByZXR1cm4gc291cmNlLnggPCB0YXJnZXQueCA/IHsgeDogMSwgeTogMCB9IDogeyB4OiAtMSwgeTogMCB9O1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlLnkgPCB0YXJnZXQueSA/IHsgeDogMCwgeTogMSB9IDogeyB4OiAwLCB5OiAtMSB9O1xufTtcbmNvbnN0IGRpc3RhbmNlID0gKGEsIGIpID0+IE1hdGguc3FydChNYXRoLnBvdyhiLnggLSBhLngsIDIpICsgTWF0aC5wb3coYi55IC0gYS55LCAyKSk7XG4vLyBpdGggdGhpcyBmdW5jdGlvbiB3ZSB0cnkgdG8gbWltaWMgYSBvcnRob2dvbmFsIGVkZ2Ugcm91dGluZyBiZWhhdmlvdXJcbi8vIEl0J3Mgbm90IGFzIGdvb2QgYXMgYSByZWFsIG9ydGhvZ29uYWwgZWRnZSByb3V0aW5nIGJ1dCBpdCdzIGZhc3RlciBhbmQgZ29vZCBlbm91Z2ggYXMgYSBkZWZhdWx0IGZvciBzdGVwIGFuZCBzbW9vdGggc3RlcCBlZGdlc1xuZnVuY3Rpb24gZ2V0UG9pbnRzKHsgc291cmNlLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0LCB0YXJnZXRQb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgY2VudGVyLCBvZmZzZXQsIH0pIHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBoYW5kbGVEaXJlY3Rpb25zW3NvdXJjZVBvc2l0aW9uXTtcbiAgICBjb25zdCB0YXJnZXREaXIgPSBoYW5kbGVEaXJlY3Rpb25zW3RhcmdldFBvc2l0aW9uXTtcbiAgICBjb25zdCBzb3VyY2VHYXBwZWQgPSB7IHg6IHNvdXJjZS54ICsgc291cmNlRGlyLnggKiBvZmZzZXQsIHk6IHNvdXJjZS55ICsgc291cmNlRGlyLnkgKiBvZmZzZXQgfTtcbiAgICBjb25zdCB0YXJnZXRHYXBwZWQgPSB7IHg6IHRhcmdldC54ICsgdGFyZ2V0RGlyLnggKiBvZmZzZXQsIHk6IHRhcmdldC55ICsgdGFyZ2V0RGlyLnkgKiBvZmZzZXQgfTtcbiAgICBjb25zdCBkaXIgPSBnZXREaXJlY3Rpb24oe1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUdhcHBlZCxcbiAgICAgICAgc291cmNlUG9zaXRpb24sXG4gICAgICAgIHRhcmdldDogdGFyZ2V0R2FwcGVkLFxuICAgIH0pO1xuICAgIGNvbnN0IGRpckFjY2Vzc29yID0gZGlyLnggIT09IDAgPyAneCcgOiAneSc7XG4gICAgY29uc3QgY3VyckRpciA9IGRpcltkaXJBY2Nlc3Nvcl07XG4gICAgbGV0IHBvaW50cyA9IFtdO1xuICAgIGxldCBjZW50ZXJYLCBjZW50ZXJZO1xuICAgIGNvbnN0IHNvdXJjZUdhcE9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IHRhcmdldEdhcE9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIGNvbnN0IFtkZWZhdWx0Q2VudGVyWCwgZGVmYXVsdENlbnRlclksIGRlZmF1bHRPZmZzZXRYLCBkZWZhdWx0T2Zmc2V0WV0gPSBnZXRFZGdlQ2VudGVyKHtcbiAgICAgICAgc291cmNlWDogc291cmNlLngsXG4gICAgICAgIHNvdXJjZVk6IHNvdXJjZS55LFxuICAgICAgICB0YXJnZXRYOiB0YXJnZXQueCxcbiAgICAgICAgdGFyZ2V0WTogdGFyZ2V0LnksXG4gICAgfSk7XG4gICAgLy8gb3Bwb3NpdGUgaGFuZGxlIHBvc2l0aW9ucywgZGVmYXVsdCBjYXNlXG4gICAgaWYgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gKiB0YXJnZXREaXJbZGlyQWNjZXNzb3JdID09PSAtMSkge1xuICAgICAgICBjZW50ZXJYID0gY2VudGVyLnggPz8gZGVmYXVsdENlbnRlclg7XG4gICAgICAgIGNlbnRlclkgPSBjZW50ZXIueSA/PyBkZWZhdWx0Q2VudGVyWTtcbiAgICAgICAgLy8gICAgLS0tPlxuICAgICAgICAvLyAgICB8XG4gICAgICAgIC8vID4tLS1cbiAgICAgICAgY29uc3QgdmVydGljYWxTcGxpdCA9IFtcbiAgICAgICAgICAgIHsgeDogY2VudGVyWCwgeTogc291cmNlR2FwcGVkLnkgfSxcbiAgICAgICAgICAgIHsgeDogY2VudGVyWCwgeTogdGFyZ2V0R2FwcGVkLnkgfSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gICAgfFxuICAgICAgICAvLyAgLS0tXG4gICAgICAgIC8vICB8XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxTcGxpdCA9IFtcbiAgICAgICAgICAgIHsgeDogc291cmNlR2FwcGVkLngsIHk6IGNlbnRlclkgfSxcbiAgICAgICAgICAgIHsgeDogdGFyZ2V0R2FwcGVkLngsIHk6IGNlbnRlclkgfSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gPT09IGN1cnJEaXIpIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyB2ZXJ0aWNhbFNwbGl0IDogaG9yaXpvbnRhbFNwbGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRzID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IGhvcml6b250YWxTcGxpdCA6IHZlcnRpY2FsU3BsaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHNvdXJjZVRhcmdldCBtZWFucyB3ZSB0YWtlIHggZnJvbSBzb3VyY2UgYW5kIHkgZnJvbSB0YXJnZXQsIHRhcmdldFNvdXJjZSBpcyB0aGUgb3Bwb3NpdGVcbiAgICAgICAgY29uc3Qgc291cmNlVGFyZ2V0ID0gW3sgeDogc291cmNlR2FwcGVkLngsIHk6IHRhcmdldEdhcHBlZC55IH1dO1xuICAgICAgICBjb25zdCB0YXJnZXRTb3VyY2UgPSBbeyB4OiB0YXJnZXRHYXBwZWQueCwgeTogc291cmNlR2FwcGVkLnkgfV07XG4gICAgICAgIC8vIHRoaXMgaGFuZGxlcyBlZGdlcyB3aXRoIHNhbWUgaGFuZGxlIHBvc2l0aW9uc1xuICAgICAgICBpZiAoZGlyQWNjZXNzb3IgPT09ICd4Jykge1xuICAgICAgICAgICAgcG9pbnRzID0gc291cmNlRGlyLnggPT09IGN1cnJEaXIgPyB0YXJnZXRTb3VyY2UgOiBzb3VyY2VUYXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwb2ludHMgPSBzb3VyY2VEaXIueSA9PT0gY3VyckRpciA/IHNvdXJjZVRhcmdldCA6IHRhcmdldFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlUG9zaXRpb24gPT09IHRhcmdldFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoc291cmNlW2RpckFjY2Vzc29yXSAtIHRhcmdldFtkaXJBY2Nlc3Nvcl0pO1xuICAgICAgICAgICAgLy8gaWYgYW4gZWRnZSBnb2VzIGZyb20gcmlnaHQgdG8gcmlnaHQgZm9yIGV4YW1wbGUgKHNvdXJjZVBvc2l0aW9uID09PSB0YXJnZXRQb3NpdGlvbikgYW5kIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHNvdXJjZS54IGFuZCB0YXJnZXQueCBpcyBsZXNzIHRoYW4gdGhlIG9mZnNldCwgdGhlIGFkZGVkIHBvaW50IGFuZCB0aGUgZ2FwcGVkIHNvdXJjZS90YXJnZXQgd2lsbCBvdmVybGFwLiBUaGlzIGxlYWRzIHRvIGEgd2VpcmQgZWRnZSBwYXRoLiBUbyBhdm9pZCB0aGlzIHdlIGFkZCBhIGdhcE9mZnNldCB0byB0aGUgc291cmNlL3RhcmdldFxuICAgICAgICAgICAgaWYgKGRpZmYgPD0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwT2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0IC0gMSwgb2Zmc2V0IC0gZGlmZik7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gPT09IGN1cnJEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlR2FwT2Zmc2V0W2RpckFjY2Vzc29yXSA9IChzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JdID4gc291cmNlW2RpckFjY2Vzc29yXSA/IC0xIDogMSkgKiBnYXBPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRHYXBPZmZzZXRbZGlyQWNjZXNzb3JdID0gKHRhcmdldEdhcHBlZFtkaXJBY2Nlc3Nvcl0gPiB0YXJnZXRbZGlyQWNjZXNzb3JdID8gLTEgOiAxKSAqIGdhcE9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGhhbmRsaW5nIG1peGVkIGhhbmRsZSBwb3NpdGlvbnMgbGlrZSBSaWdodCAtPiBCb3R0b20gZm9yIGV4YW1wbGVcbiAgICAgICAgaWYgKHNvdXJjZVBvc2l0aW9uICE9PSB0YXJnZXRQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGlyQWNjZXNzb3JPcHBvc2l0ZSA9IGRpckFjY2Vzc29yID09PSAneCcgPyAneScgOiAneCc7XG4gICAgICAgICAgICBjb25zdCBpc1NhbWVEaXIgPSBzb3VyY2VEaXJbZGlyQWNjZXNzb3JdID09PSB0YXJnZXREaXJbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VHdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPiB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMdFRhcmdldE9wcG8gPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPCB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBjb25zdCBmbGlwU291cmNlVGFyZ2V0ID0gKHNvdXJjZURpcltkaXJBY2Nlc3Nvcl0gPT09IDEgJiYgKCghaXNTYW1lRGlyICYmIHNvdXJjZUd0VGFyZ2V0T3BwbykgfHwgKGlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldE9wcG8pKSkgfHxcbiAgICAgICAgICAgICAgICAoc291cmNlRGlyW2RpckFjY2Vzc29yXSAhPT0gMSAmJiAoKCFpc1NhbWVEaXIgJiYgc291cmNlTHRUYXJnZXRPcHBvKSB8fCAoaXNTYW1lRGlyICYmIHNvdXJjZUd0VGFyZ2V0T3BwbykpKTtcbiAgICAgICAgICAgIGlmIChmbGlwU291cmNlVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IHNvdXJjZVRhcmdldCA6IHRhcmdldFNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VHYXBQb2ludCA9IHsgeDogc291cmNlR2FwcGVkLnggKyBzb3VyY2VHYXBPZmZzZXQueCwgeTogc291cmNlR2FwcGVkLnkgKyBzb3VyY2VHYXBPZmZzZXQueSB9O1xuICAgICAgICBjb25zdCB0YXJnZXRHYXBQb2ludCA9IHsgeDogdGFyZ2V0R2FwcGVkLnggKyB0YXJnZXRHYXBPZmZzZXQueCwgeTogdGFyZ2V0R2FwcGVkLnkgKyB0YXJnZXRHYXBPZmZzZXQueSB9O1xuICAgICAgICBjb25zdCBtYXhYRGlzdGFuY2UgPSBNYXRoLm1heChNYXRoLmFicyhzb3VyY2VHYXBQb2ludC54IC0gcG9pbnRzWzBdLngpLCBNYXRoLmFicyh0YXJnZXRHYXBQb2ludC54IC0gcG9pbnRzWzBdLngpKTtcbiAgICAgICAgY29uc3QgbWF4WURpc3RhbmNlID0gTWF0aC5tYXgoTWF0aC5hYnMoc291cmNlR2FwUG9pbnQueSAtIHBvaW50c1swXS55KSwgTWF0aC5hYnModGFyZ2V0R2FwUG9pbnQueSAtIHBvaW50c1swXS55KSk7XG4gICAgICAgIC8vIHdlIHdhbnQgdG8gcGxhY2UgdGhlIGxhYmVsIG9uIHRoZSBsb25nZXN0IHNlZ21lbnQgb2YgdGhlIGVkZ2VcbiAgICAgICAgaWYgKG1heFhEaXN0YW5jZSA+PSBtYXhZRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGNlbnRlclggPSAoc291cmNlR2FwUG9pbnQueCArIHRhcmdldEdhcFBvaW50LngpIC8gMjtcbiAgICAgICAgICAgIGNlbnRlclkgPSBwb2ludHNbMF0ueTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNlbnRlclggPSBwb2ludHNbMF0ueDtcbiAgICAgICAgICAgIGNlbnRlclkgPSAoc291cmNlR2FwUG9pbnQueSArIHRhcmdldEdhcFBvaW50LnkpIC8gMjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXRoUG9pbnRzID0gW1xuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHsgeDogc291cmNlR2FwcGVkLnggKyBzb3VyY2VHYXBPZmZzZXQueCwgeTogc291cmNlR2FwcGVkLnkgKyBzb3VyY2VHYXBPZmZzZXQueSB9LFxuICAgICAgICAuLi5wb2ludHMsXG4gICAgICAgIHsgeDogdGFyZ2V0R2FwcGVkLnggKyB0YXJnZXRHYXBPZmZzZXQueCwgeTogdGFyZ2V0R2FwcGVkLnkgKyB0YXJnZXRHYXBPZmZzZXQueSB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgXTtcbiAgICByZXR1cm4gW3BhdGhQb2ludHMsIGNlbnRlclgsIGNlbnRlclksIGRlZmF1bHRPZmZzZXRYLCBkZWZhdWx0T2Zmc2V0WV07XG59XG5mdW5jdGlvbiBnZXRCZW5kKGEsIGIsIGMsIHNpemUpIHtcbiAgICBjb25zdCBiZW5kU2l6ZSA9IE1hdGgubWluKGRpc3RhbmNlKGEsIGIpIC8gMiwgZGlzdGFuY2UoYiwgYykgLyAyLCBzaXplKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IGI7XG4gICAgLy8gbm8gYmVuZFxuICAgIGlmICgoYS54ID09PSB4ICYmIHggPT09IGMueCkgfHwgKGEueSA9PT0geSAmJiB5ID09PSBjLnkpKSB7XG4gICAgICAgIHJldHVybiBgTCR7eH0gJHt5fWA7XG4gICAgfVxuICAgIC8vIGZpcnN0IHNlZ21lbnQgaXMgaG9yaXpvbnRhbFxuICAgIGlmIChhLnkgPT09IHkpIHtcbiAgICAgICAgY29uc3QgeERpciA9IGEueCA8IGMueCA/IC0xIDogMTtcbiAgICAgICAgY29uc3QgeURpciA9IGEueSA8IGMueSA/IDEgOiAtMTtcbiAgICAgICAgcmV0dXJuIGBMICR7eCArIGJlbmRTaXplICogeERpcn0sJHt5fVEgJHt4fSwke3l9ICR7eH0sJHt5ICsgYmVuZFNpemUgKiB5RGlyfWA7XG4gICAgfVxuICAgIGNvbnN0IHhEaXIgPSBhLnggPCBjLnggPyAxIDogLTE7XG4gICAgY29uc3QgeURpciA9IGEueSA8IGMueSA/IC0xIDogMTtcbiAgICByZXR1cm4gYEwgJHt4fSwke3kgKyBiZW5kU2l6ZSAqIHlEaXJ9USAke3h9LCR7eX0gJHt4ICsgYmVuZFNpemUgKiB4RGlyfSwke3l9YDtcbn1cbmZ1bmN0aW9uIGdldFNtb290aFN0ZXBQYXRoKHsgc291cmNlWCwgc291cmNlWSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20sIHRhcmdldFgsIHRhcmdldFksIHRhcmdldFBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBib3JkZXJSYWRpdXMgPSA1LCBjZW50ZXJYLCBjZW50ZXJZLCBvZmZzZXQgPSAyMCwgfSkge1xuICAgIGNvbnN0IFtwb2ludHMsIGxhYmVsWCwgbGFiZWxZLCBvZmZzZXRYLCBvZmZzZXRZXSA9IGdldFBvaW50cyh7XG4gICAgICAgIHNvdXJjZTogeyB4OiBzb3VyY2VYLCB5OiBzb3VyY2VZIH0sXG4gICAgICAgIHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICB0YXJnZXQ6IHsgeDogdGFyZ2V0WCwgeTogdGFyZ2V0WSB9LFxuICAgICAgICB0YXJnZXRQb3NpdGlvbixcbiAgICAgICAgY2VudGVyOiB7IHg6IGNlbnRlclgsIHk6IGNlbnRlclkgfSxcbiAgICAgICAgb2Zmc2V0LFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdGggPSBwb2ludHMucmVkdWNlKChyZXMsIHAsIGkpID0+IHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSAnJztcbiAgICAgICAgaWYgKGkgPiAwICYmIGkgPCBwb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgc2VnbWVudCA9IGdldEJlbmQocG9pbnRzW2kgLSAxXSwgcCwgcG9pbnRzW2kgKyAxXSwgYm9yZGVyUmFkaXVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlZ21lbnQgPSBgJHtpID09PSAwID8gJ00nIDogJ0wnfSR7cC54fSAke3AueX1gO1xuICAgICAgICB9XG4gICAgICAgIHJlcyArPSBzZWdtZW50O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sICcnKTtcbiAgICByZXR1cm4gW3BhdGgsIGxhYmVsWCwgbGFiZWxZLCBvZmZzZXRYLCBvZmZzZXRZXTtcbn1cbmNvbnN0IFNtb290aFN0ZXBFZGdlID0gbWVtbygoeyBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIG1hcmtlckVuZCwgbWFya2VyU3RhcnQsIHBhdGhPcHRpb25zLCBpbnRlcmFjdGlvbldpZHRoLCB9KSA9PiB7XG4gICAgY29uc3QgW3BhdGgsIGxhYmVsWCwgbGFiZWxZXSA9IGdldFNtb290aFN0ZXBQYXRoKHtcbiAgICAgICAgc291cmNlWCxcbiAgICAgICAgc291cmNlWSxcbiAgICAgICAgc291cmNlUG9zaXRpb24sXG4gICAgICAgIHRhcmdldFgsXG4gICAgICAgIHRhcmdldFksXG4gICAgICAgIHRhcmdldFBvc2l0aW9uLFxuICAgICAgICBib3JkZXJSYWRpdXM6IHBhdGhPcHRpb25zPy5ib3JkZXJSYWRpdXMsXG4gICAgICAgIG9mZnNldDogcGF0aE9wdGlvbnM/Lm9mZnNldCxcbiAgICB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUVkZ2UsIHsgcGF0aDogcGF0aCwgbGFiZWxYOiBsYWJlbFgsIGxhYmVsWTogbGFiZWxZLCBsYWJlbDogbGFiZWwsIGxhYmVsU3R5bGU6IGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnOiBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlOiBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nOiBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1czogbGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGU6IHN0eWxlLCBtYXJrZXJFbmQ6IG1hcmtlckVuZCwgbWFya2VyU3RhcnQ6IG1hcmtlclN0YXJ0LCBpbnRlcmFjdGlvbldpZHRoOiBpbnRlcmFjdGlvbldpZHRoIH0pKTtcbn0pO1xuU21vb3RoU3RlcEVkZ2UuZGlzcGxheU5hbWUgPSAnU21vb3RoU3RlcEVkZ2UnO1xuXG5jb25zdCBTdGVwRWRnZSA9IG1lbW8oKHByb3BzKSA9PiAoUmVhY3QuY3JlYXRlRWxlbWVudChTbW9vdGhTdGVwRWRnZSwgeyAuLi5wcm9wcywgcGF0aE9wdGlvbnM6IHVzZU1lbW8oKCkgPT4gKHsgYm9yZGVyUmFkaXVzOiAwLCBvZmZzZXQ6IHByb3BzLnBhdGhPcHRpb25zPy5vZmZzZXQgfSksIFtwcm9wcy5wYXRoT3B0aW9ucz8ub2Zmc2V0XSkgfSkpKTtcblN0ZXBFZGdlLmRpc3BsYXlOYW1lID0gJ1N0ZXBFZGdlJztcblxuZnVuY3Rpb24gZ2V0U3RyYWlnaHRQYXRoKHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSwgfSkge1xuICAgIGNvbnN0IFtsYWJlbFgsIGxhYmVsWSwgb2Zmc2V0WCwgb2Zmc2V0WV0gPSBnZXRFZGdlQ2VudGVyKHtcbiAgICAgICAgc291cmNlWCxcbiAgICAgICAgc291cmNlWSxcbiAgICAgICAgdGFyZ2V0WCxcbiAgICAgICAgdGFyZ2V0WSxcbiAgICB9KTtcbiAgICByZXR1cm4gW2BNICR7c291cmNlWH0sJHtzb3VyY2VZfUwgJHt0YXJnZXRYfSwke3RhcmdldFl9YCwgbGFiZWxYLCBsYWJlbFksIG9mZnNldFgsIG9mZnNldFldO1xufVxuY29uc3QgU3RyYWlnaHRFZGdlID0gbWVtbygoeyBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZLCBsYWJlbCwgbGFiZWxTdHlsZSwgbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZSwgbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlLCBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0LCBpbnRlcmFjdGlvbldpZHRoLCB9KSA9PiB7XG4gICAgY29uc3QgW3BhdGgsIGxhYmVsWCwgbGFiZWxZXSA9IGdldFN0cmFpZ2h0UGF0aCh7IHNvdXJjZVgsIHNvdXJjZVksIHRhcmdldFgsIHRhcmdldFkgfSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEJhc2VFZGdlLCB7IHBhdGg6IHBhdGgsIGxhYmVsWDogbGFiZWxYLCBsYWJlbFk6IGxhYmVsWSwgbGFiZWw6IGxhYmVsLCBsYWJlbFN0eWxlOiBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZTogbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGxhYmVsQmdCb3JkZXJSYWRpdXMsIHN0eWxlOiBzdHlsZSwgbWFya2VyRW5kOiBtYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBtYXJrZXJTdGFydCwgaW50ZXJhY3Rpb25XaWR0aDogaW50ZXJhY3Rpb25XaWR0aCB9KSk7XG59KTtcblN0cmFpZ2h0RWRnZS5kaXNwbGF5TmFtZSA9ICdTdHJhaWdodEVkZ2UnO1xuXG5mdW5jdGlvbiBjYWxjdWxhdGVDb250cm9sT2Zmc2V0KGRpc3RhbmNlLCBjdXJ2YXR1cmUpIHtcbiAgICBpZiAoZGlzdGFuY2UgPj0gMCkge1xuICAgICAgICByZXR1cm4gMC41ICogZGlzdGFuY2U7XG4gICAgfVxuICAgIHJldHVybiBjdXJ2YXR1cmUgKiAyNSAqIE1hdGguc3FydCgtZGlzdGFuY2UpO1xufVxuZnVuY3Rpb24gZ2V0Q29udHJvbFdpdGhDdXJ2YXR1cmUoeyBwb3MsIHgxLCB5MSwgeDIsIHkyLCBjIH0pIHtcbiAgICBzd2l0Y2ggKHBvcykge1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkxlZnQ6XG4gICAgICAgICAgICByZXR1cm4gW3gxIC0gY2FsY3VsYXRlQ29udHJvbE9mZnNldCh4MSAtIHgyLCBjKSwgeTFdO1xuICAgICAgICBjYXNlIFBvc2l0aW9uLlJpZ2h0OlxuICAgICAgICAgICAgcmV0dXJuIFt4MSArIGNhbGN1bGF0ZUNvbnRyb2xPZmZzZXQoeDIgLSB4MSwgYyksIHkxXTtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5Ub3A6XG4gICAgICAgICAgICByZXR1cm4gW3gxLCB5MSAtIGNhbGN1bGF0ZUNvbnRyb2xPZmZzZXQoeTEgLSB5MiwgYyldO1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkJvdHRvbTpcbiAgICAgICAgICAgIHJldHVybiBbeDEsIHkxICsgY2FsY3VsYXRlQ29udHJvbE9mZnNldCh5MiAtIHkxLCBjKV07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0QmV6aWVyUGF0aCh7IHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVBvc2l0aW9uID0gUG9zaXRpb24uQm90dG9tLCB0YXJnZXRYLCB0YXJnZXRZLCB0YXJnZXRQb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgY3VydmF0dXJlID0gMC4yNSwgfSkge1xuICAgIGNvbnN0IFtzb3VyY2VDb250cm9sWCwgc291cmNlQ29udHJvbFldID0gZ2V0Q29udHJvbFdpdGhDdXJ2YXR1cmUoe1xuICAgICAgICBwb3M6IHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICB4MTogc291cmNlWCxcbiAgICAgICAgeTE6IHNvdXJjZVksXG4gICAgICAgIHgyOiB0YXJnZXRYLFxuICAgICAgICB5MjogdGFyZ2V0WSxcbiAgICAgICAgYzogY3VydmF0dXJlLFxuICAgIH0pO1xuICAgIGNvbnN0IFt0YXJnZXRDb250cm9sWCwgdGFyZ2V0Q29udHJvbFldID0gZ2V0Q29udHJvbFdpdGhDdXJ2YXR1cmUoe1xuICAgICAgICBwb3M6IHRhcmdldFBvc2l0aW9uLFxuICAgICAgICB4MTogdGFyZ2V0WCxcbiAgICAgICAgeTE6IHRhcmdldFksXG4gICAgICAgIHgyOiBzb3VyY2VYLFxuICAgICAgICB5Mjogc291cmNlWSxcbiAgICAgICAgYzogY3VydmF0dXJlLFxuICAgIH0pO1xuICAgIGNvbnN0IFtsYWJlbFgsIGxhYmVsWSwgb2Zmc2V0WCwgb2Zmc2V0WV0gPSBnZXRCZXppZXJFZGdlQ2VudGVyKHtcbiAgICAgICAgc291cmNlWCxcbiAgICAgICAgc291cmNlWSxcbiAgICAgICAgdGFyZ2V0WCxcbiAgICAgICAgdGFyZ2V0WSxcbiAgICAgICAgc291cmNlQ29udHJvbFgsXG4gICAgICAgIHNvdXJjZUNvbnRyb2xZLFxuICAgICAgICB0YXJnZXRDb250cm9sWCxcbiAgICAgICAgdGFyZ2V0Q29udHJvbFksXG4gICAgfSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYE0ke3NvdXJjZVh9LCR7c291cmNlWX0gQyR7c291cmNlQ29udHJvbFh9LCR7c291cmNlQ29udHJvbFl9ICR7dGFyZ2V0Q29udHJvbFh9LCR7dGFyZ2V0Q29udHJvbFl9ICR7dGFyZ2V0WH0sJHt0YXJnZXRZfWAsXG4gICAgICAgIGxhYmVsWCxcbiAgICAgICAgbGFiZWxZLFxuICAgICAgICBvZmZzZXRYLFxuICAgICAgICBvZmZzZXRZLFxuICAgIF07XG59XG5jb25zdCBCZXppZXJFZGdlID0gbWVtbygoeyBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZLCBzb3VyY2VQb3NpdGlvbiA9IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIGxhYmVsLCBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGUsIG1hcmtlckVuZCwgbWFya2VyU3RhcnQsIHBhdGhPcHRpb25zLCBpbnRlcmFjdGlvbldpZHRoLCB9KSA9PiB7XG4gICAgY29uc3QgW3BhdGgsIGxhYmVsWCwgbGFiZWxZXSA9IGdldEJlemllclBhdGgoe1xuICAgICAgICBzb3VyY2VYLFxuICAgICAgICBzb3VyY2VZLFxuICAgICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0WCxcbiAgICAgICAgdGFyZ2V0WSxcbiAgICAgICAgdGFyZ2V0UG9zaXRpb24sXG4gICAgICAgIGN1cnZhdHVyZTogcGF0aE9wdGlvbnM/LmN1cnZhdHVyZSxcbiAgICB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQmFzZUVkZ2UsIHsgcGF0aDogcGF0aCwgbGFiZWxYOiBsYWJlbFgsIGxhYmVsWTogbGFiZWxZLCBsYWJlbDogbGFiZWwsIGxhYmVsU3R5bGU6IGxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnOiBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlOiBsYWJlbEJnU3R5bGUsIGxhYmVsQmdQYWRkaW5nOiBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1czogbGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGU6IHN0eWxlLCBtYXJrZXJFbmQ6IG1hcmtlckVuZCwgbWFya2VyU3RhcnQ6IG1hcmtlclN0YXJ0LCBpbnRlcmFjdGlvbldpZHRoOiBpbnRlcmFjdGlvbldpZHRoIH0pKTtcbn0pO1xuQmV6aWVyRWRnZS5kaXNwbGF5TmFtZSA9ICdCZXppZXJFZGdlJztcblxuY29uc3QgTm9kZUlkQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQobnVsbCk7XG5jb25zdCBQcm92aWRlciA9IE5vZGVJZENvbnRleHQuUHJvdmlkZXI7XG5Ob2RlSWRDb250ZXh0LkNvbnN1bWVyO1xuY29uc3QgdXNlTm9kZUlkID0gKCkgPT4ge1xuICAgIGNvbnN0IG5vZGVJZCA9IHVzZUNvbnRleHQoTm9kZUlkQ29udGV4dCk7XG4gICAgcmV0dXJuIG5vZGVJZDtcbn07XG5cbmNvbnN0IGlzRWRnZSA9IChlbGVtZW50KSA9PiAnaWQnIGluIGVsZW1lbnQgJiYgJ3NvdXJjZScgaW4gZWxlbWVudCAmJiAndGFyZ2V0JyBpbiBlbGVtZW50O1xuY29uc3QgaXNOb2RlID0gKGVsZW1lbnQpID0+ICdpZCcgaW4gZWxlbWVudCAmJiAhKCdzb3VyY2UnIGluIGVsZW1lbnQpICYmICEoJ3RhcmdldCcgaW4gZWxlbWVudCk7XG5jb25zdCBnZXRPdXRnb2VycyA9IChub2RlLCBub2RlcywgZWRnZXMpID0+IHtcbiAgICBpZiAoIWlzTm9kZShub2RlKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IG91dGdvZXJJZHMgPSBlZGdlcy5maWx0ZXIoKGUpID0+IGUuc291cmNlID09PSBub2RlLmlkKS5tYXAoKGUpID0+IGUudGFyZ2V0KTtcbiAgICByZXR1cm4gbm9kZXMuZmlsdGVyKChuKSA9PiBvdXRnb2VySWRzLmluY2x1ZGVzKG4uaWQpKTtcbn07XG5jb25zdCBnZXRJbmNvbWVycyA9IChub2RlLCBub2RlcywgZWRnZXMpID0+IHtcbiAgICBpZiAoIWlzTm9kZShub2RlKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGluY29tZXJzSWRzID0gZWRnZXMuZmlsdGVyKChlKSA9PiBlLnRhcmdldCA9PT0gbm9kZS5pZCkubWFwKChlKSA9PiBlLnNvdXJjZSk7XG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcigobikgPT4gaW5jb21lcnNJZHMuaW5jbHVkZXMobi5pZCkpO1xufTtcbmNvbnN0IGdldEVkZ2VJZCA9ICh7IHNvdXJjZSwgc291cmNlSGFuZGxlLCB0YXJnZXQsIHRhcmdldEhhbmRsZSB9KSA9PiBgcmVhY3RmbG93X19lZGdlLSR7c291cmNlfSR7c291cmNlSGFuZGxlIHx8ICcnfS0ke3RhcmdldH0ke3RhcmdldEhhbmRsZSB8fCAnJ31gO1xuY29uc3QgZ2V0TWFya2VySWQgPSAobWFya2VyLCByZklkKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBtYXJrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBtYXJrZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBtYXJrZXI7XG4gICAgfVxuICAgIGNvbnN0IGlkUHJlZml4ID0gcmZJZCA/IGAke3JmSWR9X19gIDogJyc7XG4gICAgcmV0dXJuIGAke2lkUHJlZml4fSR7T2JqZWN0LmtleXMobWFya2VyKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gYCR7a2V5fT0ke21hcmtlcltrZXldfWApXG4gICAgICAgIC5qb2luKCcmJyl9YDtcbn07XG5jb25zdCBjb25uZWN0aW9uRXhpc3RzID0gKGVkZ2UsIGVkZ2VzKSA9PiB7XG4gICAgcmV0dXJuIGVkZ2VzLnNvbWUoKGVsKSA9PiBlbC5zb3VyY2UgPT09IGVkZ2Uuc291cmNlICYmXG4gICAgICAgIGVsLnRhcmdldCA9PT0gZWRnZS50YXJnZXQgJiZcbiAgICAgICAgKGVsLnNvdXJjZUhhbmRsZSA9PT0gZWRnZS5zb3VyY2VIYW5kbGUgfHwgKCFlbC5zb3VyY2VIYW5kbGUgJiYgIWVkZ2Uuc291cmNlSGFuZGxlKSkgJiZcbiAgICAgICAgKGVsLnRhcmdldEhhbmRsZSA9PT0gZWRnZS50YXJnZXRIYW5kbGUgfHwgKCFlbC50YXJnZXRIYW5kbGUgJiYgIWVkZ2UudGFyZ2V0SGFuZGxlKSkpO1xufTtcbmNvbnN0IGFkZEVkZ2UgPSAoZWRnZVBhcmFtcywgZWRnZXMpID0+IHtcbiAgICBpZiAoIWVkZ2VQYXJhbXMuc291cmNlIHx8ICFlZGdlUGFyYW1zLnRhcmdldCkge1xuICAgICAgICBkZXZXYXJuKCcwMDYnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwNiddKCkpO1xuICAgICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIGxldCBlZGdlO1xuICAgIGlmIChpc0VkZ2UoZWRnZVBhcmFtcykpIHtcbiAgICAgICAgZWRnZSA9IHsgLi4uZWRnZVBhcmFtcyB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZWRnZSA9IHtcbiAgICAgICAgICAgIC4uLmVkZ2VQYXJhbXMsXG4gICAgICAgICAgICBpZDogZ2V0RWRnZUlkKGVkZ2VQYXJhbXMpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoY29ubmVjdGlvbkV4aXN0cyhlZGdlLCBlZGdlcykpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gZWRnZXMuY29uY2F0KGVkZ2UpO1xufTtcbmNvbnN0IHJlY29ubmVjdEVkZ2UgPSAob2xkRWRnZSwgbmV3Q29ubmVjdGlvbiwgZWRnZXMsIG9wdGlvbnMgPSB7IHNob3VsZFJlcGxhY2VJZDogdHJ1ZSB9KSA9PiB7XG4gICAgY29uc3QgeyBpZDogb2xkRWRnZUlkLCAuLi5yZXN0IH0gPSBvbGRFZGdlO1xuICAgIGlmICghbmV3Q29ubmVjdGlvbi5zb3VyY2UgfHwgIW5ld0Nvbm5lY3Rpb24udGFyZ2V0KSB7XG4gICAgICAgIGRldldhcm4oJzAwNicsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDA2J10oKSk7XG4gICAgICAgIHJldHVybiBlZGdlcztcbiAgICB9XG4gICAgY29uc3QgZm91bmRFZGdlID0gZWRnZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gb2xkRWRnZUlkKTtcbiAgICBpZiAoIWZvdW5kRWRnZSkge1xuICAgICAgICBkZXZXYXJuKCcwMDcnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwNyddKG9sZEVkZ2VJZCkpO1xuICAgICAgICByZXR1cm4gZWRnZXM7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBvbGQgZWRnZSBhbmQgY3JlYXRlIHRoZSBuZXcgZWRnZSB3aXRoIHBhcmFtZXRlcnMgb2Ygb2xkIGVkZ2UuXG4gICAgY29uc3QgZWRnZSA9IHtcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgaWQ6IG9wdGlvbnMuc2hvdWxkUmVwbGFjZUlkID8gZ2V0RWRnZUlkKG5ld0Nvbm5lY3Rpb24pIDogb2xkRWRnZUlkLFxuICAgICAgICBzb3VyY2U6IG5ld0Nvbm5lY3Rpb24uc291cmNlLFxuICAgICAgICB0YXJnZXQ6IG5ld0Nvbm5lY3Rpb24udGFyZ2V0LFxuICAgICAgICBzb3VyY2VIYW5kbGU6IG5ld0Nvbm5lY3Rpb24uc291cmNlSGFuZGxlLFxuICAgICAgICB0YXJnZXRIYW5kbGU6IG5ld0Nvbm5lY3Rpb24udGFyZ2V0SGFuZGxlLFxuICAgIH07XG4gICAgcmV0dXJuIGVkZ2VzLmZpbHRlcigoZSkgPT4gZS5pZCAhPT0gb2xkRWRnZUlkKS5jb25jYXQoZWRnZSk7XG59O1xuLyoqXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGByZWNvbm5lY3RFZGdlYCBpbnN0ZWFkLlxuICovXG5jb25zdCB1cGRhdGVFZGdlID0gKG9sZEVkZ2UsIG5ld0Nvbm5lY3Rpb24sIGVkZ2VzLCBvcHRpb25zID0geyBzaG91bGRSZXBsYWNlSWQ6IHRydWUgfSkgPT4ge1xuICAgIGNvbnNvbGUud2FybignW0RFUFJFQ0FURURdIGB1cGRhdGVFZGdlYCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBgcmVjb25uZWN0RWRnZWAgaHR0cHM6Ly9yZWFjdGZsb3cuZGV2L2FwaS1yZWZlcmVuY2UvdXRpbHMvcmVjb25uZWN0LWVkZ2UnKTtcbiAgICByZXR1cm4gcmVjb25uZWN0RWRnZShvbGRFZGdlLCBuZXdDb25uZWN0aW9uLCBlZGdlcywgb3B0aW9ucyk7XG59O1xuY29uc3QgcG9pbnRUb1JlbmRlcmVyUG9pbnQgPSAoeyB4LCB5IH0sIFt0eCwgdHksIHRTY2FsZV0sIHNuYXBUb0dyaWQsIFtzbmFwWCwgc25hcFldKSA9PiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB7XG4gICAgICAgIHg6ICh4IC0gdHgpIC8gdFNjYWxlLFxuICAgICAgICB5OiAoeSAtIHR5KSAvIHRTY2FsZSxcbiAgICB9O1xuICAgIGlmIChzbmFwVG9HcmlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBzbmFwWCAqIE1hdGgucm91bmQocG9zaXRpb24ueCAvIHNuYXBYKSxcbiAgICAgICAgICAgIHk6IHNuYXBZICogTWF0aC5yb3VuZChwb3NpdGlvbi55IC8gc25hcFkpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcG9zaXRpb247XG59O1xuY29uc3QgcmVuZGVyZXJQb2ludFRvUG9pbnQgPSAoeyB4LCB5IH0sIFt0eCwgdHksIHRTY2FsZV0pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICogdFNjYWxlICsgdHgsXG4gICAgICAgIHk6IHkgKiB0U2NhbGUgKyB0eSxcbiAgICB9O1xufTtcbmNvbnN0IGdldE5vZGVQb3NpdGlvbldpdGhPcmlnaW4gPSAobm9kZSwgbm9kZU9yaWdpbiA9IFswLCAwXSkgPT4ge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICBwb3NpdGlvbkFic29sdXRlOiB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0WCA9IChub2RlLndpZHRoID8/IDApICogbm9kZU9yaWdpblswXTtcbiAgICBjb25zdCBvZmZzZXRZID0gKG5vZGUuaGVpZ2h0ID8/IDApICogbm9kZU9yaWdpblsxXTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgICAgeDogbm9kZS5wb3NpdGlvbi54IC0gb2Zmc2V0WCxcbiAgICAgICAgeTogbm9kZS5wb3NpdGlvbi55IC0gb2Zmc2V0WSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICBwb3NpdGlvbkFic29sdXRlOiBub2RlLnBvc2l0aW9uQWJzb2x1dGVcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHg6IG5vZGUucG9zaXRpb25BYnNvbHV0ZS54IC0gb2Zmc2V0WCxcbiAgICAgICAgICAgICAgICB5OiBub2RlLnBvc2l0aW9uQWJzb2x1dGUueSAtIG9mZnNldFksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHBvc2l0aW9uLFxuICAgIH07XG59O1xuY29uc3QgZ2V0Tm9kZXNCb3VuZHMgPSAobm9kZXMsIG5vZGVPcmlnaW4gPSBbMCwgMF0pID0+IHtcbiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICB9XG4gICAgY29uc3QgYm94ID0gbm9kZXMucmVkdWNlKChjdXJyQm94LCBub2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbihub2RlLCBub2RlT3JpZ2luKS5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICByZXR1cm4gZ2V0Qm91bmRzT2ZCb3hlcyhjdXJyQm94LCByZWN0VG9Cb3goe1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB3aWR0aDogbm9kZS53aWR0aCB8fCAwLFxuICAgICAgICAgICAgaGVpZ2h0OiBub2RlLmhlaWdodCB8fCAwLFxuICAgICAgICB9KSk7XG4gICAgfSwgeyB4OiBJbmZpbml0eSwgeTogSW5maW5pdHksIHgyOiAtSW5maW5pdHksIHkyOiAtSW5maW5pdHkgfSk7XG4gICAgcmV0dXJuIGJveFRvUmVjdChib3gpO1xufTtcbi8vIEBkZXByZWNhdGVkIFVzZSBgZ2V0Tm9kZXNCb3VuZHNgLlxuY29uc3QgZ2V0UmVjdE9mTm9kZXMgPSAobm9kZXMsIG5vZGVPcmlnaW4gPSBbMCwgMF0pID0+IHtcbiAgICBjb25zb2xlLndhcm4oJ1tERVBSRUNBVEVEXSBgZ2V0UmVjdE9mTm9kZXNgIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBnZXROb2Rlc0JvdW5kc2AgaHR0cHM6Ly9yZWFjdGZsb3cuZGV2L2FwaS1yZWZlcmVuY2UvdXRpbHMvZ2V0LW5vZGVzLWJvdW5kcy4nKTtcbiAgICByZXR1cm4gZ2V0Tm9kZXNCb3VuZHMobm9kZXMsIG5vZGVPcmlnaW4pO1xufTtcbmNvbnN0IGdldE5vZGVzSW5zaWRlID0gKG5vZGVJbnRlcm5hbHMsIHJlY3QsIFt0eCwgdHksIHRTY2FsZV0gPSBbMCwgMCwgMV0sIHBhcnRpYWxseSA9IGZhbHNlLCBcbi8vIHNldCBleGNsdWRlTm9uU2VsZWN0YWJsZU5vZGVzIGlmIHlvdSB3YW50IHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIG5vZGVzIFwic2VsZWN0YWJsZVwiIGF0dHJpYnV0ZVxuZXhjbHVkZU5vblNlbGVjdGFibGVOb2RlcyA9IGZhbHNlLCBub2RlT3JpZ2luID0gWzAsIDBdKSA9PiB7XG4gICAgY29uc3QgcGFuZVJlY3QgPSB7XG4gICAgICAgIHg6IChyZWN0LnggLSB0eCkgLyB0U2NhbGUsXG4gICAgICAgIHk6IChyZWN0LnkgLSB0eSkgLyB0U2NhbGUsXG4gICAgICAgIHdpZHRoOiByZWN0LndpZHRoIC8gdFNjYWxlLFxuICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0IC8gdFNjYWxlLFxuICAgIH07XG4gICAgY29uc3QgdmlzaWJsZU5vZGVzID0gW107XG4gICAgbm9kZUludGVybmFscy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgc2VsZWN0YWJsZSA9IHRydWUsIGhpZGRlbiA9IGZhbHNlIH0gPSBub2RlO1xuICAgICAgICBpZiAoKGV4Y2x1ZGVOb25TZWxlY3RhYmxlTm9kZXMgJiYgIXNlbGVjdGFibGUpIHx8IGhpZGRlbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgcG9zaXRpb25BYnNvbHV0ZSB9ID0gZ2V0Tm9kZVBvc2l0aW9uV2l0aE9yaWdpbihub2RlLCBub2RlT3JpZ2luKTtcbiAgICAgICAgY29uc3Qgbm9kZVJlY3QgPSB7XG4gICAgICAgICAgICB4OiBwb3NpdGlvbkFic29sdXRlLngsXG4gICAgICAgICAgICB5OiBwb3NpdGlvbkFic29sdXRlLnksXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggfHwgMCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0IHx8IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG92ZXJsYXBwaW5nQXJlYSA9IGdldE92ZXJsYXBwaW5nQXJlYShwYW5lUmVjdCwgbm9kZVJlY3QpO1xuICAgICAgICBjb25zdCBub3RJbml0aWFsaXplZCA9IHR5cGVvZiB3aWR0aCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGhlaWdodCA9PT0gJ3VuZGVmaW5lZCcgfHwgd2lkdGggPT09IG51bGwgfHwgaGVpZ2h0ID09PSBudWxsO1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlWaXNpYmxlID0gcGFydGlhbGx5ICYmIG92ZXJsYXBwaW5nQXJlYSA+IDA7XG4gICAgICAgIGNvbnN0IGFyZWEgPSAod2lkdGggfHwgMCkgKiAoaGVpZ2h0IHx8IDApO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBub3RJbml0aWFsaXplZCB8fCBwYXJ0aWFsbHlWaXNpYmxlIHx8IG92ZXJsYXBwaW5nQXJlYSA+PSBhcmVhO1xuICAgICAgICBpZiAoaXNWaXNpYmxlIHx8IG5vZGUuZHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIHZpc2libGVOb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZpc2libGVOb2Rlcztcbn07XG5jb25zdCBnZXRDb25uZWN0ZWRFZGdlcyA9IChub2RlcywgZWRnZXMpID0+IHtcbiAgICBjb25zdCBub2RlSWRzID0gbm9kZXMubWFwKChub2RlKSA9PiBub2RlLmlkKTtcbiAgICByZXR1cm4gZWRnZXMuZmlsdGVyKChlZGdlKSA9PiBub2RlSWRzLmluY2x1ZGVzKGVkZ2Uuc291cmNlKSB8fCBub2RlSWRzLmluY2x1ZGVzKGVkZ2UudGFyZ2V0KSk7XG59O1xuLy8gQGRlcHJlY2F0ZWQgVXNlIGBnZXRWaWV3cG9ydEZvckJvdW5kc2AuXG5jb25zdCBnZXRUcmFuc2Zvcm1Gb3JCb3VuZHMgPSAoYm91bmRzLCB3aWR0aCwgaGVpZ2h0LCBtaW5ab29tLCBtYXhab29tLCBwYWRkaW5nID0gMC4xKSA9PiB7XG4gICAgY29uc3QgeyB4LCB5LCB6b29tIH0gPSBnZXRWaWV3cG9ydEZvckJvdW5kcyhib3VuZHMsIHdpZHRoLCBoZWlnaHQsIG1pblpvb20sIG1heFpvb20sIHBhZGRpbmcpO1xuICAgIGNvbnNvbGUud2FybignW0RFUFJFQ0FURURdIGBnZXRUcmFuc2Zvcm1Gb3JCb3VuZHNgIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBnZXRWaWV3cG9ydEZvckJvdW5kc2AuIEJld2FyZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgdHlwZSBWaWV3cG9ydCAoYHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHpvb206IG51bWJlciB9YCkgaW5zdGVhZCBvZiBUcmFuc2Zvcm0gKGBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl1gKS4gaHR0cHM6Ly9yZWFjdGZsb3cuZGV2L2FwaS1yZWZlcmVuY2UvdXRpbHMvZ2V0LXZpZXdwb3J0LWZvci1ib3VuZHMnKTtcbiAgICByZXR1cm4gW3gsIHksIHpvb21dO1xufTtcbmNvbnN0IGdldFZpZXdwb3J0Rm9yQm91bmRzID0gKGJvdW5kcywgd2lkdGgsIGhlaWdodCwgbWluWm9vbSwgbWF4Wm9vbSwgcGFkZGluZyA9IDAuMSkgPT4ge1xuICAgIGNvbnN0IHhab29tID0gd2lkdGggLyAoYm91bmRzLndpZHRoICogKDEgKyBwYWRkaW5nKSk7XG4gICAgY29uc3QgeVpvb20gPSBoZWlnaHQgLyAoYm91bmRzLmhlaWdodCAqICgxICsgcGFkZGluZykpO1xuICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbih4Wm9vbSwgeVpvb20pO1xuICAgIGNvbnN0IGNsYW1wZWRab29tID0gY2xhbXAoem9vbSwgbWluWm9vbSwgbWF4Wm9vbSk7XG4gICAgY29uc3QgYm91bmRzQ2VudGVyWCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoIC8gMjtcbiAgICBjb25zdCBib3VuZHNDZW50ZXJZID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC8gMjtcbiAgICBjb25zdCB4ID0gd2lkdGggLyAyIC0gYm91bmRzQ2VudGVyWCAqIGNsYW1wZWRab29tO1xuICAgIGNvbnN0IHkgPSBoZWlnaHQgLyAyIC0gYm91bmRzQ2VudGVyWSAqIGNsYW1wZWRab29tO1xuICAgIHJldHVybiB7IHgsIHksIHpvb206IGNsYW1wZWRab29tIH07XG59O1xuY29uc3QgZ2V0RDNUcmFuc2l0aW9uID0gKHNlbGVjdGlvbiwgZHVyYXRpb24gPSAwKSA9PiB7XG4gICAgcmV0dXJuIHNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pO1xufTtcblxuLy8gdGhpcyBmdW5jdGlvbnMgY29sbGVjdHMgYWxsIGhhbmRsZXMgYW5kIGFkZHMgYW4gYWJzb2x1dGUgcG9zaXRpb25cbi8vIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGZpbmQgdGhlIGNsb3Nlc3QgaGFuZGxlIHRvIHRoZSBtb3VzZSBwb3NpdGlvblxuZnVuY3Rpb24gZ2V0SGFuZGxlcyhub2RlLCBoYW5kbGVCb3VuZHMsIHR5cGUsIGN1cnJlbnRIYW5kbGUpIHtcbiAgICByZXR1cm4gKGhhbmRsZUJvdW5kc1t0eXBlXSB8fCBbXSkucmVkdWNlKChyZXMsIGgpID0+IHtcbiAgICAgICAgaWYgKGAke25vZGUuaWR9LSR7aC5pZH0tJHt0eXBlfWAgIT09IGN1cnJlbnRIYW5kbGUpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogaC5pZCB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICAgIHg6IChub2RlLnBvc2l0aW9uQWJzb2x1dGU/LnggPz8gMCkgKyBoLnggKyBoLndpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiAobm9kZS5wb3NpdGlvbkFic29sdXRlPy55ID8/IDApICsgaC55ICsgaC5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCBbXSk7XG59XG5mdW5jdGlvbiBnZXRDbG9zZXN0SGFuZGxlKGV2ZW50LCBkb2MsIHBvcywgY29ubmVjdGlvblJhZGl1cywgaGFuZGxlcywgdmFsaWRhdG9yKSB7XG4gICAgLy8gd2UgYWx3YXlzIHdhbnQgdG8gcHJpb3JpdGl6ZSB0aGUgaGFuZGxlIGJlbG93IHRoZSBtb3VzZSBjdXJzb3Igb3ZlciB0aGUgY2xvc2VzdCBkaXN0YW5jZSBoYW5kbGUsXG4gICAgLy8gYmVjYXVzZSBpdCBjb3VsZCBiZSB0aGF0IHRoZSBjZW50ZXIgb2YgYW5vdGhlciBoYW5kbGUgaXMgY2xvc2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyIHRoYW4gdGhlIGhhbmRsZSBiZWxvdyB0aGUgY3Vyc29yXG4gICAgY29uc3QgeyB4LCB5IH0gPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zdCBkb21Ob2RlcyA9IGRvYy5lbGVtZW50c0Zyb21Qb2ludCh4LCB5KTtcbiAgICBjb25zdCBoYW5kbGVCZWxvdyA9IGRvbU5vZGVzLmZpbmQoKGVsKSA9PiBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3JlYWN0LWZsb3dfX2hhbmRsZScpKTtcbiAgICBpZiAoaGFuZGxlQmVsb3cpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlTm9kZUlkID0gaGFuZGxlQmVsb3cuZ2V0QXR0cmlidXRlKCdkYXRhLW5vZGVpZCcpO1xuICAgICAgICBpZiAoaGFuZGxlTm9kZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVUeXBlID0gZ2V0SGFuZGxlVHlwZSh1bmRlZmluZWQsIGhhbmRsZUJlbG93KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUlkID0gaGFuZGxlQmVsb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbmRsZWlkJyk7XG4gICAgICAgICAgICBjb25zdCB2YWxpZEhhbmRsZVJlc3VsdCA9IHZhbGlkYXRvcih7IG5vZGVJZDogaGFuZGxlTm9kZUlkLCBpZDogaGFuZGxlSWQsIHR5cGU6IGhhbmRsZVR5cGUgfSk7XG4gICAgICAgICAgICBpZiAodmFsaWRIYW5kbGVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBoYW5kbGVzLmZpbmQoKGgpID0+IGgubm9kZUlkID09PSBoYW5kbGVOb2RlSWQgJiYgaC50eXBlID09PSBoYW5kbGVUeXBlICYmIGguaWQgPT09IGhhbmRsZUlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBoYW5kbGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGhhbmRsZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSWQ6IGhhbmRsZU5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGhhbmRsZT8ueCB8fCBwb3MueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGhhbmRsZT8ueSB8fCBwb3MueSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRIYW5kbGVSZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBjb3VsZG4ndCBmaW5kIGEgaGFuZGxlIGJlbG93IHRoZSBtb3VzZSBjdXJzb3Igd2UgbG9vayBmb3IgdGhlIGNsb3Nlc3QgZGlzdGFuY2UgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb25SYWRpdXNcbiAgICBsZXQgY2xvc2VzdEhhbmRsZXMgPSBbXTtcbiAgICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBoYW5kbGVzLmZvckVhY2goKGhhbmRsZSkgPT4ge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydCgoaGFuZGxlLnggLSBwb3MueCkgKiogMiArIChoYW5kbGUueSAtIHBvcy55KSAqKiAyKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDw9IGNvbm5lY3Rpb25SYWRpdXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkSGFuZGxlUmVzdWx0ID0gdmFsaWRhdG9yKGhhbmRsZSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0SGFuZGxlcyA9IFt7IGhhbmRsZSwgdmFsaWRIYW5kbGVSZXN1bHQgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpc3RhbmNlID09PSBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGhhbmRsZXMgYXJlIG9uIHRoZSBzYW1lIGRpc3RhbmNlIHdlIGNvbGxlY3QgYWxsIG9mIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdEhhbmRsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEhhbmRsZVJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWNsb3Nlc3RIYW5kbGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4geyBoYW5kbGU6IG51bGwsIHZhbGlkSGFuZGxlUmVzdWx0OiBkZWZhdWx0UmVzdWx0KCkgfTtcbiAgICB9XG4gICAgaWYgKGNsb3Nlc3RIYW5kbGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gY2xvc2VzdEhhbmRsZXNbMF07XG4gICAgfVxuICAgIGNvbnN0IGhhc1ZhbGlkSGFuZGxlID0gY2xvc2VzdEhhbmRsZXMuc29tZSgoeyB2YWxpZEhhbmRsZVJlc3VsdCB9KSA9PiB2YWxpZEhhbmRsZVJlc3VsdC5pc1ZhbGlkKTtcbiAgICBjb25zdCBoYXNUYXJnZXRIYW5kbGUgPSBjbG9zZXN0SGFuZGxlcy5zb21lKCh7IGhhbmRsZSB9KSA9PiBoYW5kbGUudHlwZSA9PT0gJ3RhcmdldCcpO1xuICAgIC8vIGlmIG11bHRpcGxlIGhhbmRsZXMgYXJlIGxheW91dGVkIG9uIHRvcCBvZiBlYWNoIG90aGVyIHdlIHByZWZlciB0aGUgb25lIHdpdGggdHlwZSA9IHRhcmdldCBhbmQgdGhlIG9uZSB0aGF0IGlzIHZhbGlkXG4gICAgcmV0dXJuIChjbG9zZXN0SGFuZGxlcy5maW5kKCh7IGhhbmRsZSwgdmFsaWRIYW5kbGVSZXN1bHQgfSkgPT4gaGFzVGFyZ2V0SGFuZGxlID8gaGFuZGxlLnR5cGUgPT09ICd0YXJnZXQnIDogKGhhc1ZhbGlkSGFuZGxlID8gdmFsaWRIYW5kbGVSZXN1bHQuaXNWYWxpZCA6IHRydWUpKSB8fCBjbG9zZXN0SGFuZGxlc1swXSk7XG59XG5jb25zdCBudWxsQ29ubmVjdGlvbiA9IHsgc291cmNlOiBudWxsLCB0YXJnZXQ6IG51bGwsIHNvdXJjZUhhbmRsZTogbnVsbCwgdGFyZ2V0SGFuZGxlOiBudWxsIH07XG5jb25zdCBkZWZhdWx0UmVzdWx0ID0gKCkgPT4gKHtcbiAgICBoYW5kbGVEb21Ob2RlOiBudWxsLFxuICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgIGNvbm5lY3Rpb246IG51bGxDb25uZWN0aW9uLFxuICAgIGVuZEhhbmRsZTogbnVsbCxcbn0pO1xuLy8gY2hlY2tzIGlmICBhbmQgcmV0dXJucyBjb25uZWN0aW9uIGluIGZvbSBvZiBhbiBvYmplY3QgeyBzb3VyY2U6IDEyMywgdGFyZ2V0OiAzMTIgfVxuZnVuY3Rpb24gaXNWYWxpZEhhbmRsZShoYW5kbGUsIGNvbm5lY3Rpb25Nb2RlLCBmcm9tTm9kZUlkLCBmcm9tSGFuZGxlSWQsIGZyb21UeXBlLCBpc1ZhbGlkQ29ubmVjdGlvbiwgZG9jKSB7XG4gICAgY29uc3QgaXNUYXJnZXQgPSBmcm9tVHlwZSA9PT0gJ3RhcmdldCc7XG4gICAgY29uc3QgaGFuZGxlVG9DaGVjayA9IGRvYy5xdWVyeVNlbGVjdG9yKGAucmVhY3QtZmxvd19faGFuZGxlW2RhdGEtaWQ9XCIke2hhbmRsZT8ubm9kZUlkfS0ke2hhbmRsZT8uaWR9LSR7aGFuZGxlPy50eXBlfVwiXWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFJlc3VsdCgpLFxuICAgICAgICBoYW5kbGVEb21Ob2RlOiBoYW5kbGVUb0NoZWNrLFxuICAgIH07XG4gICAgaWYgKGhhbmRsZVRvQ2hlY2spIHtcbiAgICAgICAgY29uc3QgaGFuZGxlVHlwZSA9IGdldEhhbmRsZVR5cGUodW5kZWZpbmVkLCBoYW5kbGVUb0NoZWNrKTtcbiAgICAgICAgY29uc3QgaGFuZGxlTm9kZUlkID0gaGFuZGxlVG9DaGVjay5nZXRBdHRyaWJ1dGUoJ2RhdGEtbm9kZWlkJyk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUlkID0gaGFuZGxlVG9DaGVjay5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuZGxlaWQnKTtcbiAgICAgICAgY29uc3QgY29ubmVjdGFibGUgPSBoYW5kbGVUb0NoZWNrLmNsYXNzTGlzdC5jb250YWlucygnY29ubmVjdGFibGUnKTtcbiAgICAgICAgY29uc3QgY29ubmVjdGFibGVFbmQgPSBoYW5kbGVUb0NoZWNrLmNsYXNzTGlzdC5jb250YWlucygnY29ubmVjdGFibGVlbmQnKTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogaXNUYXJnZXQgPyBoYW5kbGVOb2RlSWQgOiBmcm9tTm9kZUlkLFxuICAgICAgICAgICAgc291cmNlSGFuZGxlOiBpc1RhcmdldCA/IGhhbmRsZUlkIDogZnJvbUhhbmRsZUlkLFxuICAgICAgICAgICAgdGFyZ2V0OiBpc1RhcmdldCA/IGZyb21Ob2RlSWQgOiBoYW5kbGVOb2RlSWQsXG4gICAgICAgICAgICB0YXJnZXRIYW5kbGU6IGlzVGFyZ2V0ID8gZnJvbUhhbmRsZUlkIDogaGFuZGxlSWQsXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdC5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgY29uc3QgaXNDb25uZWN0YWJsZSA9IGNvbm5lY3RhYmxlICYmIGNvbm5lY3RhYmxlRW5kO1xuICAgICAgICAvLyBpbiBzdHJpY3QgbW9kZSB3ZSBkb24ndCBhbGxvdyB0YXJnZXQgdG8gdGFyZ2V0IG9yIHNvdXJjZSB0byBzb3VyY2UgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IGlzQ29ubmVjdGFibGUgJiZcbiAgICAgICAgICAgIChjb25uZWN0aW9uTW9kZSA9PT0gQ29ubmVjdGlvbk1vZGUuU3RyaWN0XG4gICAgICAgICAgICAgICAgPyAoaXNUYXJnZXQgJiYgaGFuZGxlVHlwZSA9PT0gJ3NvdXJjZScpIHx8ICghaXNUYXJnZXQgJiYgaGFuZGxlVHlwZSA9PT0gJ3RhcmdldCcpXG4gICAgICAgICAgICAgICAgOiBoYW5kbGVOb2RlSWQgIT09IGZyb21Ob2RlSWQgfHwgaGFuZGxlSWQgIT09IGZyb21IYW5kbGVJZCk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kSGFuZGxlID0ge1xuICAgICAgICAgICAgICAgIG5vZGVJZDogaGFuZGxlTm9kZUlkLFxuICAgICAgICAgICAgICAgIGhhbmRsZUlkLFxuICAgICAgICAgICAgICAgIHR5cGU6IGhhbmRsZVR5cGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBpc1ZhbGlkQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0SGFuZGxlTG9va3VwKHsgbm9kZXMsIG5vZGVJZCwgaGFuZGxlSWQsIGhhbmRsZVR5cGUgfSkge1xuICAgIHJldHVybiBub2Rlcy5yZWR1Y2UoKHJlcywgbm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZVtpbnRlcm5hbHNTeW1ib2xdKSB7XG4gICAgICAgICAgICBjb25zdCB7IGhhbmRsZUJvdW5kcyB9ID0gbm9kZVtpbnRlcm5hbHNTeW1ib2xdO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUhhbmRsZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRIYW5kbGVzID0gW107XG4gICAgICAgICAgICBpZiAoaGFuZGxlQm91bmRzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlSGFuZGxlcyA9IGdldEhhbmRsZXMobm9kZSwgaGFuZGxlQm91bmRzLCAnc291cmNlJywgYCR7bm9kZUlkfS0ke2hhbmRsZUlkfS0ke2hhbmRsZVR5cGV9YCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SGFuZGxlcyA9IGdldEhhbmRsZXMobm9kZSwgaGFuZGxlQm91bmRzLCAndGFyZ2V0JywgYCR7bm9kZUlkfS0ke2hhbmRsZUlkfS0ke2hhbmRsZVR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMucHVzaCguLi5zb3VyY2VIYW5kbGVzLCAuLi50YXJnZXRIYW5kbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIFtdKTtcbn1cbmZ1bmN0aW9uIGdldEhhbmRsZVR5cGUoZWRnZVVwZGF0ZXJUeXBlLCBoYW5kbGVEb21Ob2RlKSB7XG4gICAgaWYgKGVkZ2VVcGRhdGVyVHlwZSkge1xuICAgICAgICByZXR1cm4gZWRnZVVwZGF0ZXJUeXBlO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYW5kbGVEb21Ob2RlPy5jbGFzc0xpc3QuY29udGFpbnMoJ3RhcmdldCcpKSB7XG4gICAgICAgIHJldHVybiAndGFyZ2V0JztcbiAgICB9XG4gICAgZWxzZSBpZiAoaGFuZGxlRG9tTm9kZT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzb3VyY2UnKSkge1xuICAgICAgICByZXR1cm4gJ3NvdXJjZSc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVzZXRSZWNlbnRIYW5kbGUoaGFuZGxlRG9tTm9kZSkge1xuICAgIGhhbmRsZURvbU5vZGU/LmNsYXNzTGlzdC5yZW1vdmUoJ3ZhbGlkJywgJ2Nvbm5lY3RpbmcnLCAncmVhY3QtZmxvd19faGFuZGxlLXZhbGlkJywgJ3JlYWN0LWZsb3dfX2hhbmRsZS1jb25uZWN0aW5nJyk7XG59XG5mdW5jdGlvbiBnZXRDb25uZWN0aW9uU3RhdHVzKGlzSW5zaWRlQ29ubmVjdGlvblJhZGl1cywgaXNIYW5kbGVWYWxpZCkge1xuICAgIGxldCBjb25uZWN0aW9uU3RhdHVzID0gbnVsbDtcbiAgICBpZiAoaXNIYW5kbGVWYWxpZCkge1xuICAgICAgICBjb25uZWN0aW9uU3RhdHVzID0gJ3ZhbGlkJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNJbnNpZGVDb25uZWN0aW9uUmFkaXVzICYmICFpc0hhbmRsZVZhbGlkKSB7XG4gICAgICAgIGNvbm5lY3Rpb25TdGF0dXMgPSAnaW52YWxpZCc7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVQb2ludGVyRG93bih7IGV2ZW50LCBoYW5kbGVJZCwgbm9kZUlkLCBvbkNvbm5lY3QsIGlzVGFyZ2V0LCBnZXRTdGF0ZSwgc2V0U3RhdGUsIGlzVmFsaWRDb25uZWN0aW9uLCBlZGdlVXBkYXRlclR5cGUsIG9uUmVjb25uZWN0RW5kLCB9KSB7XG4gICAgLy8gd2hlbiByZWFjdC1mbG93IGlzIHVzZWQgaW5zaWRlIGEgc2hhZG93IHJvb3Qgd2UgY2FuJ3QgdXNlIGRvY3VtZW50XG4gICAgY29uc3QgZG9jID0gZ2V0SG9zdEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICBjb25zdCB7IGNvbm5lY3Rpb25Nb2RlLCBkb21Ob2RlLCBhdXRvUGFuT25Db25uZWN0LCBjb25uZWN0aW9uUmFkaXVzLCBvbkNvbm5lY3RTdGFydCwgcGFuQnksIGdldE5vZGVzLCBjYW5jZWxDb25uZWN0aW9uLCB9ID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQgYXV0b1BhbklkID0gMDtcbiAgICBsZXQgY2xvc2VzdEhhbmRsZTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IGdldEV2ZW50UG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnN0IGNsaWNrZWRIYW5kbGUgPSBkb2M/LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgY29uc3QgaGFuZGxlVHlwZSA9IGdldEhhbmRsZVR5cGUoZWRnZVVwZGF0ZXJUeXBlLCBjbGlja2VkSGFuZGxlKTtcbiAgICBjb25zdCBjb250YWluZXJCb3VuZHMgPSBkb21Ob2RlPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAoIWNvbnRhaW5lckJvdW5kcyB8fCAhaGFuZGxlVHlwZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBwcmV2QWN0aXZlSGFuZGxlO1xuICAgIGxldCBjb25uZWN0aW9uUG9zaXRpb24gPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LCBjb250YWluZXJCb3VuZHMpO1xuICAgIGxldCBhdXRvUGFuU3RhcnRlZCA9IGZhbHNlO1xuICAgIGxldCBjb25uZWN0aW9uID0gbnVsbDtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGxldCBoYW5kbGVEb21Ob2RlID0gbnVsbDtcbiAgICBjb25zdCBoYW5kbGVMb29rdXAgPSBnZXRIYW5kbGVMb29rdXAoe1xuICAgICAgICBub2RlczogZ2V0Tm9kZXMoKSxcbiAgICAgICAgbm9kZUlkLFxuICAgICAgICBoYW5kbGVJZCxcbiAgICAgICAgaGFuZGxlVHlwZSxcbiAgICB9KTtcbiAgICAvLyB3aGVuIHRoZSB1c2VyIGlzIG1vdmluZyB0aGUgbW91c2UgY2xvc2UgdG8gdGhlIGVkZ2Ugb2YgdGhlIGNhbnZhcyB3aGlsZSBjb25uZWN0aW5nIHdlIG1vdmUgdGhlIGNhbnZhc1xuICAgIGNvbnN0IGF1dG9QYW4gPSAoKSA9PiB7XG4gICAgICAgIGlmICghYXV0b1Bhbk9uQ29ubmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFt4TW92ZW1lbnQsIHlNb3ZlbWVudF0gPSBjYWxjQXV0b1Bhbihjb25uZWN0aW9uUG9zaXRpb24sIGNvbnRhaW5lckJvdW5kcyk7XG4gICAgICAgIHBhbkJ5KHsgeDogeE1vdmVtZW50LCB5OiB5TW92ZW1lbnQgfSk7XG4gICAgICAgIGF1dG9QYW5JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhdXRvUGFuKTtcbiAgICB9O1xuICAgIHNldFN0YXRlKHtcbiAgICAgICAgY29ubmVjdGlvblBvc2l0aW9uLFxuICAgICAgICBjb25uZWN0aW9uU3RhdHVzOiBudWxsLFxuICAgICAgICAvLyBjb25uZWN0aW9uTm9kZUlkIGV0YyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgaW4gZmF2b3Igb2YgY29ubmVjdGlvblN0YXJ0SGFuZGxlXG4gICAgICAgIGNvbm5lY3Rpb25Ob2RlSWQ6IG5vZGVJZCxcbiAgICAgICAgY29ubmVjdGlvbkhhbmRsZUlkOiBoYW5kbGVJZCxcbiAgICAgICAgY29ubmVjdGlvbkhhbmRsZVR5cGU6IGhhbmRsZVR5cGUsXG4gICAgICAgIGNvbm5lY3Rpb25TdGFydEhhbmRsZToge1xuICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgaGFuZGxlSWQsXG4gICAgICAgICAgICB0eXBlOiBoYW5kbGVUeXBlLFxuICAgICAgICB9LFxuICAgICAgICBjb25uZWN0aW9uRW5kSGFuZGxlOiBudWxsLFxuICAgIH0pO1xuICAgIG9uQ29ubmVjdFN0YXJ0Py4oZXZlbnQsIHsgbm9kZUlkLCBoYW5kbGVJZCwgaGFuZGxlVHlwZSB9KTtcbiAgICBmdW5jdGlvbiBvblBvaW50ZXJNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtIH0gPSBnZXRTdGF0ZSgpO1xuICAgICAgICBjb25uZWN0aW9uUG9zaXRpb24gPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LCBjb250YWluZXJCb3VuZHMpO1xuICAgICAgICBjb25zdCB7IGhhbmRsZSwgdmFsaWRIYW5kbGVSZXN1bHQgfSA9IGdldENsb3Nlc3RIYW5kbGUoZXZlbnQsIGRvYywgcG9pbnRUb1JlbmRlcmVyUG9pbnQoY29ubmVjdGlvblBvc2l0aW9uLCB0cmFuc2Zvcm0sIGZhbHNlLCBbMSwgMV0pLCBjb25uZWN0aW9uUmFkaXVzLCBoYW5kbGVMb29rdXAsIChoYW5kbGUpID0+IGlzVmFsaWRIYW5kbGUoaGFuZGxlLCBjb25uZWN0aW9uTW9kZSwgbm9kZUlkLCBoYW5kbGVJZCwgaXNUYXJnZXQgPyAndGFyZ2V0JyA6ICdzb3VyY2UnLCBpc1ZhbGlkQ29ubmVjdGlvbiwgZG9jKSk7XG4gICAgICAgIGNsb3Nlc3RIYW5kbGUgPSBoYW5kbGU7XG4gICAgICAgIGlmICghYXV0b1BhblN0YXJ0ZWQpIHtcbiAgICAgICAgICAgIGF1dG9QYW4oKTtcbiAgICAgICAgICAgIGF1dG9QYW5TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVEb21Ob2RlID0gdmFsaWRIYW5kbGVSZXN1bHQuaGFuZGxlRG9tTm9kZTtcbiAgICAgICAgY29ubmVjdGlvbiA9IHZhbGlkSGFuZGxlUmVzdWx0LmNvbm5lY3Rpb247XG4gICAgICAgIGlzVmFsaWQgPSB2YWxpZEhhbmRsZVJlc3VsdC5pc1ZhbGlkO1xuICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBjb25uZWN0aW9uUG9zaXRpb246IGNsb3Nlc3RIYW5kbGUgJiYgaXNWYWxpZFxuICAgICAgICAgICAgICAgID8gcmVuZGVyZXJQb2ludFRvUG9pbnQoe1xuICAgICAgICAgICAgICAgICAgICB4OiBjbG9zZXN0SGFuZGxlLngsXG4gICAgICAgICAgICAgICAgICAgIHk6IGNsb3Nlc3RIYW5kbGUueSxcbiAgICAgICAgICAgICAgICB9LCB0cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgOiBjb25uZWN0aW9uUG9zaXRpb24sXG4gICAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzOiBnZXRDb25uZWN0aW9uU3RhdHVzKCEhY2xvc2VzdEhhbmRsZSwgaXNWYWxpZCksXG4gICAgICAgICAgICBjb25uZWN0aW9uRW5kSGFuZGxlOiB2YWxpZEhhbmRsZVJlc3VsdC5lbmRIYW5kbGUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNsb3Nlc3RIYW5kbGUgJiYgIWlzVmFsaWQgJiYgIWhhbmRsZURvbU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNldFJlY2VudEhhbmRsZShwcmV2QWN0aXZlSGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29ubmVjdGlvbi5zb3VyY2UgIT09IGNvbm5lY3Rpb24udGFyZ2V0ICYmIGhhbmRsZURvbU5vZGUpIHtcbiAgICAgICAgICAgIHJlc2V0UmVjZW50SGFuZGxlKHByZXZBY3RpdmVIYW5kbGUpO1xuICAgICAgICAgICAgcHJldkFjdGl2ZUhhbmRsZSA9IGhhbmRsZURvbU5vZGU7XG4gICAgICAgICAgICAvLyBAdG9kbzogcmVtb3ZlIHRoZSBvbGQgY2xhc3MgbmFtZXMgXCJyZWFjdC1mbG93X19oYW5kbGUtXCIgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxuICAgICAgICAgICAgaGFuZGxlRG9tTm9kZS5jbGFzc0xpc3QuYWRkKCdjb25uZWN0aW5nJywgJ3JlYWN0LWZsb3dfX2hhbmRsZS1jb25uZWN0aW5nJyk7XG4gICAgICAgICAgICBoYW5kbGVEb21Ob2RlLmNsYXNzTGlzdC50b2dnbGUoJ3ZhbGlkJywgaXNWYWxpZCk7XG4gICAgICAgICAgICBoYW5kbGVEb21Ob2RlLmNsYXNzTGlzdC50b2dnbGUoJ3JlYWN0LWZsb3dfX2hhbmRsZS12YWxpZCcsIGlzVmFsaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uUG9pbnRlclVwKGV2ZW50KSB7XG4gICAgICAgIGlmICgoY2xvc2VzdEhhbmRsZSB8fCBoYW5kbGVEb21Ob2RlKSAmJiBjb25uZWN0aW9uICYmIGlzVmFsaWQpIHtcbiAgICAgICAgICAgIG9uQ29ubmVjdD8uKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRvIGdldCBhIGZyZXNoIHJlZmVyZW5jZSBmcm9tIHRoZSBzdG9yZSBoZXJlXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIGdldCB0aGUgbGF0ZXN0IHN0YXRlIG9mIG9uQ29ubmVjdEVuZFxuICAgICAgICBnZXRTdGF0ZSgpLm9uQ29ubmVjdEVuZD8uKGV2ZW50KTtcbiAgICAgICAgaWYgKGVkZ2VVcGRhdGVyVHlwZSkge1xuICAgICAgICAgICAgb25SZWNvbm5lY3RFbmQ/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzZXRSZWNlbnRIYW5kbGUocHJldkFjdGl2ZUhhbmRsZSk7XG4gICAgICAgIGNhbmNlbENvbm5lY3Rpb24oKTtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYXV0b1BhbklkKTtcbiAgICAgICAgYXV0b1BhblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICBjb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgaGFuZGxlRG9tTm9kZSA9IG51bGw7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblBvaW50ZXJVcCk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Qb2ludGVyVXApO1xuICAgIH1cbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblBvaW50ZXJVcCk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uUG9pbnRlclVwKTtcbn1cblxuY29uc3QgYWx3YXlzVmFsaWQgPSAoKSA9PiB0cnVlO1xuY29uc3Qgc2VsZWN0b3IkZiA9IChzKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25TdGFydEhhbmRsZTogcy5jb25uZWN0aW9uU3RhcnRIYW5kbGUsXG4gICAgY29ubmVjdE9uQ2xpY2s6IHMuY29ubmVjdE9uQ2xpY2ssXG4gICAgbm9QYW5DbGFzc05hbWU6IHMubm9QYW5DbGFzc05hbWUsXG59KTtcbmNvbnN0IGNvbm5lY3RpbmdTZWxlY3RvciA9IChub2RlSWQsIGhhbmRsZUlkLCB0eXBlKSA9PiAoc3RhdGUpID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3Rpb25TdGFydEhhbmRsZTogc3RhcnRIYW5kbGUsIGNvbm5lY3Rpb25FbmRIYW5kbGU6IGVuZEhhbmRsZSwgY29ubmVjdGlvbkNsaWNrU3RhcnRIYW5kbGU6IGNsaWNrSGFuZGxlLCB9ID0gc3RhdGU7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29ubmVjdGluZzogKHN0YXJ0SGFuZGxlPy5ub2RlSWQgPT09IG5vZGVJZCAmJiBzdGFydEhhbmRsZT8uaGFuZGxlSWQgPT09IGhhbmRsZUlkICYmIHN0YXJ0SGFuZGxlPy50eXBlID09PSB0eXBlKSB8fFxuICAgICAgICAgICAgKGVuZEhhbmRsZT8ubm9kZUlkID09PSBub2RlSWQgJiYgZW5kSGFuZGxlPy5oYW5kbGVJZCA9PT0gaGFuZGxlSWQgJiYgZW5kSGFuZGxlPy50eXBlID09PSB0eXBlKSxcbiAgICAgICAgY2xpY2tDb25uZWN0aW5nOiBjbGlja0hhbmRsZT8ubm9kZUlkID09PSBub2RlSWQgJiYgY2xpY2tIYW5kbGU/LmhhbmRsZUlkID09PSBoYW5kbGVJZCAmJiBjbGlja0hhbmRsZT8udHlwZSA9PT0gdHlwZSxcbiAgICB9O1xufTtcbmNvbnN0IEhhbmRsZSA9IGZvcndhcmRSZWYoKHsgdHlwZSA9ICdzb3VyY2UnLCBwb3NpdGlvbiA9IFBvc2l0aW9uLlRvcCwgaXNWYWxpZENvbm5lY3Rpb24sIGlzQ29ubmVjdGFibGUgPSB0cnVlLCBpc0Nvbm5lY3RhYmxlU3RhcnQgPSB0cnVlLCBpc0Nvbm5lY3RhYmxlRW5kID0gdHJ1ZSwgaWQsIG9uQ29ubmVjdCwgY2hpbGRyZW4sIGNsYXNzTmFtZSwgb25Nb3VzZURvd24sIG9uVG91Y2hTdGFydCwgLi4ucmVzdCB9LCByZWYpID0+IHtcbiAgICBjb25zdCBoYW5kbGVJZCA9IGlkIHx8IG51bGw7XG4gICAgY29uc3QgaXNUYXJnZXQgPSB0eXBlID09PSAndGFyZ2V0JztcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3Qgbm9kZUlkID0gdXNlTm9kZUlkKCk7XG4gICAgY29uc3QgeyBjb25uZWN0T25DbGljaywgbm9QYW5DbGFzc05hbWUgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJGYsIHNoYWxsb3cpO1xuICAgIGNvbnN0IHsgY29ubmVjdGluZywgY2xpY2tDb25uZWN0aW5nIH0gPSB1c2VTdG9yZShjb25uZWN0aW5nU2VsZWN0b3Iobm9kZUlkLCBoYW5kbGVJZCwgdHlwZSksIHNoYWxsb3cpO1xuICAgIGlmICghbm9kZUlkKSB7XG4gICAgICAgIHN0b3JlLmdldFN0YXRlKCkub25FcnJvcj8uKCcwMTAnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAxMCddKCkpO1xuICAgIH1cbiAgICBjb25zdCBvbkNvbm5lY3RFeHRlbmRlZCA9IChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0RWRnZU9wdGlvbnMsIG9uQ29ubmVjdDogb25Db25uZWN0QWN0aW9uLCBoYXNEZWZhdWx0RWRnZXMgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IGVkZ2VQYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0RWRnZU9wdGlvbnMsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZWRnZXMsIHNldEVkZ2VzIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgc2V0RWRnZXMoYWRkRWRnZShlZGdlUGFyYW1zLCBlZGdlcykpO1xuICAgICAgICB9XG4gICAgICAgIG9uQ29ubmVjdEFjdGlvbj8uKGVkZ2VQYXJhbXMpO1xuICAgICAgICBvbkNvbm5lY3Q/LihlZGdlUGFyYW1zKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFub2RlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc01vdXNlVHJpZ2dlcmVkID0gaXNNb3VzZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgaWYgKGlzQ29ubmVjdGFibGVTdGFydCAmJiAoKGlzTW91c2VUcmlnZ2VyZWQgJiYgZXZlbnQuYnV0dG9uID09PSAwKSB8fCAhaXNNb3VzZVRyaWdnZXJlZCkpIHtcbiAgICAgICAgICAgIGhhbmRsZVBvaW50ZXJEb3duKHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBoYW5kbGVJZCxcbiAgICAgICAgICAgICAgICBub2RlSWQsXG4gICAgICAgICAgICAgICAgb25Db25uZWN0OiBvbkNvbm5lY3RFeHRlbmRlZCxcbiAgICAgICAgICAgICAgICBpc1RhcmdldCxcbiAgICAgICAgICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgICAgICAgICAgc2V0U3RhdGU6IHN0b3JlLnNldFN0YXRlLFxuICAgICAgICAgICAgICAgIGlzVmFsaWRDb25uZWN0aW9uOiBpc1ZhbGlkQ29ubmVjdGlvbiB8fCBzdG9yZS5nZXRTdGF0ZSgpLmlzVmFsaWRDb25uZWN0aW9uIHx8IGFsd2F5c1ZhbGlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTW91c2VUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIG9uTW91c2VEb3duPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25Ub3VjaFN0YXJ0Py4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvbkNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb25DbGlja0Nvbm5lY3RTdGFydCwgb25DbGlja0Nvbm5lY3RFbmQsIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlLCBjb25uZWN0aW9uTW9kZSwgaXNWYWxpZENvbm5lY3Rpb246IGlzVmFsaWRDb25uZWN0aW9uU3RvcmUsIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBpZiAoIW5vZGVJZCB8fCAoIWNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlICYmICFpc0Nvbm5lY3RhYmxlU3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25uZWN0aW9uQ2xpY2tTdGFydEhhbmRsZSkge1xuICAgICAgICAgICAgb25DbGlja0Nvbm5lY3RTdGFydD8uKGV2ZW50LCB7IG5vZGVJZCwgaGFuZGxlSWQsIGhhbmRsZVR5cGU6IHR5cGUgfSk7XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlOiB7IG5vZGVJZCwgdHlwZSwgaGFuZGxlSWQgfSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2MgPSBnZXRIb3N0Rm9yRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgICAgICBjb25zdCBpc1ZhbGlkQ29ubmVjdGlvbkhhbmRsZXIgPSBpc1ZhbGlkQ29ubmVjdGlvbiB8fCBpc1ZhbGlkQ29ubmVjdGlvblN0b3JlIHx8IGFsd2F5c1ZhbGlkO1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIGlzVmFsaWQgfSA9IGlzVmFsaWRIYW5kbGUoe1xuICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgaWQ6IGhhbmRsZUlkLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgfSwgY29ubmVjdGlvbk1vZGUsIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlLm5vZGVJZCwgY29ubmVjdGlvbkNsaWNrU3RhcnRIYW5kbGUuaGFuZGxlSWQgfHwgbnVsbCwgY29ubmVjdGlvbkNsaWNrU3RhcnRIYW5kbGUudHlwZSwgaXNWYWxpZENvbm5lY3Rpb25IYW5kbGVyLCBkb2MpO1xuICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgb25Db25uZWN0RXh0ZW5kZWQoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgb25DbGlja0Nvbm5lY3RFbmQ/LihldmVudCk7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgY29ubmVjdGlvbkNsaWNrU3RhcnRIYW5kbGU6IG51bGwgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImRhdGEtaGFuZGxlaWRcIjogaGFuZGxlSWQsIFwiZGF0YS1ub2RlaWRcIjogbm9kZUlkLCBcImRhdGEtaGFuZGxlcG9zXCI6IHBvc2l0aW9uLCBcImRhdGEtaWRcIjogYCR7bm9kZUlkfS0ke2hhbmRsZUlkfS0ke3R5cGV9YCwgY2xhc3NOYW1lOiBjYyhbXG4gICAgICAgICAgICAncmVhY3QtZmxvd19faGFuZGxlJyxcbiAgICAgICAgICAgIGByZWFjdC1mbG93X19oYW5kbGUtJHtwb3NpdGlvbn1gLFxuICAgICAgICAgICAgJ25vZHJhZycsXG4gICAgICAgICAgICBub1BhbkNsYXNzTmFtZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICFpc1RhcmdldCxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IGlzVGFyZ2V0LFxuICAgICAgICAgICAgICAgIGNvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlLFxuICAgICAgICAgICAgICAgIGNvbm5lY3RhYmxlc3RhcnQ6IGlzQ29ubmVjdGFibGVTdGFydCxcbiAgICAgICAgICAgICAgICBjb25uZWN0YWJsZWVuZDogaXNDb25uZWN0YWJsZUVuZCxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW5nOiBjbGlja0Nvbm5lY3RpbmcsXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjbGFzcyBpcyB1c2VkIHRvIHN0eWxlIHRoZSBoYW5kbGUgd2hlbiB0aGUgdXNlciBpcyBjb25uZWN0aW5nXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbmluZGljYXRvcjogaXNDb25uZWN0YWJsZSAmJiAoKGlzQ29ubmVjdGFibGVTdGFydCAmJiAhY29ubmVjdGluZykgfHwgKGlzQ29ubmVjdGFibGVFbmQgJiYgY29ubmVjdGluZykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXSksIG9uTW91c2VEb3duOiBvblBvaW50ZXJEb3duLCBvblRvdWNoU3RhcnQ6IG9uUG9pbnRlckRvd24sIG9uQ2xpY2s6IGNvbm5lY3RPbkNsaWNrID8gb25DbGljayA6IHVuZGVmaW5lZCwgcmVmOiByZWYsIC4uLnJlc3QgfSwgY2hpbGRyZW4pKTtcbn0pO1xuSGFuZGxlLmRpc3BsYXlOYW1lID0gJ0hhbmRsZSc7XG52YXIgSGFuZGxlJDEgPSBtZW1vKEhhbmRsZSk7XG5cbmNvbnN0IERlZmF1bHROb2RlID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AsIHNvdXJjZVBvc2l0aW9uID0gUG9zaXRpb24uQm90dG9tLCB9KSA9PiB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhhbmRsZSQxLCB7IHR5cGU6IFwidGFyZ2V0XCIsIHBvc2l0aW9uOiB0YXJnZXRQb3NpdGlvbiwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSB9KSxcbiAgICAgICAgZGF0YT8ubGFiZWwsXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGFuZGxlJDEsIHsgdHlwZTogXCJzb3VyY2VcIiwgcG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCBpc0Nvbm5lY3RhYmxlOiBpc0Nvbm5lY3RhYmxlIH0pKSk7XG59O1xuRGVmYXVsdE5vZGUuZGlzcGxheU5hbWUgPSAnRGVmYXVsdE5vZGUnO1xudmFyIERlZmF1bHROb2RlJDEgPSBtZW1vKERlZmF1bHROb2RlKTtcblxuY29uc3QgSW5wdXROb2RlID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSwgc291cmNlUG9zaXRpb24gPSBQb3NpdGlvbi5Cb3R0b20gfSkgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgZGF0YT8ubGFiZWwsXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChIYW5kbGUkMSwgeyB0eXBlOiBcInNvdXJjZVwiLCBwb3NpdGlvbjogc291cmNlUG9zaXRpb24sIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUgfSkpKTtcbklucHV0Tm9kZS5kaXNwbGF5TmFtZSA9ICdJbnB1dE5vZGUnO1xudmFyIElucHV0Tm9kZSQxID0gbWVtbyhJbnB1dE5vZGUpO1xuXG5jb25zdCBPdXRwdXROb2RlID0gKHsgZGF0YSwgaXNDb25uZWN0YWJsZSwgdGFyZ2V0UG9zaXRpb24gPSBQb3NpdGlvbi5Ub3AgfSkgPT4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChIYW5kbGUkMSwgeyB0eXBlOiBcInRhcmdldFwiLCBwb3NpdGlvbjogdGFyZ2V0UG9zaXRpb24sIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUgfSksXG4gICAgZGF0YT8ubGFiZWwpKTtcbk91dHB1dE5vZGUuZGlzcGxheU5hbWUgPSAnT3V0cHV0Tm9kZSc7XG52YXIgT3V0cHV0Tm9kZSQxID0gbWVtbyhPdXRwdXROb2RlKTtcblxuY29uc3QgR3JvdXBOb2RlID0gKCkgPT4gbnVsbDtcbkdyb3VwTm9kZS5kaXNwbGF5TmFtZSA9ICdHcm91cE5vZGUnO1xuXG5jb25zdCBzZWxlY3RvciRlID0gKHMpID0+ICh7XG4gICAgc2VsZWN0ZWROb2Rlczogcy5nZXROb2RlcygpLmZpbHRlcigobikgPT4gbi5zZWxlY3RlZCksXG4gICAgc2VsZWN0ZWRFZGdlczogcy5lZGdlcy5maWx0ZXIoKGUpID0+IGUuc2VsZWN0ZWQpLm1hcCgoZSkgPT4gKHsgLi4uZSB9KSksXG59KTtcbmNvbnN0IHNlbGVjdElkID0gKG9iaikgPT4gb2JqLmlkO1xuZnVuY3Rpb24gYXJlRXF1YWwoYSwgYikge1xuICAgIHJldHVybiAoc2hhbGxvdyhhLnNlbGVjdGVkTm9kZXMubWFwKHNlbGVjdElkKSwgYi5zZWxlY3RlZE5vZGVzLm1hcChzZWxlY3RJZCkpICYmXG4gICAgICAgIHNoYWxsb3coYS5zZWxlY3RlZEVkZ2VzLm1hcChzZWxlY3RJZCksIGIuc2VsZWN0ZWRFZGdlcy5tYXAoc2VsZWN0SWQpKSk7XG59XG4vLyBUaGlzIGlzIGp1c3QgYSBoZWxwZXIgY29tcG9uZW50IGZvciBjYWxsaW5nIHRoZSBvblNlbGVjdGlvbkNoYW5nZSBsaXN0ZW5lci5cbi8vIEBUT0RPOiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBvbk5vZGVzQ2hhbmdlIGFuZCBvbiBFZGdlc0NoYW5nZSBsaXN0ZW5lcnMsIGRvIHdlIHN0aWxsIG5lZWQgdGhpcyBjb21wb25lbnQ/XG5jb25zdCBTZWxlY3Rpb25MaXN0ZW5lciA9IG1lbW8oKHsgb25TZWxlY3Rpb25DaGFuZ2UgfSkgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCB7IHNlbGVjdGVkTm9kZXMsIHNlbGVjdGVkRWRnZXMgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJGUsIGFyZUVxdWFsKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IG5vZGVzOiBzZWxlY3RlZE5vZGVzLCBlZGdlczogc2VsZWN0ZWRFZGdlcyB9O1xuICAgICAgICBvblNlbGVjdGlvbkNoYW5nZT8uKHBhcmFtcyk7XG4gICAgICAgIHN0b3JlLmdldFN0YXRlKCkub25TZWxlY3Rpb25DaGFuZ2UuZm9yRWFjaCgoZm4pID0+IGZuKHBhcmFtcykpO1xuICAgIH0sIFtzZWxlY3RlZE5vZGVzLCBzZWxlY3RlZEVkZ2VzLCBvblNlbGVjdGlvbkNoYW5nZV0pO1xuICAgIHJldHVybiBudWxsO1xufSk7XG5TZWxlY3Rpb25MaXN0ZW5lci5kaXNwbGF5TmFtZSA9ICdTZWxlY3Rpb25MaXN0ZW5lcic7XG5jb25zdCBjaGFuZ2VTZWxlY3RvciA9IChzKSA9PiAhIXMub25TZWxlY3Rpb25DaGFuZ2U7XG5mdW5jdGlvbiBXcmFwcGVyJDEoeyBvblNlbGVjdGlvbkNoYW5nZSB9KSB7XG4gICAgY29uc3Qgc3RvcmVIYXNTZWxlY3Rpb25DaGFuZ2UgPSB1c2VTdG9yZShjaGFuZ2VTZWxlY3Rvcik7XG4gICAgaWYgKG9uU2VsZWN0aW9uQ2hhbmdlIHx8IHN0b3JlSGFzU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFNlbGVjdGlvbkxpc3RlbmVyLCB7IG9uU2VsZWN0aW9uQ2hhbmdlOiBvblNlbGVjdGlvbkNoYW5nZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHNlbGVjdG9yJGQgPSAocykgPT4gKHtcbiAgICBzZXROb2Rlczogcy5zZXROb2RlcyxcbiAgICBzZXRFZGdlczogcy5zZXRFZGdlcyxcbiAgICBzZXREZWZhdWx0Tm9kZXNBbmRFZGdlczogcy5zZXREZWZhdWx0Tm9kZXNBbmRFZGdlcyxcbiAgICBzZXRNaW5ab29tOiBzLnNldE1pblpvb20sXG4gICAgc2V0TWF4Wm9vbTogcy5zZXRNYXhab29tLFxuICAgIHNldFRyYW5zbGF0ZUV4dGVudDogcy5zZXRUcmFuc2xhdGVFeHRlbnQsXG4gICAgc2V0Tm9kZUV4dGVudDogcy5zZXROb2RlRXh0ZW50LFxuICAgIHJlc2V0OiBzLnJlc2V0LFxufSk7XG5mdW5jdGlvbiB1c2VTdG9yZVVwZGF0ZXIodmFsdWUsIHNldFN0b3JlU3RhdGUpIHtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc2V0U3RvcmVTdGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9LCBbdmFsdWVdKTtcbn1cbi8vIHVwZGF0ZXMgd2l0aCB2YWx1ZXMgaW4gc3RvcmUgdGhhdCBkb24ndCBoYXZlIGEgZGVkaWNhdGVkIHNldHRlciBmdW5jdGlvblxuZnVuY3Rpb24gdXNlRGlyZWN0U3RvcmVVcGRhdGVyKGtleSwgdmFsdWUsIHNldFN0YXRlKSB7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKHsgW2tleV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgfSwgW3ZhbHVlXSk7XG59XG5jb25zdCBTdG9yZVVwZGF0ZXIgPSAoeyBub2RlcywgZWRnZXMsIGRlZmF1bHROb2RlcywgZGVmYXVsdEVkZ2VzLCBvbkNvbm5lY3QsIG9uQ29ubmVjdFN0YXJ0LCBvbkNvbm5lY3RFbmQsIG9uQ2xpY2tDb25uZWN0U3RhcnQsIG9uQ2xpY2tDb25uZWN0RW5kLCBub2Rlc0RyYWdnYWJsZSwgbm9kZXNDb25uZWN0YWJsZSwgbm9kZXNGb2N1c2FibGUsIGVkZ2VzRm9jdXNhYmxlLCBlZGdlc1VwZGF0YWJsZSwgZWxldmF0ZU5vZGVzT25TZWxlY3QsIG1pblpvb20sIG1heFpvb20sIG5vZGVFeHRlbnQsIG9uTm9kZXNDaGFuZ2UsIG9uRWRnZXNDaGFuZ2UsIGVsZW1lbnRzU2VsZWN0YWJsZSwgY29ubmVjdGlvbk1vZGUsIHNuYXBHcmlkLCBzbmFwVG9HcmlkLCB0cmFuc2xhdGVFeHRlbnQsIGNvbm5lY3RPbkNsaWNrLCBkZWZhdWx0RWRnZU9wdGlvbnMsIGZpdFZpZXcsIGZpdFZpZXdPcHRpb25zLCBvbk5vZGVzRGVsZXRlLCBvbkVkZ2VzRGVsZXRlLCBvbk5vZGVEcmFnLCBvbk5vZGVEcmFnU3RhcnQsIG9uTm9kZURyYWdTdG9wLCBvblNlbGVjdGlvbkRyYWcsIG9uU2VsZWN0aW9uRHJhZ1N0YXJ0LCBvblNlbGVjdGlvbkRyYWdTdG9wLCBub1BhbkNsYXNzTmFtZSwgbm9kZU9yaWdpbiwgcmZJZCwgYXV0b1Bhbk9uQ29ubmVjdCwgYXV0b1Bhbk9uTm9kZURyYWcsIG9uRXJyb3IsIGNvbm5lY3Rpb25SYWRpdXMsIGlzVmFsaWRDb25uZWN0aW9uLCBub2RlRHJhZ1RocmVzaG9sZCwgfSkgPT4ge1xuICAgIGNvbnN0IHsgc2V0Tm9kZXMsIHNldEVkZ2VzLCBzZXREZWZhdWx0Tm9kZXNBbmRFZGdlcywgc2V0TWluWm9vbSwgc2V0TWF4Wm9vbSwgc2V0VHJhbnNsYXRlRXh0ZW50LCBzZXROb2RlRXh0ZW50LCByZXNldCwgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJGQsIHNoYWxsb3cpO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBlZGdlc1dpdGhEZWZhdWx0cyA9IGRlZmF1bHRFZGdlcz8ubWFwKChlKSA9PiAoeyAuLi5lLCAuLi5kZWZhdWx0RWRnZU9wdGlvbnMgfSkpO1xuICAgICAgICBzZXREZWZhdWx0Tm9kZXNBbmRFZGdlcyhkZWZhdWx0Tm9kZXMsIGVkZ2VzV2l0aERlZmF1bHRzKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignZGVmYXVsdEVkZ2VPcHRpb25zJywgZGVmYXVsdEVkZ2VPcHRpb25zLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdjb25uZWN0aW9uTW9kZScsIGNvbm5lY3Rpb25Nb2RlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbkNvbm5lY3QnLCBvbkNvbm5lY3QsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uQ29ubmVjdFN0YXJ0Jywgb25Db25uZWN0U3RhcnQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uQ29ubmVjdEVuZCcsIG9uQ29ubmVjdEVuZCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25DbGlja0Nvbm5lY3RTdGFydCcsIG9uQ2xpY2tDb25uZWN0U3RhcnQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uQ2xpY2tDb25uZWN0RW5kJywgb25DbGlja0Nvbm5lY3RFbmQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ25vZGVzRHJhZ2dhYmxlJywgbm9kZXNEcmFnZ2FibGUsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ25vZGVzQ29ubmVjdGFibGUnLCBub2Rlc0Nvbm5lY3RhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdub2Rlc0ZvY3VzYWJsZScsIG5vZGVzRm9jdXNhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdlZGdlc0ZvY3VzYWJsZScsIGVkZ2VzRm9jdXNhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdlZGdlc1VwZGF0YWJsZScsIGVkZ2VzVXBkYXRhYmxlLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdlbGVtZW50c1NlbGVjdGFibGUnLCBlbGVtZW50c1NlbGVjdGFibGUsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2VsZXZhdGVOb2Rlc09uU2VsZWN0JywgZWxldmF0ZU5vZGVzT25TZWxlY3QsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ3NuYXBUb0dyaWQnLCBzbmFwVG9HcmlkLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdzbmFwR3JpZCcsIHNuYXBHcmlkLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbk5vZGVzQ2hhbmdlJywgb25Ob2Rlc0NoYW5nZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25FZGdlc0NoYW5nZScsIG9uRWRnZXNDaGFuZ2UsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2Nvbm5lY3RPbkNsaWNrJywgY29ubmVjdE9uQ2xpY2ssIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2ZpdFZpZXdPbkluaXQnLCBmaXRWaWV3LCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdmaXRWaWV3T25Jbml0T3B0aW9ucycsIGZpdFZpZXdPcHRpb25zLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbk5vZGVzRGVsZXRlJywgb25Ob2Rlc0RlbGV0ZSwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25FZGdlc0RlbGV0ZScsIG9uRWRnZXNEZWxldGUsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uTm9kZURyYWcnLCBvbk5vZGVEcmFnLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdvbk5vZGVEcmFnU3RhcnQnLCBvbk5vZGVEcmFnU3RhcnQsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uTm9kZURyYWdTdG9wJywgb25Ob2RlRHJhZ1N0b3AsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uU2VsZWN0aW9uRHJhZycsIG9uU2VsZWN0aW9uRHJhZywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25TZWxlY3Rpb25EcmFnU3RhcnQnLCBvblNlbGVjdGlvbkRyYWdTdGFydCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignb25TZWxlY3Rpb25EcmFnU3RvcCcsIG9uU2VsZWN0aW9uRHJhZ1N0b3AsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ25vUGFuQ2xhc3NOYW1lJywgbm9QYW5DbGFzc05hbWUsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ25vZGVPcmlnaW4nLCBub2RlT3JpZ2luLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdyZklkJywgcmZJZCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignYXV0b1Bhbk9uQ29ubmVjdCcsIGF1dG9QYW5PbkNvbm5lY3QsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ2F1dG9QYW5Pbk5vZGVEcmFnJywgYXV0b1Bhbk9uTm9kZURyYWcsIHN0b3JlLnNldFN0YXRlKTtcbiAgICB1c2VEaXJlY3RTdG9yZVVwZGF0ZXIoJ29uRXJyb3InLCBvbkVycm9yLCBzdG9yZS5zZXRTdGF0ZSk7XG4gICAgdXNlRGlyZWN0U3RvcmVVcGRhdGVyKCdjb25uZWN0aW9uUmFkaXVzJywgY29ubmVjdGlvblJhZGl1cywgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignaXNWYWxpZENvbm5lY3Rpb24nLCBpc1ZhbGlkQ29ubmVjdGlvbiwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZURpcmVjdFN0b3JlVXBkYXRlcignbm9kZURyYWdUaHJlc2hvbGQnLCBub2RlRHJhZ1RocmVzaG9sZCwgc3RvcmUuc2V0U3RhdGUpO1xuICAgIHVzZVN0b3JlVXBkYXRlcihub2Rlcywgc2V0Tm9kZXMpO1xuICAgIHVzZVN0b3JlVXBkYXRlcihlZGdlcywgc2V0RWRnZXMpO1xuICAgIHVzZVN0b3JlVXBkYXRlcihtaW5ab29tLCBzZXRNaW5ab29tKTtcbiAgICB1c2VTdG9yZVVwZGF0ZXIobWF4Wm9vbSwgc2V0TWF4Wm9vbSk7XG4gICAgdXNlU3RvcmVVcGRhdGVyKHRyYW5zbGF0ZUV4dGVudCwgc2V0VHJhbnNsYXRlRXh0ZW50KTtcbiAgICB1c2VTdG9yZVVwZGF0ZXIobm9kZUV4dGVudCwgc2V0Tm9kZUV4dGVudCk7XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBzdHlsZSA9IHsgZGlzcGxheTogJ25vbmUnIH07XG5jb25zdCBhcmlhTGl2ZVN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdpZHRoOiAxLFxuICAgIGhlaWdodDogMSxcbiAgICBtYXJnaW46IC0xLFxuICAgIGJvcmRlcjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICBjbGlwOiAncmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpJyxcbiAgICBjbGlwUGF0aDogJ2luc2V0KDEwMCUpJyxcbn07XG5jb25zdCBBUklBX05PREVfREVTQ19LRVkgPSAncmVhY3QtZmxvd19fbm9kZS1kZXNjJztcbmNvbnN0IEFSSUFfRURHRV9ERVNDX0tFWSA9ICdyZWFjdC1mbG93X19lZGdlLWRlc2MnO1xuY29uc3QgQVJJQV9MSVZFX01FU1NBR0UgPSAncmVhY3QtZmxvd19fYXJpYS1saXZlJztcbmNvbnN0IHNlbGVjdG9yJGMgPSAocykgPT4gcy5hcmlhTGl2ZU1lc3NhZ2U7XG5mdW5jdGlvbiBBcmlhTGl2ZU1lc3NhZ2UoeyByZklkIH0pIHtcbiAgICBjb25zdCBhcmlhTGl2ZU1lc3NhZ2UgPSB1c2VTdG9yZShzZWxlY3RvciRjKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBpZDogYCR7QVJJQV9MSVZFX01FU1NBR0V9LSR7cmZJZH1gLCBcImFyaWEtbGl2ZVwiOiBcImFzc2VydGl2ZVwiLCBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiLCBzdHlsZTogYXJpYUxpdmVTdHlsZSB9LCBhcmlhTGl2ZU1lc3NhZ2UpKTtcbn1cbmZ1bmN0aW9uIEExMXlEZXNjcmlwdGlvbnMoeyByZklkLCBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0pIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBpZDogYCR7QVJJQV9OT0RFX0RFU0NfS0VZfS0ke3JmSWR9YCwgc3R5bGU6IHN0eWxlIH0sXG4gICAgICAgICAgICBcIlByZXNzIGVudGVyIG9yIHNwYWNlIHRvIHNlbGVjdCBhIG5vZGUuXCIsXG4gICAgICAgICAgICAhZGlzYWJsZUtleWJvYXJkQTExeSAmJiAnWW91IGNhbiB0aGVuIHVzZSB0aGUgYXJyb3cga2V5cyB0byBtb3ZlIHRoZSBub2RlIGFyb3VuZC4nLFxuICAgICAgICAgICAgXCIgUHJlc3MgZGVsZXRlIHRvIHJlbW92ZSBpdCBhbmQgZXNjYXBlIHRvIGNhbmNlbC5cIixcbiAgICAgICAgICAgICcgJyksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBpZDogYCR7QVJJQV9FREdFX0RFU0NfS0VZfS0ke3JmSWR9YCwgc3R5bGU6IHN0eWxlIH0sIFwiUHJlc3MgZW50ZXIgb3Igc3BhY2UgdG8gc2VsZWN0IGFuIGVkZ2UuIFlvdSBjYW4gdGhlbiBwcmVzcyBkZWxldGUgdG8gcmVtb3ZlIGl0IG9yIGVzY2FwZSB0byBjYW5jZWwuXCIpLFxuICAgICAgICAhZGlzYWJsZUtleWJvYXJkQTExeSAmJiBSZWFjdC5jcmVhdGVFbGVtZW50KEFyaWFMaXZlTWVzc2FnZSwgeyByZklkOiByZklkIH0pKSk7XG59XG5cbi8vIHRoZSBrZXljb2RlIGNhbiBiZSBhIHN0cmluZyAnYScgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyBbJ2EnLCAnYStkJ11cbi8vIGEgc3RyaW5nIG1lYW5zIGEgc2luZ2xlIGtleSAnYScgb3IgYSBjb21iaW5hdGlvbiB3aGVuICcrJyBpcyB1c2VkICdhK2QnXG4vLyBhbiBhcnJheSBtZWFucyBkaWZmZXJlbnQgcG9zc2liaWxpdGllcy4gRXhwbGFpbmVyOiBbJ2EnLCAnZCtzJ10gaGVyZSB0aGVcbi8vIHVzZXIgY2FuIHVzZSB0aGUgc2luZ2xlIGtleSAnYScgb3IgdGhlIGNvbWJpbmF0aW9uICdkJyArICdzJ1xudmFyIHVzZUtleVByZXNzID0gKGtleUNvZGUgPSBudWxsLCBvcHRpb25zID0geyBhY3RJbnNpZGVJbnB1dFdpdGhNb2RpZmllcjogdHJ1ZSB9KSA9PiB7XG4gICAgY29uc3QgW2tleVByZXNzZWQsIHNldEtleVByZXNzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIC8vIHdlIG5lZWQgdG8gcmVtZW1iZXIgaWYgYSBtb2RpZmllciBrZXkgaXMgcHJlc3NlZCBpbiBvcmRlciB0byB0cmFjayBpdFxuICAgIGNvbnN0IG1vZGlmaWVyUHJlc3NlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgLy8gd2UgbmVlZCB0byByZW1lbWJlciB0aGUgcHJlc3NlZCBrZXlzIGluIG9yZGVyIHRvIHN1cHBvcnQgY29tYmluYXRpb25zXG4gICAgY29uc3QgcHJlc3NlZEtleXMgPSB1c2VSZWYobmV3IFNldChbXSkpO1xuICAgIC8vIGtleUNvZGVzID0gYXJyYXkgd2l0aCBzaW5nbGUga2V5cyBbWydhJ11dIG9yIGtleSBjb21iaW5hdGlvbnMgW1snYScsICdzJ11dXG4gICAgLy8ga2V5c1RvV2F0Y2ggPSBhcnJheSB3aXRoIGFsbCBrZXlzIGZsYXR0ZW5lZCBbJ2EnLCAnZCcsICdTaGlmdExlZnQnXVxuICAgIC8vIHVzZWQgdG8gY2hlY2sgaWYgd2Ugc3RvcmUgZXZlbnQuY29kZSBvciBldmVudC5rZXkuIFdoZW4gdGhlIGNvZGUgaXMgaW4gdGhlIGxpc3Qgb2Yga2V5c1RvV2F0Y2hcbiAgICAvLyB3ZSB1c2UgdGhlIGNvZGUgb3RoZXJ3aXNlIHRoZSBrZXkuIEV4cGxhaW5lcjogV2hlbiB5b3UgcHJlc3MgdGhlIGxlZnQgXCJjb21tYW5kXCIga2V5LCB0aGUgY29kZSBpcyBcIk1ldGFMZWZ0XCJcbiAgICAvLyBhbmQgdGhlIGtleSBpcyBcIk1ldGFcIi4gV2Ugd2FudCB1c2VycyB0byBiZSBhYmxlIHRvIHBhc3Mga2V5cyBhbmQgY29kZXMgc28gd2UgYXNzdW1lIHRoYXQgdGhlIGtleSBpcyBtZWFudCB3aGVuXG4gICAgLy8gd2UgY2FuJ3QgZmluZCBpdCBpbiB0aGUgbGlzdCBvZiBrZXlzVG9XYXRjaC5cbiAgICBjb25zdCBba2V5Q29kZXMsIGtleXNUb1dhdGNoXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoa2V5Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qga2V5Q29kZUFyciA9IEFycmF5LmlzQXJyYXkoa2V5Q29kZSkgPyBrZXlDb2RlIDogW2tleUNvZGVdO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGtleUNvZGVBcnIuZmlsdGVyKChrYykgPT4gdHlwZW9mIGtjID09PSAnc3RyaW5nJykubWFwKChrYykgPT4ga2Muc3BsaXQoJysnKSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzRmxhdCA9IGtleXMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHJlcy5jb25jYXQoLi4uaXRlbSksIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBba2V5cywga2V5c0ZsYXRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbW10sIFtdXTtcbiAgICB9LCBba2V5Q29kZV0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnM/LnRhcmdldCB8fCBkb2M7XG4gICAgICAgIGlmIChrZXlDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBkb3duSGFuZGxlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIG1vZGlmaWVyUHJlc3NlZC5jdXJyZW50ID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZlbnRBY3Rpb24gPSAoIW1vZGlmaWVyUHJlc3NlZC5jdXJyZW50IHx8IChtb2RpZmllclByZXNzZWQuY3VycmVudCAmJiAhb3B0aW9ucy5hY3RJbnNpZGVJbnB1dFdpdGhNb2RpZmllcikpICYmXG4gICAgICAgICAgICAgICAgICAgIGlzSW5wdXRET01Ob2RlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmVudEFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGtleU9yQ29kZSA9IHVzZUtleU9yQ29kZShldmVudC5jb2RlLCBrZXlzVG9XYXRjaCk7XG4gICAgICAgICAgICAgICAgcHJlc3NlZEtleXMuY3VycmVudC5hZGQoZXZlbnRba2V5T3JDb2RlXSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdLZXkoa2V5Q29kZXMsIHByZXNzZWRLZXlzLmN1cnJlbnQsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXlQcmVzc2VkKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB1cEhhbmRsZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ZW50QWN0aW9uID0gKCFtb2RpZmllclByZXNzZWQuY3VycmVudCB8fCAobW9kaWZpZXJQcmVzc2VkLmN1cnJlbnQgJiYgIW9wdGlvbnMuYWN0SW5zaWRlSW5wdXRXaXRoTW9kaWZpZXIpKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc0lucHV0RE9NTm9kZShldmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZlbnRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBrZXlPckNvZGUgPSB1c2VLZXlPckNvZGUoZXZlbnQuY29kZSwga2V5c1RvV2F0Y2gpO1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoaW5nS2V5KGtleUNvZGVzLCBwcmVzc2VkS2V5cy5jdXJyZW50LCB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXlQcmVzc2VkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleXMuY3VycmVudC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleXMuY3VycmVudC5kZWxldGUoZXZlbnRba2V5T3JDb2RlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZpeCBmb3IgTWFjOiB3aGVuIGNtZCBrZXkgaXMgcHJlc3NlZCwga2V5dXAgaXMgbm90IHRyaWdnZXJlZCBmb3IgYW55IG90aGVyIGtleSwgc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNzM4MDAxOC93aGVuLWNtZC1rZXktaXMta2VwdC1wcmVzc2VkLWtleXVwLWlzLW5vdC10cmlnZ2VyZWQtZm9yLWFueS1vdGhlci1rZXlcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnTWV0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJlc3NlZEtleXMuY3VycmVudC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb2RpZmllclByZXNzZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc2V0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwcmVzc2VkS2V5cy5jdXJyZW50LmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgc2V0S2V5UHJlc3NlZChmYWxzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFyZ2V0Py5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZG93bkhhbmRsZXIpO1xuICAgICAgICAgICAgdGFyZ2V0Py5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwSGFuZGxlcik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHJlc2V0SGFuZGxlcik7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRhcmdldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGRvd25IYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdXBIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHJlc2V0SGFuZGxlcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSwgW2tleUNvZGUsIHNldEtleVByZXNzZWRdKTtcbiAgICByZXR1cm4ga2V5UHJlc3NlZDtcbn07XG4vLyB1dGlsc1xuZnVuY3Rpb24gaXNNYXRjaGluZ0tleShrZXlDb2RlcywgcHJlc3NlZEtleXMsIGlzVXApIHtcbiAgICByZXR1cm4gKGtleUNvZGVzXG4gICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBjb21wYXJlIHNhbWUgc2l6ZXMgb2Yga2V5Q29kZSBkZWZpbml0aW9uc1xuICAgICAgICAvLyBhbmQgcHJlc3NlZCBrZXlzLiBXaGVuIHRoZSB1c2VyIHNwZWNpZmllZCAnTWV0YScgYXMgYSBrZXkgc29tZXdoZXJlXG4gICAgICAgIC8vIHRoaXMgd291bGQgYWxzbyBiZSB0cnV0aHkgd2l0aG91dCB0aGlzIGZpbHRlciB3aGVuIHVzZXIgcHJlc3NlcyAnTWV0YScgKyAncidcbiAgICAgICAgLmZpbHRlcigoa2V5cykgPT4gaXNVcCB8fCBrZXlzLmxlbmd0aCA9PT0gcHJlc3NlZEtleXMuc2l6ZSlcbiAgICAgICAgLy8gc2luY2Ugd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIHBvc3NpYmlsaXRpZXMgb25seSBvbmUgb2YgdGhlXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBuZWVkIHRvIGJlIHBhcnQgb2YgdGhlIHByZXNzZWQga2V5c1xuICAgICAgICAuc29tZSgoa2V5cykgPT4ga2V5cy5ldmVyeSgoaykgPT4gcHJlc3NlZEtleXMuaGFzKGspKSkpO1xufVxuZnVuY3Rpb24gdXNlS2V5T3JDb2RlKGV2ZW50Q29kZSwga2V5c1RvV2F0Y2gpIHtcbiAgICByZXR1cm4ga2V5c1RvV2F0Y2guaW5jbHVkZXMoZXZlbnRDb2RlKSA/ICdjb2RlJyA6ICdrZXknO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVYWVpQb3NpdGlvbihub2RlLCBub2RlSW50ZXJuYWxzLCByZXN1bHQsIG5vZGVPcmlnaW4pIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudElkO1xuICAgIGlmICghcGFyZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KHBhcmVudElkKTtcbiAgICBjb25zdCBwYXJlbnROb2RlUG9zaXRpb24gPSBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luKHBhcmVudE5vZGUsIG5vZGVPcmlnaW4pO1xuICAgIHJldHVybiBjYWxjdWxhdGVYWVpQb3NpdGlvbihwYXJlbnROb2RlLCBub2RlSW50ZXJuYWxzLCB7XG4gICAgICAgIHg6IChyZXN1bHQueCA/PyAwKSArIHBhcmVudE5vZGVQb3NpdGlvbi54LFxuICAgICAgICB5OiAocmVzdWx0LnkgPz8gMCkgKyBwYXJlbnROb2RlUG9zaXRpb24ueSxcbiAgICAgICAgejogKHBhcmVudE5vZGVbaW50ZXJuYWxzU3ltYm9sXT8ueiA/PyAwKSA+IChyZXN1bHQueiA/PyAwKSA/IHBhcmVudE5vZGVbaW50ZXJuYWxzU3ltYm9sXT8ueiA/PyAwIDogcmVzdWx0LnogPz8gMCxcbiAgICB9LCBub2RlT3JpZ2luKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUFic29sdXRlTm9kZVBvc2l0aW9ucyhub2RlSW50ZXJuYWxzLCBub2RlT3JpZ2luLCBwYXJlbnROb2Rlcykge1xuICAgIG5vZGVJbnRlcm5hbHMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudElkO1xuICAgICAgICBpZiAocGFyZW50SWQgJiYgIW5vZGVJbnRlcm5hbHMuaGFzKHBhcmVudElkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJlbnQgbm9kZSAke3BhcmVudElkfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50SWQgfHwgcGFyZW50Tm9kZXM/Lltub2RlLmlkXSkge1xuICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBjYWxjdWxhdGVYWVpQb3NpdGlvbihub2RlLCBub2RlSW50ZXJuYWxzLCB7XG4gICAgICAgICAgICAgICAgLi4ubm9kZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICB6OiBub2RlW2ludGVybmFsc1N5bWJvbF0/LnogPz8gMCxcbiAgICAgICAgICAgIH0sIG5vZGVPcmlnaW4pO1xuICAgICAgICAgICAgbm9kZS5wb3NpdGlvbkFic29sdXRlID0ge1xuICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBub2RlW2ludGVybmFsc1N5bWJvbF0ueiA9IHo7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZXM/Lltub2RlLmlkXSkge1xuICAgICAgICAgICAgICAgIG5vZGVbaW50ZXJuYWxzU3ltYm9sXS5pc1BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVJbnRlcm5hbHMobm9kZXMsIG5vZGVJbnRlcm5hbHMsIG5vZGVPcmlnaW4sIGVsZXZhdGVOb2Rlc09uU2VsZWN0KSB7XG4gICAgY29uc3QgbmV4dE5vZGVJbnRlcm5hbHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcGFyZW50Tm9kZXMgPSB7fTtcbiAgICBjb25zdCBzZWxlY3RlZE5vZGVaID0gZWxldmF0ZU5vZGVzT25TZWxlY3QgPyAxMDAwIDogMDtcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IHogPSAoaXNOdW1lcmljKG5vZGUuekluZGV4KSA/IG5vZGUuekluZGV4IDogMCkgKyAobm9kZS5zZWxlY3RlZCA/IHNlbGVjdGVkTm9kZVogOiAwKTtcbiAgICAgICAgY29uc3QgY3VyckludGVybmFscyA9IG5vZGVJbnRlcm5hbHMuZ2V0KG5vZGUuaWQpO1xuICAgICAgICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcG9zaXRpb25BYnNvbHV0ZToge1xuICAgICAgICAgICAgICAgIHg6IG5vZGUucG9zaXRpb24ueCxcbiAgICAgICAgICAgICAgICB5OiBub2RlLnBvc2l0aW9uLnksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudElkO1xuICAgICAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgICAgIHBhcmVudE5vZGVzW3BhcmVudElkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzZXRIYW5kbGVCb3VuZHMgPSBjdXJySW50ZXJuYWxzPy50eXBlICYmIGN1cnJJbnRlcm5hbHM/LnR5cGUgIT09IG5vZGUudHlwZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGludGVybmFscywgaW50ZXJuYWxzU3ltYm9sLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQm91bmRzOiByZXNldEhhbmRsZUJvdW5kcyA/IHVuZGVmaW5lZCA6IGN1cnJJbnRlcm5hbHM/LltpbnRlcm5hbHNTeW1ib2xdPy5oYW5kbGVCb3VuZHMsXG4gICAgICAgICAgICAgICAgeixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBuZXh0Tm9kZUludGVybmFscy5zZXQobm9kZS5pZCwgaW50ZXJuYWxzKTtcbiAgICB9KTtcbiAgICB1cGRhdGVBYnNvbHV0ZU5vZGVQb3NpdGlvbnMobmV4dE5vZGVJbnRlcm5hbHMsIG5vZGVPcmlnaW4sIHBhcmVudE5vZGVzKTtcbiAgICByZXR1cm4gbmV4dE5vZGVJbnRlcm5hbHM7XG59XG5mdW5jdGlvbiBmaXRWaWV3KGdldCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBnZXROb2Rlcywgd2lkdGgsIGhlaWdodCwgbWluWm9vbSwgbWF4Wm9vbSwgZDNab29tLCBkM1NlbGVjdGlvbiwgZml0Vmlld09uSW5pdERvbmUsIGZpdFZpZXdPbkluaXQsIG5vZGVPcmlnaW4sIH0gPSBnZXQoKTtcbiAgICBjb25zdCBpc0luaXRpYWxGaXRWaWV3ID0gb3B0aW9ucy5pbml0aWFsICYmICFmaXRWaWV3T25Jbml0RG9uZSAmJiBmaXRWaWV3T25Jbml0O1xuICAgIGNvbnN0IGQzaW5pdGlhbGl6ZWQgPSBkM1pvb20gJiYgZDNTZWxlY3Rpb247XG4gICAgaWYgKGQzaW5pdGlhbGl6ZWQgJiYgKGlzSW5pdGlhbEZpdFZpZXcgfHwgIW9wdGlvbnMuaW5pdGlhbCkpIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBnZXROb2RlcygpLmZpbHRlcigobikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gb3B0aW9ucy5pbmNsdWRlSGlkZGVuTm9kZXMgPyBuLndpZHRoICYmIG4uaGVpZ2h0IDogIW4uaGlkZGVuO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGUgJiYgb3B0aW9ucy5ub2Rlcy5zb21lKChvcHRpb25Ob2RlKSA9PiBvcHRpb25Ob2RlLmlkID09PSBuLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGU7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBub2Rlc0luaXRpYWxpemVkID0gbm9kZXMuZXZlcnkoKG4pID0+IG4ud2lkdGggJiYgbi5oZWlnaHQpO1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCAmJiBub2Rlc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBnZXROb2Rlc0JvdW5kcyhub2Rlcywgbm9kZU9yaWdpbik7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHksIHpvb20gfSA9IGdldFZpZXdwb3J0Rm9yQm91bmRzKGJvdW5kcywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucy5taW5ab29tID8/IG1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSA/PyBtYXhab29tLCBvcHRpb25zLnBhZGRpbmcgPz8gMC4xKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUcmFuc2Zvcm0gPSB6b29tSWRlbnRpdHkudHJhbnNsYXRlKHgsIHkpLnNjYWxlKHpvb20pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmR1cmF0aW9uID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLmR1cmF0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIGQzWm9vbS50cmFuc2Zvcm0oZ2V0RDNUcmFuc2l0aW9uKGQzU2VsZWN0aW9uLCBvcHRpb25zLmR1cmF0aW9uKSwgbmV4dFRyYW5zZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkM1pvb20udHJhbnNmb3JtKGQzU2VsZWN0aW9uLCBuZXh0VHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWROb2RlU2VsZWN0aW9uQ2hhbmdlKG5vZGVDaGFuZ2VzLCBub2RlSW50ZXJuYWxzKSB7XG4gICAgbm9kZUNoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChjaGFuZ2UuaWQpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbm9kZUludGVybmFscy5zZXQobm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAgICAgW2ludGVybmFsc1N5bWJvbF06IG5vZGVbaW50ZXJuYWxzU3ltYm9sXSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogY2hhbmdlLnNlbGVjdGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IE1hcChub2RlSW50ZXJuYWxzKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRFZGdlU2VsZWN0aW9uQ2hhbmdlKGVkZ2VDaGFuZ2VzLCBlZGdlcykge1xuICAgIHJldHVybiBlZGdlcy5tYXAoKGUpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gZWRnZUNoYW5nZXMuZmluZCgoY2hhbmdlKSA9PiBjaGFuZ2UuaWQgPT09IGUuaWQpO1xuICAgICAgICBpZiAoY2hhbmdlKSB7XG4gICAgICAgICAgICBlLnNlbGVjdGVkID0gY2hhbmdlLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlTm9kZXNBbmRFZGdlc1NlbGVjdGlvbnMoeyBjaGFuZ2VkTm9kZXMsIGNoYW5nZWRFZGdlcywgZ2V0LCBzZXQgfSkge1xuICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgZWRnZXMsIG9uTm9kZXNDaGFuZ2UsIG9uRWRnZXNDaGFuZ2UsIGhhc0RlZmF1bHROb2RlcywgaGFzRGVmYXVsdEVkZ2VzIH0gPSBnZXQoKTtcbiAgICBpZiAoY2hhbmdlZE5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHROb2Rlcykge1xuICAgICAgICAgICAgc2V0KHsgbm9kZUludGVybmFsczogaGFuZGxlQ29udHJvbGxlZE5vZGVTZWxlY3Rpb25DaGFuZ2UoY2hhbmdlZE5vZGVzLCBub2RlSW50ZXJuYWxzKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbk5vZGVzQ2hhbmdlPy4oY2hhbmdlZE5vZGVzKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZWRFZGdlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMpIHtcbiAgICAgICAgICAgIHNldCh7IGVkZ2VzOiBoYW5kbGVDb250cm9sbGVkRWRnZVNlbGVjdGlvbkNoYW5nZShjaGFuZ2VkRWRnZXMsIGVkZ2VzKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkVkZ2VzQ2hhbmdlPy4oY2hhbmdlZEVkZ2VzKTtcbiAgICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5jb25zdCBpbml0aWFsVmlld3BvcnRIZWxwZXIgPSB7XG4gICAgem9vbUluOiBub29wLFxuICAgIHpvb21PdXQ6IG5vb3AsXG4gICAgem9vbVRvOiBub29wLFxuICAgIGdldFpvb206ICgpID0+IDEsXG4gICAgc2V0Vmlld3BvcnQ6IG5vb3AsXG4gICAgZ2V0Vmlld3BvcnQ6ICgpID0+ICh7IHg6IDAsIHk6IDAsIHpvb206IDEgfSksXG4gICAgZml0VmlldzogKCkgPT4gZmFsc2UsXG4gICAgc2V0Q2VudGVyOiBub29wLFxuICAgIGZpdEJvdW5kczogbm9vcCxcbiAgICBwcm9qZWN0OiAocG9zaXRpb24pID0+IHBvc2l0aW9uLFxuICAgIHNjcmVlblRvRmxvd1Bvc2l0aW9uOiAocG9zaXRpb24pID0+IHBvc2l0aW9uLFxuICAgIGZsb3dUb1NjcmVlblBvc2l0aW9uOiAocG9zaXRpb24pID0+IHBvc2l0aW9uLFxuICAgIHZpZXdwb3J0SW5pdGlhbGl6ZWQ6IGZhbHNlLFxufTtcbmNvbnN0IHNlbGVjdG9yJGIgPSAocykgPT4gKHtcbiAgICBkM1pvb206IHMuZDNab29tLFxuICAgIGQzU2VsZWN0aW9uOiBzLmQzU2VsZWN0aW9uLFxufSk7XG5jb25zdCB1c2VWaWV3cG9ydEhlbHBlciA9ICgpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgeyBkM1pvb20sIGQzU2VsZWN0aW9uIH0gPSB1c2VTdG9yZShzZWxlY3RvciRiLCBzaGFsbG93KTtcbiAgICBjb25zdCB2aWV3cG9ydEhlbHBlckZ1bmN0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBpZiAoZDNTZWxlY3Rpb24gJiYgZDNab29tKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHpvb21JbjogKG9wdGlvbnMpID0+IGQzWm9vbS5zY2FsZUJ5KGdldEQzVHJhbnNpdGlvbihkM1NlbGVjdGlvbiwgb3B0aW9ucz8uZHVyYXRpb24pLCAxLjIpLFxuICAgICAgICAgICAgICAgIHpvb21PdXQ6IChvcHRpb25zKSA9PiBkM1pvb20uc2NhbGVCeShnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgMSAvIDEuMiksXG4gICAgICAgICAgICAgICAgem9vbVRvOiAoem9vbUxldmVsLCBvcHRpb25zKSA9PiBkM1pvb20uc2NhbGVUbyhnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgem9vbUxldmVsKSxcbiAgICAgICAgICAgICAgICBnZXRab29tOiAoKSA9PiBzdG9yZS5nZXRTdGF0ZSgpLnRyYW5zZm9ybVsyXSxcbiAgICAgICAgICAgICAgICBzZXRWaWV3cG9ydDogKHRyYW5zZm9ybSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgem9vbV0gPSBzdG9yZS5nZXRTdGF0ZSgpLnRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFRyYW5zZm9ybSA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zbGF0ZSh0cmFuc2Zvcm0ueCA/PyB4LCB0cmFuc2Zvcm0ueSA/PyB5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNjYWxlKHRyYW5zZm9ybS56b29tID8/IHpvb20pO1xuICAgICAgICAgICAgICAgICAgICBkM1pvb20udHJhbnNmb3JtKGdldEQzVHJhbnNpdGlvbihkM1NlbGVjdGlvbiwgb3B0aW9ucz8uZHVyYXRpb24pLCBuZXh0VHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFZpZXdwb3J0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFt4LCB5LCB6b29tXSA9IHN0b3JlLmdldFN0YXRlKCkudHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4LCB5LCB6b29tIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmaXRWaWV3OiAob3B0aW9ucykgPT4gZml0VmlldyhzdG9yZS5nZXRTdGF0ZSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgc2V0Q2VudGVyOiAoeCwgeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIG1heFpvb20gfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRab29tID0gdHlwZW9mIG9wdGlvbnM/Lnpvb20gIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy56b29tIDogbWF4Wm9vbTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWCA9IHdpZHRoIC8gMiAtIHggKiBuZXh0Wm9vbTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWSA9IGhlaWdodCAvIDIgLSB5ICogbmV4dFpvb207XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHpvb21JZGVudGl0eS50cmFuc2xhdGUoY2VudGVyWCwgY2VudGVyWSkuc2NhbGUobmV4dFpvb20pO1xuICAgICAgICAgICAgICAgICAgICBkM1pvb20udHJhbnNmb3JtKGdldEQzVHJhbnNpdGlvbihkM1NlbGVjdGlvbiwgb3B0aW9ucz8uZHVyYXRpb24pLCB0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZml0Qm91bmRzOiAoYm91bmRzLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgbWluWm9vbSwgbWF4Wm9vbSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCB6b29tIH0gPSBnZXRWaWV3cG9ydEZvckJvdW5kcyhib3VuZHMsIHdpZHRoLCBoZWlnaHQsIG1pblpvb20sIG1heFpvb20sIG9wdGlvbnM/LnBhZGRpbmcgPz8gMC4xKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gem9vbUlkZW50aXR5LnRyYW5zbGF0ZSh4LCB5KS5zY2FsZSh6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgZDNab29tLnRyYW5zZm9ybShnZXREM1RyYW5zaXRpb24oZDNTZWxlY3Rpb24sIG9wdGlvbnM/LmR1cmF0aW9uKSwgdHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIEBkZXByZWNhdGVkIFVzZSBgc2NyZWVuVG9GbG93UG9zaXRpb25gLlxuICAgICAgICAgICAgICAgIHByb2plY3Q6IChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybSwgc25hcFRvR3JpZCwgc25hcEdyaWQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignW0RFUFJFQ0FURURdIGBwcm9qZWN0YCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBgc2NyZWVuVG9GbG93UG9zaXRpb25gLiBUaGVyZSBpcyBubyBuZWVkIHRvIHN1YnRyYWN0IHRoZSByZWFjdCBmbG93IGJvdW5kcyBhbnltb3JlISBodHRwczovL3JlYWN0Zmxvdy5kZXYvYXBpLXJlZmVyZW5jZS90eXBlcy9yZWFjdC1mbG93LWluc3RhbmNlI3NjcmVlbi10by1mbG93LXBvc2l0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb2ludFRvUmVuZGVyZXJQb2ludChwb3NpdGlvbiwgdHJhbnNmb3JtLCBzbmFwVG9HcmlkLCBzbmFwR3JpZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JlZW5Ub0Zsb3dQb3NpdGlvbjogKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNmb3JtLCBzbmFwVG9HcmlkLCBzbmFwR3JpZCwgZG9tTm9kZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4OiBkb21YLCB5OiBkb21ZIH0gPSBkb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogcG9zaXRpb24ueCAtIGRvbVgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBwb3NpdGlvbi55IC0gZG9tWSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50VG9SZW5kZXJlclBvaW50KHJlbGF0aXZlUG9zaXRpb24sIHRyYW5zZm9ybSwgc25hcFRvR3JpZCwgc25hcEdyaWQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmxvd1RvU2NyZWVuUG9zaXRpb246IChwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRyYW5zZm9ybSwgZG9tTm9kZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkb21Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4OiBkb21YLCB5OiBkb21ZIH0gPSBkb21Ob2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlclBvc2l0aW9uID0gcmVuZGVyZXJQb2ludFRvUG9pbnQocG9zaXRpb24sIHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiByZW5kZXJlclBvc2l0aW9uLnggKyBkb21YLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogcmVuZGVyZXJQb3NpdGlvbi55ICsgZG9tWSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0SW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbml0aWFsVmlld3BvcnRIZWxwZXI7XG4gICAgfSwgW2QzWm9vbSwgZDNTZWxlY3Rpb25dKTtcbiAgICByZXR1cm4gdmlld3BvcnRIZWxwZXJGdW5jdGlvbnM7XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZnVuY3Rpb24gdXNlUmVhY3RGbG93KCkge1xuICAgIGNvbnN0IHZpZXdwb3J0SGVscGVyID0gdXNlVmlld3BvcnRIZWxwZXIoKTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgZ2V0Tm9kZXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHJldHVybiBzdG9yZVxuICAgICAgICAgICAgLmdldFN0YXRlKClcbiAgICAgICAgICAgIC5nZXROb2RlcygpXG4gICAgICAgICAgICAubWFwKChuKSA9PiAoeyAuLi5uIH0pKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgZ2V0Tm9kZSA9IHVzZUNhbGxiYWNrKChpZCkgPT4ge1xuICAgICAgICByZXR1cm4gc3RvcmUuZ2V0U3RhdGUoKS5ub2RlSW50ZXJuYWxzLmdldChpZCk7XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGdldEVkZ2VzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVkZ2VzID0gW10gfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBlZGdlcy5tYXAoKGUpID0+ICh7IC4uLmUgfSkpO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBnZXRFZGdlID0gdXNlQ2FsbGJhY2soKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZWRnZXMgPSBbXSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgcmV0dXJuIGVkZ2VzLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3Qgc2V0Tm9kZXMgPSB1c2VDYWxsYmFjaygocGF5bG9hZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGdldE5vZGVzLCBzZXROb2RlcywgaGFzRGVmYXVsdE5vZGVzLCBvbk5vZGVzQ2hhbmdlIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBub2RlcyA9IGdldE5vZGVzKCk7XG4gICAgICAgIGNvbnN0IG5leHROb2RlcyA9IHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nID8gcGF5bG9hZChub2RlcykgOiBwYXlsb2FkO1xuICAgICAgICBpZiAoaGFzRGVmYXVsdE5vZGVzKSB7XG4gICAgICAgICAgICBzZXROb2RlcyhuZXh0Tm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9uTm9kZXNDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBuZXh0Tm9kZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBub2Rlcy5tYXAoKG5vZGUpID0+ICh7IHR5cGU6ICdyZW1vdmUnLCBpZDogbm9kZS5pZCB9KSlcbiAgICAgICAgICAgICAgICA6IG5leHROb2Rlcy5tYXAoKG5vZGUpID0+ICh7IGl0ZW06IG5vZGUsIHR5cGU6ICdyZXNldCcgfSkpO1xuICAgICAgICAgICAgb25Ob2Rlc0NoYW5nZShjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICBjb25zdCBzZXRFZGdlcyA9IHVzZUNhbGxiYWNrKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZWRnZXMgPSBbXSwgc2V0RWRnZXMsIGhhc0RlZmF1bHRFZGdlcywgb25FZGdlc0NoYW5nZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgbmV4dEVkZ2VzID0gdHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicgPyBwYXlsb2FkKGVkZ2VzKSA6IHBheWxvYWQ7XG4gICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMpIHtcbiAgICAgICAgICAgIHNldEVkZ2VzKG5leHRFZGdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob25FZGdlc0NoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5leHRFZGdlcy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IGVkZ2VzLm1hcCgoZWRnZSkgPT4gKHsgdHlwZTogJ3JlbW92ZScsIGlkOiBlZGdlLmlkIH0pKVxuICAgICAgICAgICAgICAgIDogbmV4dEVkZ2VzLm1hcCgoZWRnZSkgPT4gKHsgaXRlbTogZWRnZSwgdHlwZTogJ3Jlc2V0JyB9KSk7XG4gICAgICAgICAgICBvbkVkZ2VzQ2hhbmdlKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGFkZE5vZGVzID0gdXNlQ2FsbGJhY2soKHBheWxvYWQpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXTtcbiAgICAgICAgY29uc3QgeyBnZXROb2Rlcywgc2V0Tm9kZXMsIGhhc0RlZmF1bHROb2Rlcywgb25Ob2Rlc0NoYW5nZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgaWYgKGhhc0RlZmF1bHROb2Rlcykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVzID0gZ2V0Tm9kZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHROb2RlcyA9IFsuLi5jdXJyZW50Tm9kZXMsIC4uLm5vZGVzXTtcbiAgICAgICAgICAgIHNldE5vZGVzKG5leHROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob25Ob2Rlc0NoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5vZGVzLm1hcCgobm9kZSkgPT4gKHsgaXRlbTogbm9kZSwgdHlwZTogJ2FkZCcgfSkpO1xuICAgICAgICAgICAgb25Ob2Rlc0NoYW5nZShjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICBjb25zdCBhZGRFZGdlcyA9IHVzZUNhbGxiYWNrKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRFZGdlcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdO1xuICAgICAgICBjb25zdCB7IGVkZ2VzID0gW10sIHNldEVkZ2VzLCBoYXNEZWZhdWx0RWRnZXMsIG9uRWRnZXNDaGFuZ2UgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMpIHtcbiAgICAgICAgICAgIHNldEVkZ2VzKFsuLi5lZGdlcywgLi4ubmV4dEVkZ2VzXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob25FZGdlc0NoYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5leHRFZGdlcy5tYXAoKGVkZ2UpID0+ICh7IGl0ZW06IGVkZ2UsIHR5cGU6ICdhZGQnIH0pKTtcbiAgICAgICAgICAgIG9uRWRnZXNDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9LCBbXSk7XG4gICAgY29uc3QgdG9PYmplY3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ2V0Tm9kZXMsIGVkZ2VzID0gW10sIHRyYW5zZm9ybSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3QgW3gsIHksIHpvb21dID0gdHJhbnNmb3JtO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZXM6IGdldE5vZGVzKCkubWFwKChuKSA9PiAoeyAuLi5uIH0pKSxcbiAgICAgICAgICAgIGVkZ2VzOiBlZGdlcy5tYXAoKGUpID0+ICh7IC4uLmUgfSkpLFxuICAgICAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgIHksXG4gICAgICAgICAgICAgICAgem9vbSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGRlbGV0ZUVsZW1lbnRzID0gdXNlQ2FsbGJhY2soKHsgbm9kZXM6IG5vZGVzRGVsZXRlZCwgZWRnZXM6IGVkZ2VzRGVsZXRlZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgZ2V0Tm9kZXMsIGVkZ2VzLCBoYXNEZWZhdWx0Tm9kZXMsIGhhc0RlZmF1bHRFZGdlcywgb25Ob2Rlc0RlbGV0ZSwgb25FZGdlc0RlbGV0ZSwgb25Ob2Rlc0NoYW5nZSwgb25FZGdlc0NoYW5nZSwgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5vZGVJZHMgPSAobm9kZXNEZWxldGVkIHx8IFtdKS5tYXAoKG5vZGUpID0+IG5vZGUuaWQpO1xuICAgICAgICBjb25zdCBlZGdlSWRzID0gKGVkZ2VzRGVsZXRlZCB8fCBbXSkubWFwKChlZGdlKSA9PiBlZGdlLmlkKTtcbiAgICAgICAgY29uc3Qgbm9kZXNUb1JlbW92ZSA9IGdldE5vZGVzKCkucmVkdWNlKChyZXMsIG5vZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50SWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIaXQgPSAhbm9kZUlkcy5pbmNsdWRlcyhub2RlLmlkKSAmJiBwYXJlbnRJZCAmJiByZXMuZmluZCgobikgPT4gbi5pZCA9PT0gcGFyZW50SWQpO1xuICAgICAgICAgICAgY29uc3QgZGVsZXRhYmxlID0gdHlwZW9mIG5vZGUuZGVsZXRhYmxlID09PSAnYm9vbGVhbicgPyBub2RlLmRlbGV0YWJsZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAoZGVsZXRhYmxlICYmIChub2RlSWRzLmluY2x1ZGVzKG5vZGUuaWQpIHx8IHBhcmVudEhpdCkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sIFtdKTtcbiAgICAgICAgY29uc3QgZGVsZXRhYmxlRWRnZXMgPSBlZGdlcy5maWx0ZXIoKGUpID0+ICh0eXBlb2YgZS5kZWxldGFibGUgPT09ICdib29sZWFuJyA/IGUuZGVsZXRhYmxlIDogdHJ1ZSkpO1xuICAgICAgICBjb25zdCBpbml0aWFsSGl0RWRnZXMgPSBkZWxldGFibGVFZGdlcy5maWx0ZXIoKGUpID0+IGVkZ2VJZHMuaW5jbHVkZXMoZS5pZCkpO1xuICAgICAgICBpZiAobm9kZXNUb1JlbW92ZSB8fCBpbml0aWFsSGl0RWRnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3RlZEVkZ2VzID0gZ2V0Q29ubmVjdGVkRWRnZXMobm9kZXNUb1JlbW92ZSwgZGVsZXRhYmxlRWRnZXMpO1xuICAgICAgICAgICAgY29uc3QgZWRnZXNUb1JlbW92ZSA9IFsuLi5pbml0aWFsSGl0RWRnZXMsIC4uLmNvbm5lY3RlZEVkZ2VzXTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VJZHNUb1JlbW92ZSA9IGVkZ2VzVG9SZW1vdmUucmVkdWNlKChyZXMsIGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcy5pbmNsdWRlcyhlZGdlLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlZGdlLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0RWRnZXMgfHwgaGFzRGVmYXVsdE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHRFZGdlcykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGdlczogZWRnZXMuZmlsdGVyKChlKSA9PiAhZWRnZUlkc1RvUmVtb3ZlLmluY2x1ZGVzKGUuaWQpKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0Tm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1JlbW92ZS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLmRlbGV0ZShub2RlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJbnRlcm5hbHM6IG5ldyBNYXAobm9kZUludGVybmFscyksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlZGdlSWRzVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG9uRWRnZXNEZWxldGU/LihlZGdlc1RvUmVtb3ZlKTtcbiAgICAgICAgICAgICAgICBpZiAob25FZGdlc0NoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVkZ2VzQ2hhbmdlKGVkZ2VJZHNUb1JlbW92ZS5tYXAoKGlkKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZXNUb1JlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgb25Ob2Rlc0RlbGV0ZT8uKG5vZGVzVG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgIGlmIChvbk5vZGVzQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVDaGFuZ2VzID0gbm9kZXNUb1JlbW92ZS5tYXAoKG4pID0+ICh7IGlkOiBuLmlkLCB0eXBlOiAncmVtb3ZlJyB9KSk7XG4gICAgICAgICAgICAgICAgICAgIG9uTm9kZXNDaGFuZ2Uobm9kZUNoYW5nZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICBjb25zdCBnZXROb2RlUmVjdCA9IHVzZUNhbGxiYWNrKChub2RlT3JSZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzUmVjdCA9IGlzUmVjdE9iamVjdChub2RlT3JSZWN0KTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGlzUmVjdCA/IG51bGwgOiBzdG9yZS5nZXRTdGF0ZSgpLm5vZGVJbnRlcm5hbHMuZ2V0KG5vZGVPclJlY3QuaWQpO1xuICAgICAgICBpZiAoIWlzUmVjdCAmJiAhbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBpc1JlY3RdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVSZWN0ID0gaXNSZWN0ID8gbm9kZU9yUmVjdCA6IG5vZGVUb1JlY3Qobm9kZSk7XG4gICAgICAgIHJldHVybiBbbm9kZVJlY3QsIG5vZGUsIGlzUmVjdF07XG4gICAgfSwgW10pO1xuICAgIGNvbnN0IGdldEludGVyc2VjdGluZ05vZGVzID0gdXNlQ2FsbGJhY2soKG5vZGVPclJlY3QsIHBhcnRpYWxseSA9IHRydWUsIG5vZGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IFtub2RlUmVjdCwgbm9kZSwgaXNSZWN0XSA9IGdldE5vZGVSZWN0KG5vZGVPclJlY3QpO1xuICAgICAgICBpZiAoIW5vZGVSZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChub2RlcyB8fCBzdG9yZS5nZXRTdGF0ZSgpLmdldE5vZGVzKCkpLmZpbHRlcigobikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1JlY3QgJiYgKG4uaWQgPT09IG5vZGUuaWQgfHwgIW4ucG9zaXRpb25BYnNvbHV0ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXJyTm9kZVJlY3QgPSBub2RlVG9SZWN0KG4pO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdBcmVhID0gZ2V0T3ZlcmxhcHBpbmdBcmVhKGN1cnJOb2RlUmVjdCwgbm9kZVJlY3QpO1xuICAgICAgICAgICAgY29uc3QgcGFydGlhbGx5VmlzaWJsZSA9IHBhcnRpYWxseSAmJiBvdmVybGFwcGluZ0FyZWEgPiAwO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWxseVZpc2libGUgfHwgb3ZlcmxhcHBpbmdBcmVhID49IG5vZGVSZWN0LndpZHRoICogbm9kZVJlY3QuaGVpZ2h0O1xuICAgICAgICB9KTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgaXNOb2RlSW50ZXJzZWN0aW5nID0gdXNlQ2FsbGJhY2soKG5vZGVPclJlY3QsIGFyZWEsIHBhcnRpYWxseSA9IHRydWUpID0+IHtcbiAgICAgICAgY29uc3QgW25vZGVSZWN0XSA9IGdldE5vZGVSZWN0KG5vZGVPclJlY3QpO1xuICAgICAgICBpZiAoIW5vZGVSZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdBcmVhID0gZ2V0T3ZlcmxhcHBpbmdBcmVhKG5vZGVSZWN0LCBhcmVhKTtcbiAgICAgICAgY29uc3QgcGFydGlhbGx5VmlzaWJsZSA9IHBhcnRpYWxseSAmJiBvdmVybGFwcGluZ0FyZWEgPiAwO1xuICAgICAgICByZXR1cm4gcGFydGlhbGx5VmlzaWJsZSB8fCBvdmVybGFwcGluZ0FyZWEgPj0gbm9kZVJlY3Qud2lkdGggKiBub2RlUmVjdC5oZWlnaHQ7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnZpZXdwb3J0SGVscGVyLFxuICAgICAgICAgICAgZ2V0Tm9kZXMsXG4gICAgICAgICAgICBnZXROb2RlLFxuICAgICAgICAgICAgZ2V0RWRnZXMsXG4gICAgICAgICAgICBnZXRFZGdlLFxuICAgICAgICAgICAgc2V0Tm9kZXMsXG4gICAgICAgICAgICBzZXRFZGdlcyxcbiAgICAgICAgICAgIGFkZE5vZGVzLFxuICAgICAgICAgICAgYWRkRWRnZXMsXG4gICAgICAgICAgICB0b09iamVjdCxcbiAgICAgICAgICAgIGRlbGV0ZUVsZW1lbnRzLFxuICAgICAgICAgICAgZ2V0SW50ZXJzZWN0aW5nTm9kZXMsXG4gICAgICAgICAgICBpc05vZGVJbnRlcnNlY3RpbmcsXG4gICAgICAgIH07XG4gICAgfSwgW1xuICAgICAgICB2aWV3cG9ydEhlbHBlcixcbiAgICAgICAgZ2V0Tm9kZXMsXG4gICAgICAgIGdldE5vZGUsXG4gICAgICAgIGdldEVkZ2VzLFxuICAgICAgICBnZXRFZGdlLFxuICAgICAgICBzZXROb2RlcyxcbiAgICAgICAgc2V0RWRnZXMsXG4gICAgICAgIGFkZE5vZGVzLFxuICAgICAgICBhZGRFZGdlcyxcbiAgICAgICAgdG9PYmplY3QsXG4gICAgICAgIGRlbGV0ZUVsZW1lbnRzLFxuICAgICAgICBnZXRJbnRlcnNlY3RpbmdOb2RlcyxcbiAgICAgICAgaXNOb2RlSW50ZXJzZWN0aW5nLFxuICAgIF0pO1xufVxuXG5jb25zdCBkZWxldGVLZXlPcHRpb25zID0geyBhY3RJbnNpZGVJbnB1dFdpdGhNb2RpZmllcjogZmFsc2UgfTtcbnZhciB1c2VHbG9iYWxLZXlIYW5kbGVyID0gKHsgZGVsZXRlS2V5Q29kZSwgbXVsdGlTZWxlY3Rpb25LZXlDb2RlIH0pID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgeyBkZWxldGVFbGVtZW50cyB9ID0gdXNlUmVhY3RGbG93KCk7XG4gICAgY29uc3QgZGVsZXRlS2V5UHJlc3NlZCA9IHVzZUtleVByZXNzKGRlbGV0ZUtleUNvZGUsIGRlbGV0ZUtleU9wdGlvbnMpO1xuICAgIGNvbnN0IG11bHRpU2VsZWN0aW9uS2V5UHJlc3NlZCA9IHVzZUtleVByZXNzKG11bHRpU2VsZWN0aW9uS2V5Q29kZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGRlbGV0ZUtleVByZXNzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZWRnZXMsIGdldE5vZGVzIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGdldE5vZGVzKCkuZmlsdGVyKChub2RlKSA9PiBub2RlLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWRnZXMgPSBlZGdlcy5maWx0ZXIoKGVkZ2UpID0+IGVkZ2Uuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgZGVsZXRlRWxlbWVudHMoeyBub2Rlczogc2VsZWN0ZWROb2RlcywgZWRnZXM6IHNlbGVjdGVkRWRnZXMgfSk7XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IG5vZGVzU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtkZWxldGVLZXlQcmVzc2VkXSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBtdWx0aVNlbGVjdGlvbkFjdGl2ZTogbXVsdGlTZWxlY3Rpb25LZXlQcmVzc2VkIH0pO1xuICAgIH0sIFttdWx0aVNlbGVjdGlvbktleVByZXNzZWRdKTtcbn07XG5cbmZ1bmN0aW9uIHVzZVJlc2l6ZUhhbmRsZXIocmVuZGVyZXJOb2RlKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGxldCByZXNpemVPYnNlcnZlcjtcbiAgICAgICAgY29uc3QgdXBkYXRlRGltZW5zaW9ucyA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghcmVuZGVyZXJOb2RlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaXplID0gZ2V0RGltZW5zaW9ucyhyZW5kZXJlck5vZGUuY3VycmVudCk7XG4gICAgICAgICAgICBpZiAoc2l6ZS5oZWlnaHQgPT09IDAgfHwgc2l6ZS53aWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmdldFN0YXRlKCkub25FcnJvcj8uKCcwMDQnLCBlcnJvck1lc3NhZ2VzWydlcnJvcjAwNCddKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB3aWR0aDogc2l6ZS53aWR0aCB8fCA1MDAsIGhlaWdodDogc2l6ZS5oZWlnaHQgfHwgNTAwIH0pO1xuICAgICAgICB9O1xuICAgICAgICB1cGRhdGVEaW1lbnNpb25zKCk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVEaW1lbnNpb25zKTtcbiAgICAgICAgaWYgKHJlbmRlcmVyTm9kZS5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB1cGRhdGVEaW1lbnNpb25zKCkpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShyZW5kZXJlck5vZGUuY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVEaW1lbnNpb25zKTtcbiAgICAgICAgICAgIGlmIChyZXNpemVPYnNlcnZlciAmJiByZW5kZXJlck5vZGUuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShyZW5kZXJlck5vZGUuY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xufVxuXG5jb25zdCBjb250YWluZXJTdHlsZSA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGhlaWdodDogJzEwMCUnLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxufTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG5jb25zdCB2aWV3Q2hhbmdlZCA9IChwcmV2Vmlld3BvcnQsIGV2ZW50VHJhbnNmb3JtKSA9PiBwcmV2Vmlld3BvcnQueCAhPT0gZXZlbnRUcmFuc2Zvcm0ueCB8fCBwcmV2Vmlld3BvcnQueSAhPT0gZXZlbnRUcmFuc2Zvcm0ueSB8fCBwcmV2Vmlld3BvcnQuem9vbSAhPT0gZXZlbnRUcmFuc2Zvcm0uaztcbmNvbnN0IGV2ZW50VG9GbG93VHJhbnNmb3JtID0gKGV2ZW50VHJhbnNmb3JtKSA9PiAoe1xuICAgIHg6IGV2ZW50VHJhbnNmb3JtLngsXG4gICAgeTogZXZlbnRUcmFuc2Zvcm0ueSxcbiAgICB6b29tOiBldmVudFRyYW5zZm9ybS5rLFxufSk7XG5jb25zdCBpc1dyYXBwZWRXaXRoQ2xhc3MgPSAoZXZlbnQsIGNsYXNzTmFtZSkgPT4gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke2NsYXNzTmFtZX1gKTtcbmNvbnN0IGlzUmlnaHRDbGlja1BhbiA9IChwYW5PbkRyYWcsIHVzZWRCdXR0b24pID0+IHVzZWRCdXR0b24gPT09IDIgJiYgQXJyYXkuaXNBcnJheShwYW5PbkRyYWcpICYmIHBhbk9uRHJhZy5pbmNsdWRlcygyKTtcbmNvbnN0IHdoZWVsRGVsdGEgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBmYWN0b3IgPSBldmVudC5jdHJsS2V5ICYmIGlzTWFjT3MoKSA/IDEwIDogMTtcbiAgICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKSAqIGZhY3Rvcjtcbn07XG5jb25zdCBzZWxlY3RvciRhID0gKHMpID0+ICh7XG4gICAgZDNab29tOiBzLmQzWm9vbSxcbiAgICBkM1NlbGVjdGlvbjogcy5kM1NlbGVjdGlvbixcbiAgICBkM1pvb21IYW5kbGVyOiBzLmQzWm9vbUhhbmRsZXIsXG4gICAgdXNlclNlbGVjdGlvbkFjdGl2ZTogcy51c2VyU2VsZWN0aW9uQWN0aXZlLFxufSk7XG5jb25zdCBab29tUGFuZSA9ICh7IG9uTW92ZSwgb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZCwgb25QYW5lQ29udGV4dE1lbnUsIHpvb21PblNjcm9sbCA9IHRydWUsIHpvb21PblBpbmNoID0gdHJ1ZSwgcGFuT25TY3JvbGwgPSBmYWxzZSwgcGFuT25TY3JvbGxTcGVlZCA9IDAuNSwgcGFuT25TY3JvbGxNb2RlID0gUGFuT25TY3JvbGxNb2RlLkZyZWUsIHpvb21PbkRvdWJsZUNsaWNrID0gdHJ1ZSwgZWxlbWVudHNTZWxlY3RhYmxlLCBwYW5PbkRyYWcgPSB0cnVlLCBkZWZhdWx0Vmlld3BvcnQsIHRyYW5zbGF0ZUV4dGVudCwgbWluWm9vbSwgbWF4Wm9vbSwgem9vbUFjdGl2YXRpb25LZXlDb2RlLCBwcmV2ZW50U2Nyb2xsaW5nID0gdHJ1ZSwgY2hpbGRyZW4sIG5vV2hlZWxDbGFzc05hbWUsIG5vUGFuQ2xhc3NOYW1lLCB9KSA9PiB7XG4gICAgY29uc3QgdGltZXJJZCA9IHVzZVJlZigpO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCBpc1pvb21pbmdPclBhbm5pbmcgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHpvb21lZFdpdGhSaWdodE1vdXNlQnV0dG9uID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCB6b29tUGFuZSA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBwcmV2VHJhbnNmb3JtID0gdXNlUmVmKHsgeDogMCwgeTogMCwgem9vbTogMCB9KTtcbiAgICBjb25zdCB7IGQzWm9vbSwgZDNTZWxlY3Rpb24sIGQzWm9vbUhhbmRsZXIsIHVzZXJTZWxlY3Rpb25BY3RpdmUgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJGEsIHNoYWxsb3cpO1xuICAgIGNvbnN0IHpvb21BY3RpdmF0aW9uS2V5UHJlc3NlZCA9IHVzZUtleVByZXNzKHpvb21BY3RpdmF0aW9uS2V5Q29kZSk7XG4gICAgY29uc3QgbW91c2VCdXR0b24gPSB1c2VSZWYoMCk7XG4gICAgY29uc3QgaXNQYW5TY3JvbGxpbmcgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHBhblNjcm9sbFRpbWVvdXQgPSB1c2VSZWYoKTtcbiAgICB1c2VSZXNpemVIYW5kbGVyKHpvb21QYW5lKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoem9vbVBhbmUuY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3QgYmJveCA9IHpvb21QYW5lLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBkM1pvb21JbnN0YW5jZSA9IHpvb20oKS5zY2FsZUV4dGVudChbbWluWm9vbSwgbWF4Wm9vbV0pLnRyYW5zbGF0ZUV4dGVudCh0cmFuc2xhdGVFeHRlbnQpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0KHpvb21QYW5lLmN1cnJlbnQpLmNhbGwoZDNab29tSW5zdGFuY2UpO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZFRyYW5zZm9ybSA9IHpvb21JZGVudGl0eVxuICAgICAgICAgICAgICAgIC50cmFuc2xhdGUoZGVmYXVsdFZpZXdwb3J0LngsIGRlZmF1bHRWaWV3cG9ydC55KVxuICAgICAgICAgICAgICAgIC5zY2FsZShjbGFtcChkZWZhdWx0Vmlld3BvcnQuem9vbSwgbWluWm9vbSwgbWF4Wm9vbSkpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZW50ID0gW1xuICAgICAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgICAgICBbYmJveC53aWR0aCwgYmJveC5oZWlnaHRdLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbmVkVHJhbnNmb3JtID0gZDNab29tSW5zdGFuY2UuY29uc3RyYWluKCkodXBkYXRlZFRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgICAgICAgICAgZDNab29tSW5zdGFuY2UudHJhbnNmb3JtKHNlbGVjdGlvbiwgY29uc3RyYWluZWRUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgZDNab29tSW5zdGFuY2Uud2hlZWxEZWx0YSh3aGVlbERlbHRhKTtcbiAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBkM1pvb206IGQzWm9vbUluc3RhbmNlLFxuICAgICAgICAgICAgICAgIGQzU2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgZDNab29tSGFuZGxlcjogc2VsZWN0aW9uLm9uKCd3aGVlbC56b29tJyksXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBwYXNzIHRyYW5zZm9ybSBiZWNhdXNlIHpvb20gaGFuZGxlciBpcyBub3QgcmVnaXN0ZXJlZCB3aGVuIHdlIHNldCB0aGUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFtjb25zdHJhaW5lZFRyYW5zZm9ybS54LCBjb25zdHJhaW5lZFRyYW5zZm9ybS55LCBjb25zdHJhaW5lZFRyYW5zZm9ybS5rXSxcbiAgICAgICAgICAgICAgICBkb21Ob2RlOiB6b29tUGFuZS5jdXJyZW50LmNsb3Nlc3QoJy5yZWFjdC1mbG93JyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZDNTZWxlY3Rpb24gJiYgZDNab29tKSB7XG4gICAgICAgICAgICBpZiAocGFuT25TY3JvbGwgJiYgIXpvb21BY3RpdmF0aW9uS2V5UHJlc3NlZCAmJiAhdXNlclNlbGVjdGlvbkFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGQzU2VsZWN0aW9uLm9uKCd3aGVlbC56b29tJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1dyYXBwZWRXaXRoQ2xhc3MoZXZlbnQsIG5vV2hlZWxDbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRab29tID0gZDNTZWxlY3Rpb24ucHJvcGVydHkoJ19fem9vbScpLmsgfHwgMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFjb3MgYW5kIHdpbiBzZXQgY3RybEtleT10cnVlIGZvciBwaW5jaCBnZXN0dXJlIG9uIGEgdHJhY2twYWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgem9vbU9uUGluY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRlcihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaW5jaERlbHRhID0gd2hlZWxEZWx0YShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6b29tID0gY3VycmVudFpvb20gKiBNYXRoLnBvdygyLCBwaW5jaERlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGQzWm9vbS5zY2FsZVRvKGQzU2VsZWN0aW9uLCB6b29tLCBwb2ludCwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHNjcm9sbCBzcGVlZCBpbiBmaXJlZm94XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpcmVmb3g6IGRlbHRhTW9kZSA9PT0gMTsgY2hyb21lOiBkZWx0YU1vZGUgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFOb3JtYWxpemUgPSBldmVudC5kZWx0YU1vZGUgPT09IDEgPyAyMCA6IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWx0YVggPSBwYW5PblNjcm9sbE1vZGUgPT09IFBhbk9uU2Nyb2xsTW9kZS5WZXJ0aWNhbCA/IDAgOiBldmVudC5kZWx0YVggKiBkZWx0YU5vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlbHRhWSA9IHBhbk9uU2Nyb2xsTW9kZSA9PT0gUGFuT25TY3JvbGxNb2RlLkhvcml6b250YWwgPyAwIDogZXZlbnQuZGVsdGFZICogZGVsdGFOb3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZW5hYmxlcyB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2l0aCBzaGlmdCArIHNjcm9sbCBvbiB3aW5kb3dzXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNNYWNPcygpICYmIGV2ZW50LnNoaWZ0S2V5ICYmIHBhbk9uU2Nyb2xsTW9kZSAhPT0gUGFuT25TY3JvbGxNb2RlLlZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSBldmVudC5kZWx0YVkgKiBkZWx0YU5vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZDNab29tLnRyYW5zbGF0ZUJ5KGQzU2VsZWN0aW9uLCAtKGRlbHRhWCAvIGN1cnJlbnRab29tKSAqIHBhbk9uU2Nyb2xsU3BlZWQsIC0oZGVsdGFZIC8gY3VycmVudFpvb20pICogcGFuT25TY3JvbGxTcGVlZCwgXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcm5hbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFZpZXdwb3J0ID0gZXZlbnRUb0Zsb3dUcmFuc2Zvcm0oZDNTZWxlY3Rpb24ucHJvcGVydHkoJ19fem9vbScpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvblZpZXdwb3J0Q2hhbmdlU3RhcnQsIG9uVmlld3BvcnRDaGFuZ2UsIG9uVmlld3BvcnRDaGFuZ2VFbmQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChwYW5TY3JvbGxUaW1lb3V0LmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGFuIG9uIHNjcm9sbCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgZXZlbnQgY2FsbHMgb24gb3VyIG93blxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgdGhlIHN0YXJ0LCB6b29tIGFuZCBlbmQgZXZlbnRzIGZyb20gZDMtem9vbVxuICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHN0YXJ0IGFuZCBtb3ZlIGdldHMgY2FsbGVkIG9uIGV2ZXJ5IHNjcm9sbCBldmVudCBhbmQgbm90IG9uY2UgYXQgdGhlIGJlZ2lubmluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGFuU2Nyb2xsaW5nLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuU2Nyb2xsaW5nLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25Nb3ZlU3RhcnQ/LihldmVudCwgbmV4dFZpZXdwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmlld3BvcnRDaGFuZ2VTdGFydD8uKG5leHRWaWV3cG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFuU2Nyb2xsaW5nLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW92ZT8uKGV2ZW50LCBuZXh0Vmlld3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25WaWV3cG9ydENoYW5nZT8uKG5leHRWaWV3cG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5TY3JvbGxUaW1lb3V0LmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vdmVFbmQ/LihldmVudCwgbmV4dFZpZXdwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZpZXdwb3J0Q2hhbmdlRW5kPy4obmV4dFZpZXdwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BhblNjcm9sbGluZy5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAxNTApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkM1pvb21IYW5kbGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGQzU2VsZWN0aW9uLm9uKCd3aGVlbC56b29tJywgZnVuY3Rpb24gKGV2ZW50LCBkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHN0aWxsIHdhbnQgdG8gZW5hYmxlIHBpbmNoIHpvb21pbmcgZXZlbiBpZiBwcmV2ZW50U2Nyb2xsaW5nIGlzIHNldCB0byBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkRXZlbnQgPSAhcHJldmVudFNjcm9sbGluZyAmJiBldmVudC50eXBlID09PSAnd2hlZWwnICYmICFldmVudC5jdHJsS2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZEV2ZW50IHx8IGlzV3JhcHBlZFdpdGhDbGFzcyhldmVudCwgbm9XaGVlbENsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGQzWm9vbUhhbmRsZXIuY2FsbCh0aGlzLCBldmVudCwgZCk7XG4gICAgICAgICAgICAgICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgdXNlclNlbGVjdGlvbkFjdGl2ZSxcbiAgICAgICAgcGFuT25TY3JvbGwsXG4gICAgICAgIHBhbk9uU2Nyb2xsTW9kZSxcbiAgICAgICAgZDNTZWxlY3Rpb24sXG4gICAgICAgIGQzWm9vbSxcbiAgICAgICAgZDNab29tSGFuZGxlcixcbiAgICAgICAgem9vbUFjdGl2YXRpb25LZXlQcmVzc2VkLFxuICAgICAgICB6b29tT25QaW5jaCxcbiAgICAgICAgcHJldmVudFNjcm9sbGluZyxcbiAgICAgICAgbm9XaGVlbENsYXNzTmFtZSxcbiAgICAgICAgb25Nb3ZlU3RhcnQsXG4gICAgICAgIG9uTW92ZSxcbiAgICAgICAgb25Nb3ZlRW5kLFxuICAgIF0pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChkM1pvb20pIHtcbiAgICAgICAgICAgIGQzWm9vbS5vbignc3RhcnQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnNvdXJjZUV2ZW50IHx8IGV2ZW50LnNvdXJjZUV2ZW50LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIGl0IGhlcmUsIGJlY2F1c2UgaXQncyBhbHdheXMgMCBpbiB0aGUgXCJ6b29tXCIgZXZlbnRcbiAgICAgICAgICAgICAgICBtb3VzZUJ1dHRvbi5jdXJyZW50ID0gZXZlbnQuc291cmNlRXZlbnQ/LmJ1dHRvbjtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG9uVmlld3BvcnRDaGFuZ2VTdGFydCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbG93VHJhbnNmb3JtID0gZXZlbnRUb0Zsb3dUcmFuc2Zvcm0oZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICBpc1pvb21pbmdPclBhbm5pbmcuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcHJldlRyYW5zZm9ybS5jdXJyZW50ID0gZmxvd1RyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlRXZlbnQ/LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnNldFN0YXRlKHsgcGFuZURyYWdnaW5nOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvblZpZXdwb3J0Q2hhbmdlU3RhcnQ/LihmbG93VHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICBvbk1vdmVTdGFydD8uKGV2ZW50LnNvdXJjZUV2ZW50LCBmbG93VHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSwgW2QzWm9vbSwgb25Nb3ZlU3RhcnRdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoZDNab29tKSB7XG4gICAgICAgICAgICBpZiAodXNlclNlbGVjdGlvbkFjdGl2ZSAmJiAhaXNab29taW5nT3JQYW5uaW5nLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBkM1pvb20ub24oJ3pvb20nLCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF1c2VyU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgZDNab29tLm9uKCd6b29tJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgb25WaWV3cG9ydENoYW5nZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyB0cmFuc2Zvcm06IFtldmVudC50cmFuc2Zvcm0ueCwgZXZlbnQudHJhbnNmb3JtLnksIGV2ZW50LnRyYW5zZm9ybS5rXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgem9vbWVkV2l0aFJpZ2h0TW91c2VCdXR0b24uY3VycmVudCA9ICEhKG9uUGFuZUNvbnRleHRNZW51ICYmIGlzUmlnaHRDbGlja1BhbihwYW5PbkRyYWcsIG1vdXNlQnV0dG9uLmN1cnJlbnQgPz8gMCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKG9uTW92ZSB8fCBvblZpZXdwb3J0Q2hhbmdlKSAmJiAhZXZlbnQuc291cmNlRXZlbnQ/LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93VHJhbnNmb3JtID0gZXZlbnRUb0Zsb3dUcmFuc2Zvcm0oZXZlbnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmlld3BvcnRDaGFuZ2U/LihmbG93VHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW92ZT8uKGV2ZW50LnNvdXJjZUV2ZW50LCBmbG93VHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgW3VzZXJTZWxlY3Rpb25BY3RpdmUsIGQzWm9vbSwgb25Nb3ZlLCBwYW5PbkRyYWcsIG9uUGFuZUNvbnRleHRNZW51XSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGQzWm9vbSkge1xuICAgICAgICAgICAgZDNab29tLm9uKCdlbmQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnNvdXJjZUV2ZW50IHx8IGV2ZW50LnNvdXJjZUV2ZW50LmludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IG9uVmlld3BvcnRDaGFuZ2VFbmQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgaXNab29taW5nT3JQYW5uaW5nLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IHBhbmVEcmFnZ2luZzogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9uUGFuZUNvbnRleHRNZW51ICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUmlnaHRDbGlja1BhbihwYW5PbkRyYWcsIG1vdXNlQnV0dG9uLmN1cnJlbnQgPz8gMCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXpvb21lZFdpdGhSaWdodE1vdXNlQnV0dG9uLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb25QYW5lQ29udGV4dE1lbnUoZXZlbnQuc291cmNlRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB6b29tZWRXaXRoUmlnaHRNb3VzZUJ1dHRvbi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKChvbk1vdmVFbmQgfHwgb25WaWV3cG9ydENoYW5nZUVuZCkgJiYgdmlld0NoYW5nZWQocHJldlRyYW5zZm9ybS5jdXJyZW50LCBldmVudC50cmFuc2Zvcm0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3dUcmFuc2Zvcm0gPSBldmVudFRvRmxvd1RyYW5zZm9ybShldmVudC50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VHJhbnNmb3JtLmN1cnJlbnQgPSBmbG93VHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZC5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGltZXJJZC5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZpZXdwb3J0Q2hhbmdlRW5kPy4oZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdmVFbmQ/LihldmVudC5zb3VyY2VFdmVudCwgZmxvd1RyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHBhbk9uU2Nyb2xsID8gMTUwIDogMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbZDNab29tLCBwYW5PblNjcm9sbCwgcGFuT25EcmFnLCBvbk1vdmVFbmQsIG9uUGFuZUNvbnRleHRNZW51XSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGQzWm9vbSkge1xuICAgICAgICAgICAgZDNab29tLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tU2Nyb2xsID0gem9vbUFjdGl2YXRpb25LZXlQcmVzc2VkIHx8IHpvb21PblNjcm9sbDtcbiAgICAgICAgICAgICAgICBjb25zdCBwaW5jaFpvb20gPSB6b29tT25QaW5jaCAmJiBldmVudC5jdHJsS2V5O1xuICAgICAgICAgICAgICAgIGlmICgocGFuT25EcmFnID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KHBhbk9uRHJhZykgJiYgcGFuT25EcmFnLmluY2x1ZGVzKDEpKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuYnV0dG9uID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1dyYXBwZWRXaXRoQ2xhc3MoZXZlbnQsICdyZWFjdC1mbG93X19ub2RlJykgfHwgaXNXcmFwcGVkV2l0aENsYXNzKGV2ZW50LCAncmVhY3QtZmxvd19fZWRnZScpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgYWxsIGludGVyYWN0aW9ucyBhcmUgZGlzYWJsZWQsIHdlIHByZXZlbnQgYWxsIHpvb20gZXZlbnRzXG4gICAgICAgICAgICAgICAgaWYgKCFwYW5PbkRyYWcgJiYgIXpvb21TY3JvbGwgJiYgIXBhbk9uU2Nyb2xsICYmICF6b29tT25Eb3VibGVDbGljayAmJiAhem9vbU9uUGluY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkdXJpbmcgYSBzZWxlY3Rpb24gd2UgcHJldmVudCBhbGwgb3RoZXIgaW50ZXJhY3Rpb25zXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJTZWxlY3Rpb25BY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB6b29tIG9uIGRvdWJsZSBjbGljayBpcyBkaXNhYmxlZCwgd2UgcHJldmVudCB0aGUgZG91YmxlIGNsaWNrIGV2ZW50XG4gICAgICAgICAgICAgICAgaWYgKCF6b29tT25Eb3VibGVDbGljayAmJiBldmVudC50eXBlID09PSAnZGJsY2xpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggdGhlIG5vd2hlZWwgY2xhc3MsIHdlIHByZXZlbnQgem9vbWluZ1xuICAgICAgICAgICAgICAgIGlmIChpc1dyYXBwZWRXaXRoQ2xhc3MoZXZlbnQsIG5vV2hlZWxDbGFzc05hbWUpICYmIGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgbm9wYW4gY2xhc3MsIHdlIHByZXZlbnQgcGFubmluZ1xuICAgICAgICAgICAgICAgIGlmIChpc1dyYXBwZWRXaXRoQ2xhc3MoZXZlbnQsIG5vUGFuQ2xhc3NOYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAoZXZlbnQudHlwZSAhPT0gJ3doZWVsJyB8fCAocGFuT25TY3JvbGwgJiYgZXZlbnQudHlwZSA9PT0gJ3doZWVsJyAmJiAhem9vbUFjdGl2YXRpb25LZXlQcmVzc2VkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXpvb21PblBpbmNoICYmIGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQudHlwZSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgbm8gc2Nyb2xsIGhhbmRsaW5nIGVuYWJsZWQsIHdlIHByZXZlbnQgYWxsIHdoZWVsIGV2ZW50c1xuICAgICAgICAgICAgICAgIGlmICghem9vbVNjcm9sbCAmJiAhcGFuT25TY3JvbGwgJiYgIXBpbmNoWm9vbSAmJiBldmVudC50eXBlID09PSAnd2hlZWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhbmUgaXMgbm90IG1vdmFibGUsIHdlIHByZXZlbnQgZHJhZ2dpbmcgaXQgd2l0aCBtb3VzZXN0YXJ0IG9yIHRvdWNoc3RhcnRcbiAgICAgICAgICAgICAgICBpZiAoIXBhbk9uRHJhZyAmJiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYW5lIGlzIG9ubHkgbW92YWJsZSB1c2luZyBhbGxvd2VkIGNsaWNrc1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhbk9uRHJhZykgJiYgIXBhbk9uRHJhZy5pbmNsdWRlcyhldmVudC5idXR0b24pICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyByaWdodCBjbGlja3MgaWYgcGFuIG9uIGRyYWcgaXMgc2V0IHRvIHJpZ2h0IGNsaWNrXG4gICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uQWxsb3dlZCA9IChBcnJheS5pc0FycmF5KHBhbk9uRHJhZykgJiYgcGFuT25EcmFnLmluY2x1ZGVzKGV2ZW50LmJ1dHRvbikpIHx8ICFldmVudC5idXR0b24gfHwgZXZlbnQuYnV0dG9uIDw9IDE7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBmaWx0ZXIgZm9yIGQzLXpvb21cbiAgICAgICAgICAgICAgICByZXR1cm4gKCFldmVudC5jdHJsS2V5IHx8IGV2ZW50LnR5cGUgPT09ICd3aGVlbCcpICYmIGJ1dHRvbkFsbG93ZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgdXNlclNlbGVjdGlvbkFjdGl2ZSxcbiAgICAgICAgZDNab29tLFxuICAgICAgICB6b29tT25TY3JvbGwsXG4gICAgICAgIHpvb21PblBpbmNoLFxuICAgICAgICBwYW5PblNjcm9sbCxcbiAgICAgICAgem9vbU9uRG91YmxlQ2xpY2ssXG4gICAgICAgIHBhbk9uRHJhZyxcbiAgICAgICAgZWxlbWVudHNTZWxlY3RhYmxlLFxuICAgICAgICB6b29tQWN0aXZhdGlvbktleVByZXNzZWQsXG4gICAgXSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX3JlbmRlcmVyXCIsIHJlZjogem9vbVBhbmUsIHN0eWxlOiBjb250YWluZXJTdHlsZSB9LCBjaGlsZHJlbikpO1xufTtcblxuY29uc3Qgc2VsZWN0b3IkOSA9IChzKSA9PiAoe1xuICAgIHVzZXJTZWxlY3Rpb25BY3RpdmU6IHMudXNlclNlbGVjdGlvbkFjdGl2ZSxcbiAgICB1c2VyU2VsZWN0aW9uUmVjdDogcy51c2VyU2VsZWN0aW9uUmVjdCxcbn0pO1xuZnVuY3Rpb24gVXNlclNlbGVjdGlvbigpIHtcbiAgICBjb25zdCB7IHVzZXJTZWxlY3Rpb25BY3RpdmUsIHVzZXJTZWxlY3Rpb25SZWN0IH0gPSB1c2VTdG9yZShzZWxlY3RvciQ5LCBzaGFsbG93KTtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHVzZXJTZWxlY3Rpb25BY3RpdmUgJiYgdXNlclNlbGVjdGlvblJlY3Q7XG4gICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX3NlbGVjdGlvbiByZWFjdC1mbG93X19jb250YWluZXJcIiwgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiB1c2VyU2VsZWN0aW9uUmVjdC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogdXNlclNlbGVjdGlvblJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7dXNlclNlbGVjdGlvblJlY3QueH1weCwgJHt1c2VyU2VsZWN0aW9uUmVjdC55fXB4KWAsXG4gICAgICAgIH0gfSkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXJlbnRFeHBhbmQocmVzLCB1cGRhdGVJdGVtKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSB1cGRhdGVJdGVtLnBhcmVudE5vZGUgfHwgdXBkYXRlSXRlbS5wYXJlbnRJZDtcbiAgICBjb25zdCBwYXJlbnQgPSByZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gcGFyZW50SWQpO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5kV2lkdGggPSB1cGRhdGVJdGVtLnBvc2l0aW9uLnggKyB1cGRhdGVJdGVtLndpZHRoIC0gcGFyZW50LndpZHRoO1xuICAgICAgICBjb25zdCBleHRlbmRIZWlnaHQgPSB1cGRhdGVJdGVtLnBvc2l0aW9uLnkgKyB1cGRhdGVJdGVtLmhlaWdodCAtIHBhcmVudC5oZWlnaHQ7XG4gICAgICAgIGlmIChleHRlbmRXaWR0aCA+IDAgfHwgZXh0ZW5kSGVpZ2h0ID4gMCB8fCB1cGRhdGVJdGVtLnBvc2l0aW9uLnggPCAwIHx8IHVwZGF0ZUl0ZW0ucG9zaXRpb24ueSA8IDApIHtcbiAgICAgICAgICAgIHBhcmVudC5zdHlsZSA9IHsgLi4ucGFyZW50LnN0eWxlIH0gfHwge307XG4gICAgICAgICAgICBwYXJlbnQuc3R5bGUud2lkdGggPSBwYXJlbnQuc3R5bGUud2lkdGggPz8gcGFyZW50LndpZHRoO1xuICAgICAgICAgICAgcGFyZW50LnN0eWxlLmhlaWdodCA9IHBhcmVudC5zdHlsZS5oZWlnaHQgPz8gcGFyZW50LmhlaWdodDtcbiAgICAgICAgICAgIGlmIChleHRlbmRXaWR0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc3R5bGUud2lkdGggKz0gZXh0ZW5kV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXh0ZW5kSGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5zdHlsZS5oZWlnaHQgKz0gZXh0ZW5kSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZUl0ZW0ucG9zaXRpb24ueCA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4RGlmZiA9IE1hdGguYWJzKHVwZGF0ZUl0ZW0ucG9zaXRpb24ueCk7XG4gICAgICAgICAgICAgICAgcGFyZW50LnBvc2l0aW9uLnggPSBwYXJlbnQucG9zaXRpb24ueCAtIHhEaWZmO1xuICAgICAgICAgICAgICAgIHBhcmVudC5zdHlsZS53aWR0aCArPSB4RGlmZjtcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLnBvc2l0aW9uLnggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVwZGF0ZUl0ZW0ucG9zaXRpb24ueSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5RGlmZiA9IE1hdGguYWJzKHVwZGF0ZUl0ZW0ucG9zaXRpb24ueSk7XG4gICAgICAgICAgICAgICAgcGFyZW50LnBvc2l0aW9uLnkgPSBwYXJlbnQucG9zaXRpb24ueSAtIHlEaWZmO1xuICAgICAgICAgICAgICAgIHBhcmVudC5zdHlsZS5oZWlnaHQgKz0geURpZmY7XG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5wb3NpdGlvbi55ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC53aWR0aCA9IHBhcmVudC5zdHlsZS53aWR0aDtcbiAgICAgICAgICAgIHBhcmVudC5oZWlnaHQgPSBwYXJlbnQuc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlDaGFuZ2VzKGNoYW5nZXMsIGVsZW1lbnRzKSB7XG4gICAgLy8gd2UgbmVlZCB0aGlzIGhhY2sgdG8gaGFuZGxlIHRoZSBzZXROb2RlcyBhbmQgc2V0RWRnZXMgZnVuY3Rpb24gb2YgdGhlIHVzZVJlYWN0RmxvdyBob29rIGZvciBjb250cm9sbGVkIGZsb3dzXG4gICAgaWYgKGNoYW5nZXMuc29tZSgoYykgPT4gYy50eXBlID09PSAncmVzZXQnKSkge1xuICAgICAgICByZXR1cm4gY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMudHlwZSA9PT0gJ3Jlc2V0JykubWFwKChjKSA9PiBjLml0ZW0pO1xuICAgIH1cbiAgICBjb25zdCBpbml0RWxlbWVudHMgPSBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy50eXBlID09PSAnYWRkJykubWFwKChjKSA9PiBjLml0ZW0pO1xuICAgIHJldHVybiBlbGVtZW50cy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhbmdlcyA9IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLmlkID09PSBpdGVtLmlkKTtcbiAgICAgICAgaWYgKGN1cnJlbnRDaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZUl0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50Q2hhbmdlIG9mIGN1cnJlbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENoYW5nZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0uc2VsZWN0ZWQgPSBjdXJyZW50Q2hhbmdlLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncG9zaXRpb24nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRDaGFuZ2UucG9zaXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5wb3NpdGlvbiA9IGN1cnJlbnRDaGFuZ2UucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRDaGFuZ2UucG9zaXRpb25BYnNvbHV0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLnBvc2l0aW9uQWJzb2x1dGUgPSBjdXJyZW50Q2hhbmdlLnBvc2l0aW9uQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRDaGFuZ2UuZHJhZ2dpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbS5kcmFnZ2luZyA9IGN1cnJlbnRDaGFuZ2UuZHJhZ2dpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlSXRlbS5leHBhbmRQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXJlbnRFeHBhbmQocmVzLCB1cGRhdGVJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRDaGFuZ2UuZGltZW5zaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLndpZHRoID0gY3VycmVudENoYW5nZS5kaW1lbnNpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0uaGVpZ2h0ID0gY3VycmVudENoYW5nZS5kaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudENoYW5nZS51cGRhdGVTdHlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLnN0eWxlID0geyAuLi4odXBkYXRlSXRlbS5zdHlsZSB8fCB7fSksIC4uLmN1cnJlbnRDaGFuZ2UuZGltZW5zaW9ucyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Q2hhbmdlLnJlc2l6aW5nID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtLnJlc2l6aW5nID0gY3VycmVudENoYW5nZS5yZXNpemluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJdGVtLmV4cGFuZFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhcmVudEV4cGFuZChyZXMsIHVwZGF0ZUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaCh1cGRhdGVJdGVtKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCBpbml0RWxlbWVudHMpO1xufVxuZnVuY3Rpb24gYXBwbHlOb2RlQ2hhbmdlcyhjaGFuZ2VzLCBub2Rlcykge1xuICAgIHJldHVybiBhcHBseUNoYW5nZXMoY2hhbmdlcywgbm9kZXMpO1xufVxuZnVuY3Rpb24gYXBwbHlFZGdlQ2hhbmdlcyhjaGFuZ2VzLCBlZGdlcykge1xuICAgIHJldHVybiBhcHBseUNoYW5nZXMoY2hhbmdlcywgZWRnZXMpO1xufVxuY29uc3QgY3JlYXRlU2VsZWN0aW9uQ2hhbmdlID0gKGlkLCBzZWxlY3RlZCkgPT4gKHtcbiAgICBpZCxcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICBzZWxlY3RlZCxcbn0pO1xuZnVuY3Rpb24gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhpdGVtcywgc2VsZWN0ZWRJZHMpIHtcbiAgICByZXR1cm4gaXRlbXMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3Qgd2lsbEJlU2VsZWN0ZWQgPSBzZWxlY3RlZElkcy5pbmNsdWRlcyhpdGVtLmlkKTtcbiAgICAgICAgaWYgKCFpdGVtLnNlbGVjdGVkICYmIHdpbGxCZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGNyZWF0ZVNlbGVjdGlvbkNoYW5nZShpdGVtLmlkLCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbS5zZWxlY3RlZCAmJiAhd2lsbEJlU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGNyZWF0ZVNlbGVjdGlvbkNoYW5nZShpdGVtLmlkLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfSwgW10pO1xufVxuXG4vKipcbiAqIFRoZSB1c2VyIHNlbGVjdGlvbiByZWN0YW5nbGUgZ2V0cyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgZHJhZ3MgdGhlIG1vdXNlIHdoaWxlIHByZXNzaW5nIHNoaWZ0XG4gKi9cbmNvbnN0IHdyYXBIYW5kbGVyID0gKGhhbmRsZXIsIGNvbnRhaW5lclJlZikgPT4ge1xuICAgIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gY29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVyPy4oZXZlbnQpO1xuICAgIH07XG59O1xuY29uc3Qgc2VsZWN0b3IkOCA9IChzKSA9PiAoe1xuICAgIHVzZXJTZWxlY3Rpb25BY3RpdmU6IHMudXNlclNlbGVjdGlvbkFjdGl2ZSxcbiAgICBlbGVtZW50c1NlbGVjdGFibGU6IHMuZWxlbWVudHNTZWxlY3RhYmxlLFxuICAgIGRyYWdnaW5nOiBzLnBhbmVEcmFnZ2luZyxcbn0pO1xuY29uc3QgUGFuZSA9IG1lbW8oKHsgaXNTZWxlY3RpbmcsIHNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLkZ1bGwsIHBhbk9uRHJhZywgb25TZWxlY3Rpb25TdGFydCwgb25TZWxlY3Rpb25FbmQsIG9uUGFuZUNsaWNrLCBvblBhbmVDb250ZXh0TWVudSwgb25QYW5lU2Nyb2xsLCBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmUsIG9uUGFuZU1vdXNlTGVhdmUsIGNoaWxkcmVuLCB9KSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCBwcmV2U2VsZWN0ZWROb2Rlc0NvdW50ID0gdXNlUmVmKDApO1xuICAgIGNvbnN0IHByZXZTZWxlY3RlZEVkZ2VzQ291bnQgPSB1c2VSZWYoMCk7XG4gICAgY29uc3QgY29udGFpbmVyQm91bmRzID0gdXNlUmVmKCk7XG4gICAgY29uc3QgeyB1c2VyU2VsZWN0aW9uQWN0aXZlLCBlbGVtZW50c1NlbGVjdGFibGUsIGRyYWdnaW5nIH0gPSB1c2VTdG9yZShzZWxlY3RvciQ4LCBzaGFsbG93KTtcbiAgICBjb25zdCByZXNldFVzZXJTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdXNlclNlbGVjdGlvbkFjdGl2ZTogZmFsc2UsIHVzZXJTZWxlY3Rpb25SZWN0OiBudWxsIH0pO1xuICAgICAgICBwcmV2U2VsZWN0ZWROb2Rlc0NvdW50LmN1cnJlbnQgPSAwO1xuICAgICAgICBwcmV2U2VsZWN0ZWRFZGdlc0NvdW50LmN1cnJlbnQgPSAwO1xuICAgIH07XG4gICAgY29uc3Qgb25DbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBvblBhbmVDbGljaz8uKGV2ZW50KTtcbiAgICAgICAgc3RvcmUuZ2V0U3RhdGUoKS5yZXNldFNlbGVjdGVkRWxlbWVudHMoKTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhbk9uRHJhZykgJiYgcGFuT25EcmFnPy5pbmNsdWRlcygyKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvblBhbmVDb250ZXh0TWVudT8uKGV2ZW50KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uV2hlZWwgPSBvblBhbmVTY3JvbGwgPyAoZXZlbnQpID0+IG9uUGFuZVNjcm9sbChldmVudCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXNldFNlbGVjdGVkRWxlbWVudHMsIGRvbU5vZGUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnRhaW5lckJvdW5kcy5jdXJyZW50ID0gZG9tTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghZWxlbWVudHNTZWxlY3RhYmxlIHx8XG4gICAgICAgICAgICAhaXNTZWxlY3RpbmcgfHxcbiAgICAgICAgICAgIGV2ZW50LmJ1dHRvbiAhPT0gMCB8fFxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICE9PSBjb250YWluZXIuY3VycmVudCB8fFxuICAgICAgICAgICAgIWNvbnRhaW5lckJvdW5kcy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LCBjb250YWluZXJCb3VuZHMuY3VycmVudCk7XG4gICAgICAgIHJlc2V0U2VsZWN0ZWRFbGVtZW50cygpO1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB1c2VyU2VsZWN0aW9uUmVjdDoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICBzdGFydFg6IHgsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5LFxuICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBvblNlbGVjdGlvblN0YXJ0Py4oZXZlbnQpO1xuICAgIH07XG4gICAgY29uc3Qgb25Nb3VzZU1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgeyB1c2VyU2VsZWN0aW9uUmVjdCwgbm9kZUludGVybmFscywgZWRnZXMsIHRyYW5zZm9ybSwgb25Ob2Rlc0NoYW5nZSwgb25FZGdlc0NoYW5nZSwgbm9kZU9yaWdpbiwgZ2V0Tm9kZXMgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGlmICghaXNTZWxlY3RpbmcgfHwgIWNvbnRhaW5lckJvdW5kcy5jdXJyZW50IHx8ICF1c2VyU2VsZWN0aW9uUmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgdXNlclNlbGVjdGlvbkFjdGl2ZTogdHJ1ZSwgbm9kZXNTZWxlY3Rpb25BY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgICBjb25zdCBtb3VzZVBvcyA9IGdldEV2ZW50UG9zaXRpb24oZXZlbnQsIGNvbnRhaW5lckJvdW5kcy5jdXJyZW50KTtcbiAgICAgICAgY29uc3Qgc3RhcnRYID0gdXNlclNlbGVjdGlvblJlY3Quc3RhcnRYID8/IDA7XG4gICAgICAgIGNvbnN0IHN0YXJ0WSA9IHVzZXJTZWxlY3Rpb25SZWN0LnN0YXJ0WSA/PyAwO1xuICAgICAgICBjb25zdCBuZXh0VXNlclNlbGVjdFJlY3QgPSB7XG4gICAgICAgICAgICAuLi51c2VyU2VsZWN0aW9uUmVjdCxcbiAgICAgICAgICAgIHg6IG1vdXNlUG9zLnggPCBzdGFydFggPyBtb3VzZVBvcy54IDogc3RhcnRYLFxuICAgICAgICAgICAgeTogbW91c2VQb3MueSA8IHN0YXJ0WSA/IG1vdXNlUG9zLnkgOiBzdGFydFksXG4gICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMobW91c2VQb3MueCAtIHN0YXJ0WCksXG4gICAgICAgICAgICBoZWlnaHQ6IE1hdGguYWJzKG1vdXNlUG9zLnkgLSBzdGFydFkpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBub2RlcyA9IGdldE5vZGVzKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSBnZXROb2Rlc0luc2lkZShub2RlSW50ZXJuYWxzLCBuZXh0VXNlclNlbGVjdFJlY3QsIHRyYW5zZm9ybSwgc2VsZWN0aW9uTW9kZSA9PT0gU2VsZWN0aW9uTW9kZS5QYXJ0aWFsLCB0cnVlLCBub2RlT3JpZ2luKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFZGdlSWRzID0gZ2V0Q29ubmVjdGVkRWRnZXMoc2VsZWN0ZWROb2RlcywgZWRnZXMpLm1hcCgoZSkgPT4gZS5pZCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZUlkcyA9IHNlbGVjdGVkTm9kZXMubWFwKChuKSA9PiBuLmlkKTtcbiAgICAgICAgaWYgKHByZXZTZWxlY3RlZE5vZGVzQ291bnQuY3VycmVudCAhPT0gc2VsZWN0ZWROb2RlSWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcHJldlNlbGVjdGVkTm9kZXNDb3VudC5jdXJyZW50ID0gc2VsZWN0ZWROb2RlSWRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBnZXRTZWxlY3Rpb25DaGFuZ2VzKG5vZGVzLCBzZWxlY3RlZE5vZGVJZHMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb25Ob2Rlc0NoYW5nZT8uKGNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2U2VsZWN0ZWRFZGdlc0NvdW50LmN1cnJlbnQgIT09IHNlbGVjdGVkRWRnZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZXZTZWxlY3RlZEVkZ2VzQ291bnQuY3VycmVudCA9IHNlbGVjdGVkRWRnZUlkcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhlZGdlcywgc2VsZWN0ZWRFZGdlSWRzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG9uRWRnZXNDaGFuZ2U/LihjaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB1c2VyU2VsZWN0aW9uUmVjdDogbmV4dFVzZXJTZWxlY3RSZWN0LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTW91c2VVcCA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB1c2VyU2VsZWN0aW9uUmVjdCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHRyaWdnZXIgY2xpY2sgZnVuY3Rpb25zIHdoZW4gaW4gc2VsZWN0aW9uIG1vZGUgaWZcbiAgICAgICAgLy8gdGhlIHVzZXIgZGlkIG5vdCBtb3ZlIHRoZSBtb3VzZS5cbiAgICAgICAgaWYgKCF1c2VyU2VsZWN0aW9uQWN0aXZlICYmIHVzZXJTZWxlY3Rpb25SZWN0ICYmIGV2ZW50LnRhcmdldCA9PT0gY29udGFpbmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIG9uQ2xpY2s/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogcHJldlNlbGVjdGVkTm9kZXNDb3VudC5jdXJyZW50ID4gMCB9KTtcbiAgICAgICAgcmVzZXRVc2VyU2VsZWN0aW9uKCk7XG4gICAgICAgIG9uU2VsZWN0aW9uRW5kPy4oZXZlbnQpO1xuICAgIH07XG4gICAgY29uc3Qgb25Nb3VzZUxlYXZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh1c2VyU2VsZWN0aW9uQWN0aXZlKSB7XG4gICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IG5vZGVzU2VsZWN0aW9uQWN0aXZlOiBwcmV2U2VsZWN0ZWROb2Rlc0NvdW50LmN1cnJlbnQgPiAwIH0pO1xuICAgICAgICAgICAgb25TZWxlY3Rpb25FbmQ/LihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzZXRVc2VyU2VsZWN0aW9uKCk7XG4gICAgfTtcbiAgICBjb25zdCBoYXNBY3RpdmVTZWxlY3Rpb24gPSBlbGVtZW50c1NlbGVjdGFibGUgJiYgKGlzU2VsZWN0aW5nIHx8IHVzZXJTZWxlY3Rpb25BY3RpdmUpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2MoWydyZWFjdC1mbG93X19wYW5lJywgeyBkcmFnZ2luZywgc2VsZWN0aW9uOiBpc1NlbGVjdGluZyB9XSksIG9uQ2xpY2s6IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IHVuZGVmaW5lZCA6IHdyYXBIYW5kbGVyKG9uQ2xpY2ssIGNvbnRhaW5lciksIG9uQ29udGV4dE1lbnU6IHdyYXBIYW5kbGVyKG9uQ29udGV4dE1lbnUsIGNvbnRhaW5lciksIG9uV2hlZWw6IHdyYXBIYW5kbGVyKG9uV2hlZWwsIGNvbnRhaW5lciksIG9uTW91c2VFbnRlcjogaGFzQWN0aXZlU2VsZWN0aW9uID8gdW5kZWZpbmVkIDogb25QYW5lTW91c2VFbnRlciwgb25Nb3VzZURvd246IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IG9uTW91c2VEb3duIDogdW5kZWZpbmVkLCBvbk1vdXNlTW92ZTogaGFzQWN0aXZlU2VsZWN0aW9uID8gb25Nb3VzZU1vdmUgOiBvblBhbmVNb3VzZU1vdmUsIG9uTW91c2VVcDogaGFzQWN0aXZlU2VsZWN0aW9uID8gb25Nb3VzZVVwIDogdW5kZWZpbmVkLCBvbk1vdXNlTGVhdmU6IGhhc0FjdGl2ZVNlbGVjdGlvbiA/IG9uTW91c2VMZWF2ZSA6IG9uUGFuZU1vdXNlTGVhdmUsIHJlZjogY29udGFpbmVyLCBzdHlsZTogY29udGFpbmVyU3R5bGUgfSxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVXNlclNlbGVjdGlvbiwgbnVsbCkpKTtcbn0pO1xuUGFuZS5kaXNwbGF5TmFtZSA9ICdQYW5lJztcblxuZnVuY3Rpb24gaXNQYXJlbnRTZWxlY3RlZChub2RlLCBub2RlSW50ZXJuYWxzKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSBub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnRJZDtcbiAgICBpZiAoIXBhcmVudElkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KHBhcmVudElkKTtcbiAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocGFyZW50Tm9kZS5zZWxlY3RlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzUGFyZW50U2VsZWN0ZWQocGFyZW50Tm9kZSwgbm9kZUludGVybmFscyk7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rvcih0YXJnZXQsIHNlbGVjdG9yLCBub2RlUmVmKSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAoY3VycmVudD8ubWF0Y2hlcyhzZWxlY3RvcikpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG5vZGVSZWYuY3VycmVudClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9IHdoaWxlIChjdXJyZW50KTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBsb29rcyBmb3IgYWxsIHNlbGVjdGVkIG5vZGVzIGFuZCBjcmVhdGVkIGEgTm9kZURyYWdJdGVtIGZvciBlYWNoIG9mIHRoZW1cbmZ1bmN0aW9uIGdldERyYWdJdGVtcyhub2RlSW50ZXJuYWxzLCBub2Rlc0RyYWdnYWJsZSwgbW91c2VQb3MsIG5vZGVJZCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG5vZGVJbnRlcm5hbHMudmFsdWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKG4pID0+IChuLnNlbGVjdGVkIHx8IG4uaWQgPT09IG5vZGVJZCkgJiZcbiAgICAgICAgKCFuLnBhcmVudE5vZGUgfHwgbi5wYXJlbnRJZCB8fCAhaXNQYXJlbnRTZWxlY3RlZChuLCBub2RlSW50ZXJuYWxzKSkgJiZcbiAgICAgICAgKG4uZHJhZ2dhYmxlIHx8IChub2Rlc0RyYWdnYWJsZSAmJiB0eXBlb2Ygbi5kcmFnZ2FibGUgPT09ICd1bmRlZmluZWQnKSkpXG4gICAgICAgIC5tYXAoKG4pID0+ICh7XG4gICAgICAgIGlkOiBuLmlkLFxuICAgICAgICBwb3NpdGlvbjogbi5wb3NpdGlvbiB8fCB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgcG9zaXRpb25BYnNvbHV0ZTogbi5wb3NpdGlvbkFic29sdXRlIHx8IHsgeDogMCwgeTogMCB9LFxuICAgICAgICBkaXN0YW5jZToge1xuICAgICAgICAgICAgeDogbW91c2VQb3MueCAtIChuLnBvc2l0aW9uQWJzb2x1dGU/LnggPz8gMCksXG4gICAgICAgICAgICB5OiBtb3VzZVBvcy55IC0gKG4ucG9zaXRpb25BYnNvbHV0ZT8ueSA/PyAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGE6IHtcbiAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICB9LFxuICAgICAgICBleHRlbnQ6IG4uZXh0ZW50LFxuICAgICAgICBwYXJlbnROb2RlOiBuLnBhcmVudE5vZGUgfHwgbi5wYXJlbnRJZCxcbiAgICAgICAgcGFyZW50SWQ6IG4ucGFyZW50Tm9kZSB8fCBuLnBhcmVudElkLFxuICAgICAgICB3aWR0aDogbi53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBuLmhlaWdodCxcbiAgICAgICAgZXhwYW5kUGFyZW50OiBuLmV4cGFuZFBhcmVudCxcbiAgICB9KSk7XG59XG5mdW5jdGlvbiBjbGFtcE5vZGVFeHRlbnQobm9kZSwgZXh0ZW50KSB7XG4gICAgaWYgKCFleHRlbnQgfHwgZXh0ZW50ID09PSAncGFyZW50Jykge1xuICAgICAgICByZXR1cm4gZXh0ZW50O1xuICAgIH1cbiAgICByZXR1cm4gW2V4dGVudFswXSwgW2V4dGVudFsxXVswXSAtIChub2RlLndpZHRoIHx8IDApLCBleHRlbnRbMV1bMV0gLSAobm9kZS5oZWlnaHQgfHwgMCldXTtcbn1cbmZ1bmN0aW9uIGNhbGNOZXh0UG9zaXRpb24obm9kZSwgbmV4dFBvc2l0aW9uLCBub2RlSW50ZXJuYWxzLCBub2RlRXh0ZW50LCBub2RlT3JpZ2luID0gWzAsIDBdLCBvbkVycm9yKSB7XG4gICAgY29uc3QgY2xhbXBlZE5vZGVFeHRlbnQgPSBjbGFtcE5vZGVFeHRlbnQobm9kZSwgbm9kZS5leHRlbnQgfHwgbm9kZUV4dGVudCk7XG4gICAgbGV0IGN1cnJlbnRFeHRlbnQgPSBjbGFtcGVkTm9kZUV4dGVudDtcbiAgICBjb25zdCBwYXJlbnRJZCA9IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudElkO1xuICAgIGlmIChub2RlLmV4dGVudCA9PT0gJ3BhcmVudCcgJiYgIW5vZGUuZXhwYW5kUGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnRJZCAmJiBub2RlLndpZHRoICYmIG5vZGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlSW50ZXJuYWxzLmdldChwYXJlbnRJZCk7XG4gICAgICAgICAgICBjb25zdCB7IHg6IHBhcmVudFgsIHk6IHBhcmVudFkgfSA9IGdldE5vZGVQb3NpdGlvbldpdGhPcmlnaW4ocGFyZW50LCBub2RlT3JpZ2luKS5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICAgICAgY3VycmVudEV4dGVudCA9XG4gICAgICAgICAgICAgICAgcGFyZW50ICYmIGlzTnVtZXJpYyhwYXJlbnRYKSAmJiBpc051bWVyaWMocGFyZW50WSkgJiYgaXNOdW1lcmljKHBhcmVudC53aWR0aCkgJiYgaXNOdW1lcmljKHBhcmVudC5oZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmVudFggKyBub2RlLndpZHRoICogbm9kZU9yaWdpblswXSwgcGFyZW50WSArIG5vZGUuaGVpZ2h0ICogbm9kZU9yaWdpblsxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50WCArIHBhcmVudC53aWR0aCAtIG5vZGUud2lkdGggKyBub2RlLndpZHRoICogbm9kZU9yaWdpblswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRZICsgcGFyZW50LmhlaWdodCAtIG5vZGUuaGVpZ2h0ICsgbm9kZS5oZWlnaHQgKiBub2RlT3JpZ2luWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnRFeHRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvbkVycm9yPy4oJzAwNScsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDA1J10oKSk7XG4gICAgICAgICAgICBjdXJyZW50RXh0ZW50ID0gY2xhbXBlZE5vZGVFeHRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobm9kZS5leHRlbnQgJiYgcGFyZW50SWQgJiYgbm9kZS5leHRlbnQgIT09ICdwYXJlbnQnKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGVJbnRlcm5hbHMuZ2V0KHBhcmVudElkKTtcbiAgICAgICAgY29uc3QgeyB4OiBwYXJlbnRYLCB5OiBwYXJlbnRZIH0gPSBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luKHBhcmVudCwgbm9kZU9yaWdpbikucG9zaXRpb25BYnNvbHV0ZTtcbiAgICAgICAgY3VycmVudEV4dGVudCA9IFtcbiAgICAgICAgICAgIFtub2RlLmV4dGVudFswXVswXSArIHBhcmVudFgsIG5vZGUuZXh0ZW50WzBdWzFdICsgcGFyZW50WV0sXG4gICAgICAgICAgICBbbm9kZS5leHRlbnRbMV1bMF0gKyBwYXJlbnRYLCBub2RlLmV4dGVudFsxXVsxXSArIHBhcmVudFldLFxuICAgICAgICBdO1xuICAgIH1cbiAgICBsZXQgcGFyZW50UG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcbiAgICBpZiAocGFyZW50SWQpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KHBhcmVudElkKTtcbiAgICAgICAgcGFyZW50UG9zaXRpb24gPSBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luKHBhcmVudE5vZGUsIG5vZGVPcmlnaW4pLnBvc2l0aW9uQWJzb2x1dGU7XG4gICAgfVxuICAgIGNvbnN0IHBvc2l0aW9uQWJzb2x1dGUgPSBjdXJyZW50RXh0ZW50ICYmIGN1cnJlbnRFeHRlbnQgIT09ICdwYXJlbnQnXG4gICAgICAgID8gY2xhbXBQb3NpdGlvbihuZXh0UG9zaXRpb24sIGN1cnJlbnRFeHRlbnQpXG4gICAgICAgIDogbmV4dFBvc2l0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICB4OiBwb3NpdGlvbkFic29sdXRlLnggLSBwYXJlbnRQb3NpdGlvbi54LFxuICAgICAgICAgICAgeTogcG9zaXRpb25BYnNvbHV0ZS55IC0gcGFyZW50UG9zaXRpb24ueSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9zaXRpb25BYnNvbHV0ZSxcbiAgICB9O1xufVxuLy8gcmV0dXJucyB0d28gcGFyYW1zOlxuLy8gMS4gdGhlIGRyYWdnZWQgbm9kZSAob3IgdGhlIGZpcnN0IG9mIHRoZSBsaXN0LCBpZiB3ZSBhcmUgZHJhZ2dpbmcgYSBub2RlIHNlbGVjdGlvbilcbi8vIDIuIGFycmF5IG9mIHNlbGVjdGVkIG5vZGVzIChmb3IgbXVsdGkgc2VsZWN0aW9ucylcbmZ1bmN0aW9uIGdldEV2ZW50SGFuZGxlclBhcmFtcyh7IG5vZGVJZCwgZHJhZ0l0ZW1zLCBub2RlSW50ZXJuYWxzLCB9KSB7XG4gICAgY29uc3QgZXh0ZW50ZWREcmFnSXRlbXMgPSBkcmFnSXRlbXMubWFwKChuKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2RlSW50ZXJuYWxzLmdldChuLmlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBwb3NpdGlvbjogbi5wb3NpdGlvbixcbiAgICAgICAgICAgIHBvc2l0aW9uQWJzb2x1dGU6IG4ucG9zaXRpb25BYnNvbHV0ZSxcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gW25vZGVJZCA/IGV4dGVudGVkRHJhZ0l0ZW1zLmZpbmQoKG4pID0+IG4uaWQgPT09IG5vZGVJZCkgOiBleHRlbnRlZERyYWdJdGVtc1swXSwgZXh0ZW50ZWREcmFnSXRlbXNdO1xufVxuXG5jb25zdCBnZXRIYW5kbGVCb3VuZHMgPSAoc2VsZWN0b3IsIG5vZGVFbGVtZW50LCB6b29tLCBub2RlT3JpZ2luKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlcyA9IG5vZGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGlmICghaGFuZGxlcyB8fCAhaGFuZGxlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXNBcnJheSA9IEFycmF5LmZyb20oaGFuZGxlcyk7XG4gICAgY29uc3Qgbm9kZUJvdW5kcyA9IG5vZGVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG5vZGVPZmZzZXQgPSB7XG4gICAgICAgIHg6IG5vZGVCb3VuZHMud2lkdGggKiBub2RlT3JpZ2luWzBdLFxuICAgICAgICB5OiBub2RlQm91bmRzLmhlaWdodCAqIG5vZGVPcmlnaW5bMV0sXG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlc0FycmF5Lm1hcCgoaGFuZGxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZUJvdW5kcyA9IGhhbmRsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBoYW5kbGUuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbmRsZWlkJyksXG4gICAgICAgICAgICBwb3NpdGlvbjogaGFuZGxlLmdldEF0dHJpYnV0ZSgnZGF0YS1oYW5kbGVwb3MnKSxcbiAgICAgICAgICAgIHg6IChoYW5kbGVCb3VuZHMubGVmdCAtIG5vZGVCb3VuZHMubGVmdCAtIG5vZGVPZmZzZXQueCkgLyB6b29tLFxuICAgICAgICAgICAgeTogKGhhbmRsZUJvdW5kcy50b3AgLSBub2RlQm91bmRzLnRvcCAtIG5vZGVPZmZzZXQueSkgLyB6b29tLFxuICAgICAgICAgICAgLi4uZ2V0RGltZW5zaW9ucyhoYW5kbGUpLFxuICAgICAgICB9O1xuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGdldE1vdXNlSGFuZGxlcihpZCwgZ2V0U3RhdGUsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gaGFuZGxlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gaGFuZGxlclxuICAgICAgICA6IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGdldFN0YXRlKCkubm9kZUludGVybmFscy5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50LCB7IC4uLm5vZGUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG59XG4vLyB0aGlzIGhhbmRsZXIgaXMgY2FsbGVkIGJ5XG4vLyAxLiB0aGUgY2xpY2sgaGFuZGxlciB3aGVuIG5vZGUgaXMgbm90IGRyYWdnYWJsZSBvciBzZWxlY3ROb2Rlc09uRHJhZyA9IGZhbHNlXG4vLyBvclxuLy8gMi4gdGhlIG9uIGRyYWcgc3RhcnQgaGFuZGxlciB3aGVuIG5vZGUgaXMgZHJhZ2dhYmxlIGFuZCBzZWxlY3ROb2Rlc09uRHJhZyA9IHRydWVcbmZ1bmN0aW9uIGhhbmRsZU5vZGVDbGljayh7IGlkLCBzdG9yZSwgdW5zZWxlY3QgPSBmYWxzZSwgbm9kZVJlZiwgfSkge1xuICAgIGNvbnN0IHsgYWRkU2VsZWN0ZWROb2RlcywgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzLCBtdWx0aVNlbGVjdGlvbkFjdGl2ZSwgbm9kZUludGVybmFscywgb25FcnJvciB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBub2RlID0gbm9kZUludGVybmFscy5nZXQoaWQpO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgICBvbkVycm9yPy4oJzAxMicsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDEyJ10oaWQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdG9yZS5zZXRTdGF0ZSh7IG5vZGVzU2VsZWN0aW9uQWN0aXZlOiBmYWxzZSB9KTtcbiAgICBpZiAoIW5vZGUuc2VsZWN0ZWQpIHtcbiAgICAgICAgYWRkU2VsZWN0ZWROb2RlcyhbaWRdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodW5zZWxlY3QgfHwgKG5vZGUuc2VsZWN0ZWQgJiYgbXVsdGlTZWxlY3Rpb25BY3RpdmUpKSB7XG4gICAgICAgIHVuc2VsZWN0Tm9kZXNBbmRFZGdlcyh7IG5vZGVzOiBbbm9kZV0sIGVkZ2VzOiBbXSB9KTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IG5vZGVSZWY/LmN1cnJlbnQ/LmJsdXIoKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1c2VHZXRQb2ludGVyUG9zaXRpb24oKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIC8vIHJldHVybnMgdGhlIHBvaW50ZXIgcG9zaXRpb24gcHJvamVjdGVkIHRvIHRoZSBSRiBjb29yZGluYXRlIHN5c3RlbVxuICAgIGNvbnN0IGdldFBvaW50ZXJQb3NpdGlvbiA9IHVzZUNhbGxiYWNrKCh7IHNvdXJjZUV2ZW50IH0pID0+IHtcbiAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm0sIHNuYXBHcmlkLCBzbmFwVG9HcmlkIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICBjb25zdCB4ID0gc291cmNlRXZlbnQudG91Y2hlcyA/IHNvdXJjZUV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCA6IHNvdXJjZUV2ZW50LmNsaWVudFg7XG4gICAgICAgIGNvbnN0IHkgPSBzb3VyY2VFdmVudC50b3VjaGVzID8gc291cmNlRXZlbnQudG91Y2hlc1swXS5jbGllbnRZIDogc291cmNlRXZlbnQuY2xpZW50WTtcbiAgICAgICAgY29uc3QgcG9pbnRlclBvcyA9IHtcbiAgICAgICAgICAgIHg6ICh4IC0gdHJhbnNmb3JtWzBdKSAvIHRyYW5zZm9ybVsyXSxcbiAgICAgICAgICAgIHk6ICh5IC0gdHJhbnNmb3JtWzFdKSAvIHRyYW5zZm9ybVsyXSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2UgbmVlZCB0aGUgc25hcHBlZCBwb3NpdGlvbiBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNraXAgdW5uZWNlc3NhcnkgZHJhZyBldmVudHNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhTbmFwcGVkOiBzbmFwVG9HcmlkID8gc25hcEdyaWRbMF0gKiBNYXRoLnJvdW5kKHBvaW50ZXJQb3MueCAvIHNuYXBHcmlkWzBdKSA6IHBvaW50ZXJQb3MueCxcbiAgICAgICAgICAgIHlTbmFwcGVkOiBzbmFwVG9HcmlkID8gc25hcEdyaWRbMV0gKiBNYXRoLnJvdW5kKHBvaW50ZXJQb3MueSAvIHNuYXBHcmlkWzFdKSA6IHBvaW50ZXJQb3MueSxcbiAgICAgICAgICAgIC4uLnBvaW50ZXJQb3MsXG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuICAgIHJldHVybiBnZXRQb2ludGVyUG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHdyYXBTZWxlY3Rpb25EcmFnRnVuYyhzZWxlY3Rpb25GdW5jKSB7XG4gICAgcmV0dXJuIChldmVudCwgXywgbm9kZXMpID0+IHNlbGVjdGlvbkZ1bmM/LihldmVudCwgbm9kZXMpO1xufVxuZnVuY3Rpb24gdXNlRHJhZyh7IG5vZGVSZWYsIGRpc2FibGVkID0gZmFsc2UsIG5vRHJhZ0NsYXNzTmFtZSwgaGFuZGxlU2VsZWN0b3IsIG5vZGVJZCwgaXNTZWxlY3RhYmxlLCBzZWxlY3ROb2Rlc09uRHJhZywgfSkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCBbZHJhZ2dpbmcsIHNldERyYWdnaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBkcmFnSXRlbXMgPSB1c2VSZWYoW10pO1xuICAgIGNvbnN0IGxhc3RQb3MgPSB1c2VSZWYoeyB4OiBudWxsLCB5OiBudWxsIH0pO1xuICAgIGNvbnN0IGF1dG9QYW5JZCA9IHVzZVJlZigwKTtcbiAgICBjb25zdCBjb250YWluZXJCb3VuZHMgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgbW91c2VQb3NpdGlvbiA9IHVzZVJlZih7IHg6IDAsIHk6IDAgfSk7XG4gICAgY29uc3QgZHJhZ0V2ZW50ID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGF1dG9QYW5TdGFydGVkID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBkcmFnU3RhcnRlZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgY29uc3QgYWJvcnREcmFnID0gdXNlUmVmKGZhbHNlKTtcbiAgICBjb25zdCBnZXRQb2ludGVyUG9zaXRpb24gPSB1c2VHZXRQb2ludGVyUG9zaXRpb24oKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobm9kZVJlZj8uY3VycmVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0KG5vZGVSZWYuY3VycmVudCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVOb2RlcyA9ICh7IHgsIHkgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgb25Ob2RlRHJhZywgb25TZWxlY3Rpb25EcmFnLCB1cGRhdGVOb2RlUG9zaXRpb25zLCBub2RlRXh0ZW50LCBzbmFwR3JpZCwgc25hcFRvR3JpZCwgbm9kZU9yaWdpbiwgb25FcnJvciwgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgbGFzdFBvcy5jdXJyZW50ID0geyB4LCB5IH07XG4gICAgICAgICAgICAgICAgbGV0IGhhc0NoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBub2Rlc0JveCA9IHsgeDogMCwgeTogMCwgeDI6IDAsIHkyOiAwIH07XG4gICAgICAgICAgICAgICAgaWYgKGRyYWdJdGVtcy5jdXJyZW50Lmxlbmd0aCA+IDEgJiYgbm9kZUV4dGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZ2V0Tm9kZXNCb3VuZHMoZHJhZ0l0ZW1zLmN1cnJlbnQsIG5vZGVPcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICBub2Rlc0JveCA9IHJlY3RUb0JveChyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZHJhZ0l0ZW1zLmN1cnJlbnQgPSBkcmFnSXRlbXMuY3VycmVudC5tYXAoKG4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFBvc2l0aW9uID0geyB4OiB4IC0gbi5kaXN0YW5jZS54LCB5OiB5IC0gbi5kaXN0YW5jZS55IH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmFwVG9HcmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UG9zaXRpb24ueCA9IHNuYXBHcmlkWzBdICogTWF0aC5yb3VuZChuZXh0UG9zaXRpb24ueCAvIHNuYXBHcmlkWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQb3NpdGlvbi55ID0gc25hcEdyaWRbMV0gKiBNYXRoLnJvdW5kKG5leHRQb3NpdGlvbi55IC8gc25hcEdyaWRbMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIHNlbGVjdGlvbiB3aXRoIG11bHRpcGxlIG5vZGVzIGFuZCBhIG5vZGUgZXh0ZW50IGlzIHNldCwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIG5vZGUgZXh0ZW50IGZvciBlYWNoIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFzZWQgb24gaXRzIHBvc2l0aW9uIHNvIHRoYXQgdGhlIG5vZGUgc3RheXMgYXQgaXQncyBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZE5vZGVFeHRlbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZUV4dGVudFswXVswXSwgbm9kZUV4dGVudFswXVsxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZUV4dGVudFsxXVswXSwgbm9kZUV4dGVudFsxXVsxXV0sXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnSXRlbXMuY3VycmVudC5sZW5ndGggPiAxICYmIG5vZGVFeHRlbnQgJiYgIW4uZXh0ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZE5vZGVFeHRlbnRbMF1bMF0gPSBuLnBvc2l0aW9uQWJzb2x1dGUueCAtIG5vZGVzQm94LnggKyBub2RlRXh0ZW50WzBdWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWROb2RlRXh0ZW50WzFdWzBdID0gbi5wb3NpdGlvbkFic29sdXRlLnggKyAobi53aWR0aCA/PyAwKSAtIG5vZGVzQm94LngyICsgbm9kZUV4dGVudFsxXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkTm9kZUV4dGVudFswXVsxXSA9IG4ucG9zaXRpb25BYnNvbHV0ZS55IC0gbm9kZXNCb3gueSArIG5vZGVFeHRlbnRbMF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZE5vZGVFeHRlbnRbMV1bMV0gPSBuLnBvc2l0aW9uQWJzb2x1dGUueSArIChuLmhlaWdodCA/PyAwKSAtIG5vZGVzQm94LnkyICsgbm9kZUV4dGVudFsxXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkUG9zID0gY2FsY05leHRQb3NpdGlvbihuLCBuZXh0UG9zaXRpb24sIG5vZGVJbnRlcm5hbHMsIGFkanVzdGVkTm9kZUV4dGVudCwgbm9kZU9yaWdpbiwgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugb25seSBmaXJlIGEgY2hhbmdlIGV2ZW50IHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaGFzQ2hhbmdlID0gaGFzQ2hhbmdlIHx8IG4ucG9zaXRpb24ueCAhPT0gdXBkYXRlZFBvcy5wb3NpdGlvbi54IHx8IG4ucG9zaXRpb24ueSAhPT0gdXBkYXRlZFBvcy5wb3NpdGlvbi55O1xuICAgICAgICAgICAgICAgICAgICBuLnBvc2l0aW9uID0gdXBkYXRlZFBvcy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbi5wb3NpdGlvbkFic29sdXRlID0gdXBkYXRlZFBvcy5wb3NpdGlvbkFic29sdXRlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZU5vZGVQb3NpdGlvbnMoZHJhZ0l0ZW1zLmN1cnJlbnQsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHNldERyYWdnaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9uRHJhZyA9IG5vZGVJZCA/IG9uTm9kZURyYWcgOiB3cmFwU2VsZWN0aW9uRHJhZ0Z1bmMob25TZWxlY3Rpb25EcmFnKTtcbiAgICAgICAgICAgICAgICBpZiAob25EcmFnICYmIGRyYWdFdmVudC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjdXJyZW50Tm9kZSwgbm9kZXNdID0gZ2V0RXZlbnRIYW5kbGVyUGFyYW1zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdJdGVtczogZHJhZ0l0ZW1zLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb25EcmFnKGRyYWdFdmVudC5jdXJyZW50LCBjdXJyZW50Tm9kZSwgbm9kZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBhdXRvUGFuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29udGFpbmVyQm91bmRzLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbeE1vdmVtZW50LCB5TW92ZW1lbnRdID0gY2FsY0F1dG9QYW4obW91c2VQb3NpdGlvbi5jdXJyZW50LCBjb250YWluZXJCb3VuZHMuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHhNb3ZlbWVudCAhPT0gMCB8fCB5TW92ZW1lbnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0cmFuc2Zvcm0sIHBhbkJ5IH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0UG9zLmN1cnJlbnQueCA9IChsYXN0UG9zLmN1cnJlbnQueCA/PyAwKSAtIHhNb3ZlbWVudCAvIHRyYW5zZm9ybVsyXTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcy5jdXJyZW50LnkgPSAobGFzdFBvcy5jdXJyZW50LnkgPz8gMCkgLSB5TW92ZW1lbnQgLyB0cmFuc2Zvcm1bMl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYW5CeSh7IHg6IHhNb3ZlbWVudCwgeTogeU1vdmVtZW50IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb2RlcyhsYXN0UG9zLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF1dG9QYW5JZC5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGF1dG9QYW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RHJhZyA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgbXVsdGlTZWxlY3Rpb25BY3RpdmUsIG5vZGVzRHJhZ2dhYmxlLCB1bnNlbGVjdE5vZGVzQW5kRWRnZXMsIG9uTm9kZURyYWdTdGFydCwgb25TZWxlY3Rpb25EcmFnU3RhcnQsIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGRyYWdTdGFydGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9uU3RhcnQgPSBub2RlSWQgPyBvbk5vZGVEcmFnU3RhcnQgOiB3cmFwU2VsZWN0aW9uRHJhZ0Z1bmMob25TZWxlY3Rpb25EcmFnU3RhcnQpO1xuICAgICAgICAgICAgICAgIGlmICgoIXNlbGVjdE5vZGVzT25EcmFnIHx8ICFpc1NlbGVjdGFibGUpICYmICFtdWx0aVNlbGVjdGlvbkFjdGl2ZSAmJiBub2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlSW50ZXJuYWxzLmdldChub2RlSWQpPy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZXNldCBzZWxlY3RlZCBub2RlcyB3aGVuIHNlbGVjdE5vZGVzT25EcmFnPWZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdE5vZGVzQW5kRWRnZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZUlkICYmIGlzU2VsZWN0YWJsZSAmJiBzZWxlY3ROb2Rlc09uRHJhZykge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQ2xpY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVJlZjogbm9kZVJlZixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJQb3MgPSBnZXRQb2ludGVyUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgICAgICAgIGxhc3RQb3MuY3VycmVudCA9IHBvaW50ZXJQb3M7XG4gICAgICAgICAgICAgICAgZHJhZ0l0ZW1zLmN1cnJlbnQgPSBnZXREcmFnSXRlbXMobm9kZUludGVybmFscywgbm9kZXNEcmFnZ2FibGUsIHBvaW50ZXJQb3MsIG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgJiYgZHJhZ0l0ZW1zLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2N1cnJlbnROb2RlLCBub2Rlc10gPSBnZXRFdmVudEhhbmRsZXJQYXJhbXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0l0ZW1zOiBkcmFnSXRlbXMuY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJbnRlcm5hbHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBvblN0YXJ0KGV2ZW50LnNvdXJjZUV2ZW50LCBjdXJyZW50Tm9kZSwgbm9kZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ub24oJy5kcmFnJywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnSGFuZGxlciA9IGRyYWcoKVxuICAgICAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZG9tTm9kZSwgbm9kZURyYWdUaHJlc2hvbGQgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlRHJhZ1RocmVzaG9sZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREcmFnKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhYm9ydERyYWcuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludGVyUG9zID0gZ2V0UG9pbnRlclBvc2l0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBvcy5jdXJyZW50ID0gcG9pbnRlclBvcztcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQm91bmRzLmN1cnJlbnQgPSBkb21Ob2RlPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICBtb3VzZVBvc2l0aW9uLmN1cnJlbnQgPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LnNvdXJjZUV2ZW50LCBjb250YWluZXJCb3VuZHMuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdkcmFnJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ZXJQb3MgPSBnZXRQb2ludGVyUG9zaXRpb24oZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGF1dG9QYW5Pbk5vZGVEcmFnLCBub2RlRHJhZ1RocmVzaG9sZCB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZUV2ZW50LnR5cGUgPT09ICd0b3VjaG1vdmUnICYmIGV2ZW50LnNvdXJjZUV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnREcmFnLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydERyYWcuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXV0b1BhblN0YXJ0ZWQuY3VycmVudCAmJiBkcmFnU3RhcnRlZC5jdXJyZW50ICYmIGF1dG9QYW5Pbk5vZGVEcmFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvUGFuU3RhcnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9QYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYWdTdGFydGVkLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludGVyUG9zLnhTbmFwcGVkIC0gKGxhc3RQb3M/LmN1cnJlbnQ/LnggPz8gMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gcG9pbnRlclBvcy55U25hcHBlZCAtIChsYXN0UG9zPy5jdXJyZW50Py55ID8/IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiBub2RlRHJhZ1RocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RHJhZyhldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBldmVudHMgd2l0aG91dCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RQb3MuY3VycmVudC54ICE9PSBwb2ludGVyUG9zLnhTbmFwcGVkIHx8IGxhc3RQb3MuY3VycmVudC55ICE9PSBwb2ludGVyUG9zLnlTbmFwcGVkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0l0ZW1zLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdTdGFydGVkLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdFdmVudC5jdXJyZW50ID0gZXZlbnQuc291cmNlRXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3VzZVBvc2l0aW9uLmN1cnJlbnQgPSBnZXRFdmVudFBvc2l0aW9uKGV2ZW50LnNvdXJjZUV2ZW50LCBjb250YWluZXJCb3VuZHMuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb2Rlcyhwb2ludGVyUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5vbignZW5kJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhZ1N0YXJ0ZWQuY3VycmVudCB8fCBhYm9ydERyYWcuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldERyYWdnaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXV0b1BhblN0YXJ0ZWQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBkcmFnU3RhcnRlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGF1dG9QYW5JZC5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWdJdGVtcy5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHVwZGF0ZU5vZGVQb3NpdGlvbnMsIG5vZGVJbnRlcm5hbHMsIG9uTm9kZURyYWdTdG9wLCBvblNlbGVjdGlvbkRyYWdTdG9wIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25TdG9wID0gbm9kZUlkID8gb25Ob2RlRHJhZ1N0b3AgOiB3cmFwU2VsZWN0aW9uRHJhZ0Z1bmMob25TZWxlY3Rpb25EcmFnU3RvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVOb2RlUG9zaXRpb25zKGRyYWdJdGVtcy5jdXJyZW50LCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjdXJyZW50Tm9kZSwgbm9kZXNdID0gZ2V0RXZlbnRIYW5kbGVyUGFyYW1zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnSXRlbXM6IGRyYWdJdGVtcy5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RvcChldmVudC5zb3VyY2VFdmVudCwgY3VycmVudE5vZGUsIG5vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEcmFnZ2FibGUgPSAhZXZlbnQuYnV0dG9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIW5vRHJhZ0NsYXNzTmFtZSB8fCAhaGFzU2VsZWN0b3IodGFyZ2V0LCBgLiR7bm9EcmFnQ2xhc3NOYW1lfWAsIG5vZGVSZWYpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFoYW5kbGVTZWxlY3RvciB8fCBoYXNTZWxlY3Rvcih0YXJnZXQsIGhhbmRsZVNlbGVjdG9yLCBub2RlUmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0RyYWdnYWJsZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uY2FsbChkcmFnSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLm9uKCcuZHJhZycsIG51bGwpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIG5vZGVSZWYsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBub0RyYWdDbGFzc05hbWUsXG4gICAgICAgIGhhbmRsZVNlbGVjdG9yLFxuICAgICAgICBpc1NlbGVjdGFibGUsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBub2RlSWQsXG4gICAgICAgIHNlbGVjdE5vZGVzT25EcmFnLFxuICAgICAgICBnZXRQb2ludGVyUG9zaXRpb24sXG4gICAgXSk7XG4gICAgcmV0dXJuIGRyYWdnaW5nO1xufVxuXG5mdW5jdGlvbiB1c2VVcGRhdGVOb2RlUG9zaXRpb25zKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbnMgPSB1c2VDYWxsYmFjaygocGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgbm9kZUV4dGVudCwgdXBkYXRlTm9kZVBvc2l0aW9ucywgZ2V0Tm9kZXMsIHNuYXBUb0dyaWQsIHNuYXBHcmlkLCBvbkVycm9yLCBub2Rlc0RyYWdnYWJsZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IGdldE5vZGVzKCkuZmlsdGVyKChuKSA9PiBuLnNlbGVjdGVkICYmIChuLmRyYWdnYWJsZSB8fCAobm9kZXNEcmFnZ2FibGUgJiYgdHlwZW9mIG4uZHJhZ2dhYmxlID09PSAndW5kZWZpbmVkJykpKTtcbiAgICAgICAgLy8gYnkgZGVmYXVsdCBhIG5vZGUgbW92ZXMgNXB4IG9uIGVhY2gga2V5IHByZXNzLCBvciAyMHB4IGlmIHNoaWZ0IGlzIHByZXNzZWRcbiAgICAgICAgLy8gaWYgc25hcCBncmlkIGlzIGVuYWJsZWQsIHdlIHVzZSB0aGF0IGZvciB0aGUgdmVsb2NpdHkuXG4gICAgICAgIGNvbnN0IHhWZWxvID0gc25hcFRvR3JpZCA/IHNuYXBHcmlkWzBdIDogNTtcbiAgICAgICAgY29uc3QgeVZlbG8gPSBzbmFwVG9HcmlkID8gc25hcEdyaWRbMV0gOiA1O1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBwYXJhbXMuaXNTaGlmdFByZXNzZWQgPyA0IDogMTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25EaWZmWCA9IHBhcmFtcy54ICogeFZlbG8gKiBmYWN0b3I7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uRGlmZlkgPSBwYXJhbXMueSAqIHlWZWxvICogZmFjdG9yO1xuICAgICAgICBjb25zdCBub2RlVXBkYXRlcyA9IHNlbGVjdGVkTm9kZXMubWFwKChuKSA9PiB7XG4gICAgICAgICAgICBpZiAobi5wb3NpdGlvbkFic29sdXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFBvc2l0aW9uID0geyB4OiBuLnBvc2l0aW9uQWJzb2x1dGUueCArIHBvc2l0aW9uRGlmZlgsIHk6IG4ucG9zaXRpb25BYnNvbHV0ZS55ICsgcG9zaXRpb25EaWZmWSB9O1xuICAgICAgICAgICAgICAgIGlmIChzbmFwVG9HcmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRQb3NpdGlvbi54ID0gc25hcEdyaWRbMF0gKiBNYXRoLnJvdW5kKG5leHRQb3NpdGlvbi54IC8gc25hcEdyaWRbMF0pO1xuICAgICAgICAgICAgICAgICAgICBuZXh0UG9zaXRpb24ueSA9IHNuYXBHcmlkWzFdICogTWF0aC5yb3VuZChuZXh0UG9zaXRpb24ueSAvIHNuYXBHcmlkWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwb3NpdGlvbkFic29sdXRlLCBwb3NpdGlvbiB9ID0gY2FsY05leHRQb3NpdGlvbihuLCBuZXh0UG9zaXRpb24sIG5vZGVJbnRlcm5hbHMsIG5vZGVFeHRlbnQsIHVuZGVmaW5lZCwgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgbi5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIG4ucG9zaXRpb25BYnNvbHV0ZSA9IHBvc2l0aW9uQWJzb2x1dGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZU5vZGVQb3NpdGlvbnMobm9kZVVwZGF0ZXMsIHRydWUsIGZhbHNlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHVwZGF0ZVBvc2l0aW9ucztcbn1cblxuY29uc3QgYXJyb3dLZXlEaWZmcyA9IHtcbiAgICBBcnJvd1VwOiB7IHg6IDAsIHk6IC0xIH0sXG4gICAgQXJyb3dEb3duOiB7IHg6IDAsIHk6IDEgfSxcbiAgICBBcnJvd0xlZnQ6IHsgeDogLTEsIHk6IDAgfSxcbiAgICBBcnJvd1JpZ2h0OiB7IHg6IDEsIHk6IDAgfSxcbn07XG52YXIgd3JhcE5vZGUgPSAoTm9kZUNvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IE5vZGVXcmFwcGVyID0gKHsgaWQsIHR5cGUsIGRhdGEsIHhQb3MsIHlQb3MsIHhQb3NPcmlnaW4sIHlQb3NPcmlnaW4sIHNlbGVjdGVkLCBvbkNsaWNrLCBvbk1vdXNlRW50ZXIsIG9uTW91c2VNb3ZlLCBvbk1vdXNlTGVhdmUsIG9uQ29udGV4dE1lbnUsIG9uRG91YmxlQ2xpY2ssIHN0eWxlLCBjbGFzc05hbWUsIGlzRHJhZ2dhYmxlLCBpc1NlbGVjdGFibGUsIGlzQ29ubmVjdGFibGUsIGlzRm9jdXNhYmxlLCBzZWxlY3ROb2Rlc09uRHJhZywgc291cmNlUG9zaXRpb24sIHRhcmdldFBvc2l0aW9uLCBoaWRkZW4sIHJlc2l6ZU9ic2VydmVyLCBkcmFnSGFuZGxlLCB6SW5kZXgsIGlzUGFyZW50LCBub0RyYWdDbGFzc05hbWUsIG5vUGFuQ2xhc3NOYW1lLCBpbml0aWFsaXplZCwgZGlzYWJsZUtleWJvYXJkQTExeSwgYXJpYUxhYmVsLCByZklkLCBoYXNIYW5kbGVCb3VuZHMsIH0pID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgICAgICBjb25zdCBub2RlUmVmID0gdXNlUmVmKG51bGwpO1xuICAgICAgICBjb25zdCBwcmV2Tm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICAgICAgY29uc3QgcHJldlNvdXJjZVBvc2l0aW9uID0gdXNlUmVmKHNvdXJjZVBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldlRhcmdldFBvc2l0aW9uID0gdXNlUmVmKHRhcmdldFBvc2l0aW9uKTtcbiAgICAgICAgY29uc3QgcHJldlR5cGUgPSB1c2VSZWYodHlwZSk7XG4gICAgICAgIGNvbnN0IGhhc1BvaW50ZXJFdmVudHMgPSBpc1NlbGVjdGFibGUgfHwgaXNEcmFnZ2FibGUgfHwgb25DbGljayB8fCBvbk1vdXNlRW50ZXIgfHwgb25Nb3VzZU1vdmUgfHwgb25Nb3VzZUxlYXZlO1xuICAgICAgICBjb25zdCB1cGRhdGVQb3NpdGlvbnMgPSB1c2VVcGRhdGVOb2RlUG9zaXRpb25zKCk7XG4gICAgICAgIGNvbnN0IG9uTW91c2VFbnRlckhhbmRsZXIgPSBnZXRNb3VzZUhhbmRsZXIoaWQsIHN0b3JlLmdldFN0YXRlLCBvbk1vdXNlRW50ZXIpO1xuICAgICAgICBjb25zdCBvbk1vdXNlTW92ZUhhbmRsZXIgPSBnZXRNb3VzZUhhbmRsZXIoaWQsIHN0b3JlLmdldFN0YXRlLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGNvbnN0IG9uTW91c2VMZWF2ZUhhbmRsZXIgPSBnZXRNb3VzZUhhbmRsZXIoaWQsIHN0b3JlLmdldFN0YXRlLCBvbk1vdXNlTGVhdmUpO1xuICAgICAgICBjb25zdCBvbkNvbnRleHRNZW51SGFuZGxlciA9IGdldE1vdXNlSGFuZGxlcihpZCwgc3RvcmUuZ2V0U3RhdGUsIG9uQ29udGV4dE1lbnUpO1xuICAgICAgICBjb25zdCBvbkRvdWJsZUNsaWNrSGFuZGxlciA9IGdldE1vdXNlSGFuZGxlcihpZCwgc3RvcmUuZ2V0U3RhdGUsIG9uRG91YmxlQ2xpY2spO1xuICAgICAgICBjb25zdCBvblNlbGVjdE5vZGVIYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IG5vZGVEcmFnVGhyZXNob2xkIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0YWJsZSAmJiAoIXNlbGVjdE5vZGVzT25EcmFnIHx8ICFpc0RyYWdnYWJsZSB8fCBub2RlRHJhZ1RocmVzaG9sZCA+IDApKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYW5kbGVyIGdldHMgY2FsbGVkIHdpdGhpbiB0aGUgZHJhZyBzdGFydCBldmVudCB3aGVuIHNlbGVjdE5vZGVzT25EcmFnPXRydWVcbiAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQ2xpY2soe1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgIG5vZGVSZWYsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25DbGljaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBzdG9yZS5nZXRTdGF0ZSgpLm5vZGVJbnRlcm5hbHMuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrKGV2ZW50LCB7IC4uLm5vZGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbktleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0lucHV0RE9NTm9kZShldmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlzYWJsZUtleWJvYXJkQTExeSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtZW50U2VsZWN0aW9uS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpICYmIGlzU2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuc2VsZWN0ID0gZXZlbnQua2V5ID09PSAnRXNjYXBlJztcbiAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQ2xpY2soe1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICBub2RlUmVmLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNEcmFnZ2FibGUgJiYgc2VsZWN0ZWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFycm93S2V5RGlmZnMsIGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGFyaWFMaXZlTWVzc2FnZTogYE1vdmVkIHNlbGVjdGVkIG5vZGUgJHtldmVudC5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdBcnJvdycsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCl9LiBOZXcgcG9zaXRpb24sIHg6ICR7fn54UG9zfSwgeTogJHt+fnlQb3N9YCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICB4OiBhcnJvd0tleURpZmZzW2V2ZW50LmtleV0ueCxcbiAgICAgICAgICAgICAgICAgICAgeTogYXJyb3dLZXlEaWZmc1tldmVudC5rZXldLnksXG4gICAgICAgICAgICAgICAgICAgIGlzU2hpZnRQcmVzc2VkOiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZOb2RlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXI/LnVub2JzZXJ2ZShwcmV2Tm9kZVJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcHJldk5vZGVSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgW10pO1xuICAgICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGVSZWYuY3VycmVudCAmJiAhaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Vyck5vZGUgPSBub2RlUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplZCB8fCAhaGFzSGFuZGxlQm91bmRzIHx8IHByZXZOb2RlUmVmLmN1cnJlbnQgIT09IGN1cnJOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgYWx3YXlzIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG5vZGUgZ2V0cyByZS1tZWFzdXJlZCAvIHJlLWluaXRpYWxpemVkLlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVub2JzZXJ2ZSBpdCBmaXJzdCBpbiBjYXNlIGl0IGlzIHN0aWxsIG9ic2VydmVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZVJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlcj8udW5vYnNlcnZlKHByZXZOb2RlUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyPy5vYnNlcnZlKGN1cnJOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldk5vZGVSZWYuY3VycmVudCA9IGN1cnJOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgW2hpZGRlbiwgaW5pdGlhbGl6ZWQsIGhhc0hhbmRsZUJvdW5kc10pO1xuICAgICAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZXMgdGhlIHNvdXJjZSBvciBoYW5kbGUgcG9zaXRpb24sIHdlIHJlLWluaXRpYWxpemUgdGhlIG5vZGVcbiAgICAgICAgICAgIGNvbnN0IHR5cGVDaGFuZ2VkID0gcHJldlR5cGUuY3VycmVudCAhPT0gdHlwZTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvc0NoYW5nZWQgPSBwcmV2U291cmNlUG9zaXRpb24uY3VycmVudCAhPT0gc291cmNlUG9zaXRpb247XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQb3NDaGFuZ2VkID0gcHJldlRhcmdldFBvc2l0aW9uLmN1cnJlbnQgIT09IHRhcmdldFBvc2l0aW9uO1xuICAgICAgICAgICAgaWYgKG5vZGVSZWYuY3VycmVudCAmJiAodHlwZUNoYW5nZWQgfHwgc291cmNlUG9zQ2hhbmdlZCB8fCB0YXJnZXRQb3NDaGFuZ2VkKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2VHlwZS5jdXJyZW50ID0gdHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZVBvc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlNvdXJjZVBvc2l0aW9uLmN1cnJlbnQgPSBzb3VyY2VQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldFBvc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRhcmdldFBvc2l0aW9uLmN1cnJlbnQgPSB0YXJnZXRQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RvcmUuZ2V0U3RhdGUoKS51cGRhdGVOb2RlRGltZW5zaW9ucyhbeyBpZCwgbm9kZUVsZW1lbnQ6IG5vZGVSZWYuY3VycmVudCwgZm9yY2VVcGRhdGU6IHRydWUgfV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBbaWQsIHR5cGUsIHNvdXJjZVBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbl0pO1xuICAgICAgICBjb25zdCBkcmFnZ2luZyA9IHVzZURyYWcoe1xuICAgICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICAgIGRpc2FibGVkOiBoaWRkZW4gfHwgIWlzRHJhZ2dhYmxlLFxuICAgICAgICAgICAgbm9EcmFnQ2xhc3NOYW1lLFxuICAgICAgICAgICAgaGFuZGxlU2VsZWN0b3I6IGRyYWdIYW5kbGUsXG4gICAgICAgICAgICBub2RlSWQ6IGlkLFxuICAgICAgICAgICAgaXNTZWxlY3RhYmxlLFxuICAgICAgICAgICAgc2VsZWN0Tm9kZXNPbkRyYWcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGlkZGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNjKFtcbiAgICAgICAgICAgICAgICAncmVhY3QtZmxvd19fbm9kZScsXG4gICAgICAgICAgICAgICAgYHJlYWN0LWZsb3dfX25vZGUtJHt0eXBlfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG92ZXJ3cml0YWJsZSBieSBwYXNzaW5nIGBub3BhbmAgYXMgYSBjbGFzcyBuYW1lXG4gICAgICAgICAgICAgICAgICAgIFtub1BhbkNsYXNzTmFtZV06IGlzRHJhZ2dhYmxlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGlzU2VsZWN0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBpc1BhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLCByZWY6IG5vZGVSZWYsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgekluZGV4LFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3hQb3NPcmlnaW59cHgsJHt5UG9zT3JpZ2lufXB4KWAsXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogaGFzUG9pbnRlckV2ZW50cyA/ICdhbGwnIDogJ25vbmUnLFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGluaXRpYWxpemVkID8gJ3Zpc2libGUnIDogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICB9LCBcImRhdGEtaWRcIjogaWQsIFwiZGF0YS10ZXN0aWRcIjogYHJmX19ub2RlLSR7aWR9YCwgb25Nb3VzZUVudGVyOiBvbk1vdXNlRW50ZXJIYW5kbGVyLCBvbk1vdXNlTW92ZTogb25Nb3VzZU1vdmVIYW5kbGVyLCBvbk1vdXNlTGVhdmU6IG9uTW91c2VMZWF2ZUhhbmRsZXIsIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnVIYW5kbGVyLCBvbkNsaWNrOiBvblNlbGVjdE5vZGVIYW5kbGVyLCBvbkRvdWJsZUNsaWNrOiBvbkRvdWJsZUNsaWNrSGFuZGxlciwgb25LZXlEb3duOiBpc0ZvY3VzYWJsZSA/IG9uS2V5RG93biA6IHVuZGVmaW5lZCwgdGFiSW5kZXg6IGlzRm9jdXNhYmxlID8gMCA6IHVuZGVmaW5lZCwgcm9sZTogaXNGb2N1c2FibGUgPyAnYnV0dG9uJyA6IHVuZGVmaW5lZCwgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IGRpc2FibGVLZXlib2FyZEExMXkgPyB1bmRlZmluZWQgOiBgJHtBUklBX05PREVfREVTQ19LRVl9LSR7cmZJZH1gLCBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyLCB7IHZhbHVlOiBpZCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTm9kZUNvbXBvbmVudCwgeyBpZDogaWQsIGRhdGE6IGRhdGEsIHR5cGU6IHR5cGUsIHhQb3M6IHhQb3MsIHlQb3M6IHlQb3MsIHNlbGVjdGVkOiBzZWxlY3RlZCwgaXNDb25uZWN0YWJsZTogaXNDb25uZWN0YWJsZSwgc291cmNlUG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbjogdGFyZ2V0UG9zaXRpb24sIGRyYWdnaW5nOiBkcmFnZ2luZywgZHJhZ0hhbmRsZTogZHJhZ0hhbmRsZSwgekluZGV4OiB6SW5kZXggfSkpKSk7XG4gICAgfTtcbiAgICBOb2RlV3JhcHBlci5kaXNwbGF5TmFtZSA9ICdOb2RlV3JhcHBlcic7XG4gICAgcmV0dXJuIG1lbW8oTm9kZVdyYXBwZXIpO1xufTtcblxuLyoqXG4gKiBUaGUgbm9kZXMgc2VsZWN0aW9uIHJlY3RhbmdsZSBnZXRzIGRpc3BsYXllZCB3aGVuIGEgdXNlclxuICogbWFkZSBhIHNlbGVjdGlvbiB3aXRoIG9uIG9yIHNldmVyYWwgbm9kZXNcbiAqL1xuY29uc3Qgc2VsZWN0b3IkNyA9IChzKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWROb2RlcyA9IHMuZ2V0Tm9kZXMoKS5maWx0ZXIoKG4pID0+IG4uc2VsZWN0ZWQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmdldE5vZGVzQm91bmRzKHNlbGVjdGVkTm9kZXMsIHMubm9kZU9yaWdpbiksXG4gICAgICAgIHRyYW5zZm9ybVN0cmluZzogYHRyYW5zbGF0ZSgke3MudHJhbnNmb3JtWzBdfXB4LCR7cy50cmFuc2Zvcm1bMV19cHgpIHNjYWxlKCR7cy50cmFuc2Zvcm1bMl19KWAsXG4gICAgICAgIHVzZXJTZWxlY3Rpb25BY3RpdmU6IHMudXNlclNlbGVjdGlvbkFjdGl2ZSxcbiAgICB9O1xufTtcbmZ1bmN0aW9uIE5vZGVzU2VsZWN0aW9uKHsgb25TZWxlY3Rpb25Db250ZXh0TWVudSwgbm9QYW5DbGFzc05hbWUsIGRpc2FibGVLZXlib2FyZEExMXkgfSkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHg6IGxlZnQsIHk6IHRvcCwgdHJhbnNmb3JtU3RyaW5nLCB1c2VyU2VsZWN0aW9uQWN0aXZlIH0gPSB1c2VTdG9yZShzZWxlY3RvciQ3LCBzaGFsbG93KTtcbiAgICBjb25zdCB1cGRhdGVQb3NpdGlvbnMgPSB1c2VVcGRhdGVOb2RlUG9zaXRpb25zKCk7XG4gICAgY29uc3Qgbm9kZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWRpc2FibGVLZXlib2FyZEExMXkpIHtcbiAgICAgICAgICAgIG5vZGVSZWYuY3VycmVudD8uZm9jdXMoe1xuICAgICAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIFtkaXNhYmxlS2V5Ym9hcmRBMTF5XSk7XG4gICAgdXNlRHJhZyh7XG4gICAgICAgIG5vZGVSZWYsXG4gICAgfSk7XG4gICAgaWYgKHVzZXJTZWxlY3Rpb25BY3RpdmUgfHwgIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG9uQ29udGV4dE1lbnUgPSBvblNlbGVjdGlvbkNvbnRleHRNZW51XG4gICAgICAgID8gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZE5vZGVzID0gc3RvcmVcbiAgICAgICAgICAgICAgICAuZ2V0U3RhdGUoKVxuICAgICAgICAgICAgICAgIC5nZXROb2RlcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigobikgPT4gbi5zZWxlY3RlZCk7XG4gICAgICAgICAgICBvblNlbGVjdGlvbkNvbnRleHRNZW51KGV2ZW50LCBzZWxlY3RlZE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvbktleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcnJvd0tleURpZmZzLCBldmVudC5rZXkpKSB7XG4gICAgICAgICAgICB1cGRhdGVQb3NpdGlvbnMoe1xuICAgICAgICAgICAgICAgIHg6IGFycm93S2V5RGlmZnNbZXZlbnQua2V5XS54LFxuICAgICAgICAgICAgICAgIHk6IGFycm93S2V5RGlmZnNbZXZlbnQua2V5XS55LFxuICAgICAgICAgICAgICAgIGlzU2hpZnRQcmVzc2VkOiBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fbm9kZXNzZWxlY3Rpb24nLCAncmVhY3QtZmxvd19fY29udGFpbmVyJywgbm9QYW5DbGFzc05hbWVdKSwgc3R5bGU6IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtU3RyaW5nLFxuICAgICAgICB9IH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IG5vZGVSZWYsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19ub2Rlc3NlbGVjdGlvbi1yZWN0XCIsIG9uQ29udGV4dE1lbnU6IG9uQ29udGV4dE1lbnUsIHRhYkluZGV4OiBkaXNhYmxlS2V5Ym9hcmRBMTF5ID8gdW5kZWZpbmVkIDogLTEsIG9uS2V5RG93bjogZGlzYWJsZUtleWJvYXJkQTExeSA/IHVuZGVmaW5lZCA6IG9uS2V5RG93biwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICB9IH0pKSk7XG59XG52YXIgTm9kZXNTZWxlY3Rpb24kMSA9IG1lbW8oTm9kZXNTZWxlY3Rpb24pO1xuXG5jb25zdCBzZWxlY3RvciQ2ID0gKHMpID0+IHMubm9kZXNTZWxlY3Rpb25BY3RpdmU7XG5jb25zdCBGbG93UmVuZGVyZXIgPSAoeyBjaGlsZHJlbiwgb25QYW5lQ2xpY2ssIG9uUGFuZU1vdXNlRW50ZXIsIG9uUGFuZU1vdXNlTW92ZSwgb25QYW5lTW91c2VMZWF2ZSwgb25QYW5lQ29udGV4dE1lbnUsIG9uUGFuZVNjcm9sbCwgZGVsZXRlS2V5Q29kZSwgb25Nb3ZlLCBvbk1vdmVTdGFydCwgb25Nb3ZlRW5kLCBzZWxlY3Rpb25LZXlDb2RlLCBzZWxlY3Rpb25PbkRyYWcsIHNlbGVjdGlvbk1vZGUsIG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kLCBtdWx0aVNlbGVjdGlvbktleUNvZGUsIHBhbkFjdGl2YXRpb25LZXlDb2RlLCB6b29tQWN0aXZhdGlvbktleUNvZGUsIGVsZW1lbnRzU2VsZWN0YWJsZSwgem9vbU9uU2Nyb2xsLCB6b29tT25QaW5jaCwgcGFuT25TY3JvbGw6IF9wYW5PblNjcm9sbCwgcGFuT25TY3JvbGxTcGVlZCwgcGFuT25TY3JvbGxNb2RlLCB6b29tT25Eb3VibGVDbGljaywgcGFuT25EcmFnOiBfcGFuT25EcmFnLCBkZWZhdWx0Vmlld3BvcnQsIHRyYW5zbGF0ZUV4dGVudCwgbWluWm9vbSwgbWF4Wm9vbSwgcHJldmVudFNjcm9sbGluZywgb25TZWxlY3Rpb25Db250ZXh0TWVudSwgbm9XaGVlbENsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWUsIGRpc2FibGVLZXlib2FyZEExMXksIH0pID0+IHtcbiAgICBjb25zdCBub2Rlc1NlbGVjdGlvbkFjdGl2ZSA9IHVzZVN0b3JlKHNlbGVjdG9yJDYpO1xuICAgIGNvbnN0IHNlbGVjdGlvbktleVByZXNzZWQgPSB1c2VLZXlQcmVzcyhzZWxlY3Rpb25LZXlDb2RlKTtcbiAgICBjb25zdCBwYW5BY3RpdmF0aW9uS2V5UHJlc3NlZCA9IHVzZUtleVByZXNzKHBhbkFjdGl2YXRpb25LZXlDb2RlKTtcbiAgICBjb25zdCBwYW5PbkRyYWcgPSBwYW5BY3RpdmF0aW9uS2V5UHJlc3NlZCB8fCBfcGFuT25EcmFnO1xuICAgIGNvbnN0IHBhbk9uU2Nyb2xsID0gcGFuQWN0aXZhdGlvbktleVByZXNzZWQgfHwgX3Bhbk9uU2Nyb2xsO1xuICAgIGNvbnN0IGlzU2VsZWN0aW5nID0gc2VsZWN0aW9uS2V5UHJlc3NlZCB8fCAoc2VsZWN0aW9uT25EcmFnICYmIHBhbk9uRHJhZyAhPT0gdHJ1ZSk7XG4gICAgdXNlR2xvYmFsS2V5SGFuZGxlcih7IGRlbGV0ZUtleUNvZGUsIG11bHRpU2VsZWN0aW9uS2V5Q29kZSB9KTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoWm9vbVBhbmUsIHsgb25Nb3ZlOiBvbk1vdmUsIG9uTW92ZVN0YXJ0OiBvbk1vdmVTdGFydCwgb25Nb3ZlRW5kOiBvbk1vdmVFbmQsIG9uUGFuZUNvbnRleHRNZW51OiBvblBhbmVDb250ZXh0TWVudSwgZWxlbWVudHNTZWxlY3RhYmxlOiBlbGVtZW50c1NlbGVjdGFibGUsIHpvb21PblNjcm9sbDogem9vbU9uU2Nyb2xsLCB6b29tT25QaW5jaDogem9vbU9uUGluY2gsIHBhbk9uU2Nyb2xsOiBwYW5PblNjcm9sbCwgcGFuT25TY3JvbGxTcGVlZDogcGFuT25TY3JvbGxTcGVlZCwgcGFuT25TY3JvbGxNb2RlOiBwYW5PblNjcm9sbE1vZGUsIHpvb21PbkRvdWJsZUNsaWNrOiB6b29tT25Eb3VibGVDbGljaywgcGFuT25EcmFnOiAhc2VsZWN0aW9uS2V5UHJlc3NlZCAmJiBwYW5PbkRyYWcsIGRlZmF1bHRWaWV3cG9ydDogZGVmYXVsdFZpZXdwb3J0LCB0cmFuc2xhdGVFeHRlbnQ6IHRyYW5zbGF0ZUV4dGVudCwgbWluWm9vbTogbWluWm9vbSwgbWF4Wm9vbTogbWF4Wm9vbSwgem9vbUFjdGl2YXRpb25LZXlDb2RlOiB6b29tQWN0aXZhdGlvbktleUNvZGUsIHByZXZlbnRTY3JvbGxpbmc6IHByZXZlbnRTY3JvbGxpbmcsIG5vV2hlZWxDbGFzc05hbWU6IG5vV2hlZWxDbGFzc05hbWUsIG5vUGFuQ2xhc3NOYW1lOiBub1BhbkNsYXNzTmFtZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFBhbmUsIHsgb25TZWxlY3Rpb25TdGFydDogb25TZWxlY3Rpb25TdGFydCwgb25TZWxlY3Rpb25FbmQ6IG9uU2VsZWN0aW9uRW5kLCBvblBhbmVDbGljazogb25QYW5lQ2xpY2ssIG9uUGFuZU1vdXNlRW50ZXI6IG9uUGFuZU1vdXNlRW50ZXIsIG9uUGFuZU1vdXNlTW92ZTogb25QYW5lTW91c2VNb3ZlLCBvblBhbmVNb3VzZUxlYXZlOiBvblBhbmVNb3VzZUxlYXZlLCBvblBhbmVDb250ZXh0TWVudTogb25QYW5lQ29udGV4dE1lbnUsIG9uUGFuZVNjcm9sbDogb25QYW5lU2Nyb2xsLCBwYW5PbkRyYWc6IHBhbk9uRHJhZywgaXNTZWxlY3Rpbmc6ICEhaXNTZWxlY3RpbmcsIHNlbGVjdGlvbk1vZGU6IHNlbGVjdGlvbk1vZGUgfSxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgbm9kZXNTZWxlY3Rpb25BY3RpdmUgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTm9kZXNTZWxlY3Rpb24kMSwgeyBvblNlbGVjdGlvbkNvbnRleHRNZW51OiBvblNlbGVjdGlvbkNvbnRleHRNZW51LCBub1BhbkNsYXNzTmFtZTogbm9QYW5DbGFzc05hbWUsIGRpc2FibGVLZXlib2FyZEExMXk6IGRpc2FibGVLZXlib2FyZEExMXkgfSkpKSkpO1xufTtcbkZsb3dSZW5kZXJlci5kaXNwbGF5TmFtZSA9ICdGbG93UmVuZGVyZXInO1xudmFyIEZsb3dSZW5kZXJlciQxID0gbWVtbyhGbG93UmVuZGVyZXIpO1xuXG5mdW5jdGlvbiB1c2VWaXNpYmxlTm9kZXMob25seVJlbmRlclZpc2libGUpIHtcbiAgICBjb25zdCBub2RlcyA9IHVzZVN0b3JlKHVzZUNhbGxiYWNrKChzKSA9PiBvbmx5UmVuZGVyVmlzaWJsZVxuICAgICAgICA/IGdldE5vZGVzSW5zaWRlKHMubm9kZUludGVybmFscywgeyB4OiAwLCB5OiAwLCB3aWR0aDogcy53aWR0aCwgaGVpZ2h0OiBzLmhlaWdodCB9LCBzLnRyYW5zZm9ybSwgdHJ1ZSlcbiAgICAgICAgOiBzLmdldE5vZGVzKCksIFtvbmx5UmVuZGVyVmlzaWJsZV0pKTtcbiAgICByZXR1cm4gbm9kZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVUeXBlcyhub2RlVHlwZXMpIHtcbiAgICBjb25zdCBzdGFuZGFyZFR5cGVzID0ge1xuICAgICAgICBpbnB1dDogd3JhcE5vZGUoKG5vZGVUeXBlcy5pbnB1dCB8fCBJbnB1dE5vZGUkMSkpLFxuICAgICAgICBkZWZhdWx0OiB3cmFwTm9kZSgobm9kZVR5cGVzLmRlZmF1bHQgfHwgRGVmYXVsdE5vZGUkMSkpLFxuICAgICAgICBvdXRwdXQ6IHdyYXBOb2RlKChub2RlVHlwZXMub3V0cHV0IHx8IE91dHB1dE5vZGUkMSkpLFxuICAgICAgICBncm91cDogd3JhcE5vZGUoKG5vZGVUeXBlcy5ncm91cCB8fCBHcm91cE5vZGUpKSxcbiAgICB9O1xuICAgIGNvbnN0IHdyYXBwZWRUeXBlcyA9IHt9O1xuICAgIGNvbnN0IHNwZWNpYWxUeXBlcyA9IE9iamVjdC5rZXlzKG5vZGVUeXBlcylcbiAgICAgICAgLmZpbHRlcigoaykgPT4gIVsnaW5wdXQnLCAnZGVmYXVsdCcsICdvdXRwdXQnLCAnZ3JvdXAnXS5pbmNsdWRlcyhrKSlcbiAgICAgICAgLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcbiAgICAgICAgcmVzW2tleV0gPSB3cmFwTm9kZSgobm9kZVR5cGVzW2tleV0gfHwgRGVmYXVsdE5vZGUkMSkpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHdyYXBwZWRUeXBlcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhbmRhcmRUeXBlcyxcbiAgICAgICAgLi4uc3BlY2lhbFR5cGVzLFxuICAgIH07XG59XG5jb25zdCBnZXRQb3NpdGlvbldpdGhPcmlnaW4gPSAoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW4sIH0pID0+IHtcbiAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHsgeCwgeSB9O1xuICAgIH1cbiAgICBpZiAob3JpZ2luWzBdIDwgMCB8fCBvcmlnaW5bMV0gPCAwIHx8IG9yaWdpblswXSA+IDEgfHwgb3JpZ2luWzFdID4gMSkge1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IHggLSB3aWR0aCAqIG9yaWdpblswXSxcbiAgICAgICAgeTogeSAtIGhlaWdodCAqIG9yaWdpblsxXSxcbiAgICB9O1xufTtcblxuY29uc3Qgc2VsZWN0b3IkNSA9IChzKSA9PiAoe1xuICAgIG5vZGVzRHJhZ2dhYmxlOiBzLm5vZGVzRHJhZ2dhYmxlLFxuICAgIG5vZGVzQ29ubmVjdGFibGU6IHMubm9kZXNDb25uZWN0YWJsZSxcbiAgICBub2Rlc0ZvY3VzYWJsZTogcy5ub2Rlc0ZvY3VzYWJsZSxcbiAgICBlbGVtZW50c1NlbGVjdGFibGU6IHMuZWxlbWVudHNTZWxlY3RhYmxlLFxuICAgIHVwZGF0ZU5vZGVEaW1lbnNpb25zOiBzLnVwZGF0ZU5vZGVEaW1lbnNpb25zLFxuICAgIG9uRXJyb3I6IHMub25FcnJvcixcbn0pO1xuY29uc3QgTm9kZVJlbmRlcmVyID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBub2Rlc0RyYWdnYWJsZSwgbm9kZXNDb25uZWN0YWJsZSwgbm9kZXNGb2N1c2FibGUsIGVsZW1lbnRzU2VsZWN0YWJsZSwgdXBkYXRlTm9kZURpbWVuc2lvbnMsIG9uRXJyb3IgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJDUsIHNoYWxsb3cpO1xuICAgIGNvbnN0IG5vZGVzID0gdXNlVmlzaWJsZU5vZGVzKHByb3BzLm9ubHlSZW5kZXJWaXNpYmxlRWxlbWVudHMpO1xuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyUmVmID0gdXNlUmVmKCk7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgICAgICAgICAgIGlkOiBlbnRyeS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyksXG4gICAgICAgICAgICAgICAgbm9kZUVsZW1lbnQ6IGVudHJ5LnRhcmdldCxcbiAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHVwZGF0ZU5vZGVEaW1lbnNpb25zKHVwZGF0ZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXJSZWYuY3VycmVudCA9IG9ic2VydmVyO1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7XG4gICAgfSwgW10pO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlclJlZj8uY3VycmVudD8uZGlzY29ubmVjdCgpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fbm9kZXNcIiwgc3R5bGU6IGNvbnRhaW5lclN0eWxlIH0sIG5vZGVzLm1hcCgobm9kZSkgPT4ge1xuICAgICAgICBsZXQgbm9kZVR5cGUgPSBub2RlLnR5cGUgfHwgJ2RlZmF1bHQnO1xuICAgICAgICBpZiAoIXByb3BzLm5vZGVUeXBlc1tub2RlVHlwZV0pIHtcbiAgICAgICAgICAgIG9uRXJyb3I/LignMDAzJywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDMnXShub2RlVHlwZSkpO1xuICAgICAgICAgICAgbm9kZVR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgTm9kZUNvbXBvbmVudCA9IChwcm9wcy5ub2RlVHlwZXNbbm9kZVR5cGVdIHx8IHByb3BzLm5vZGVUeXBlcy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgaXNEcmFnZ2FibGUgPSAhIShub2RlLmRyYWdnYWJsZSB8fCAobm9kZXNEcmFnZ2FibGUgJiYgdHlwZW9mIG5vZGUuZHJhZ2dhYmxlID09PSAndW5kZWZpbmVkJykpO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGFibGUgPSAhIShub2RlLnNlbGVjdGFibGUgfHwgKGVsZW1lbnRzU2VsZWN0YWJsZSAmJiB0eXBlb2Ygbm9kZS5zZWxlY3RhYmxlID09PSAndW5kZWZpbmVkJykpO1xuICAgICAgICBjb25zdCBpc0Nvbm5lY3RhYmxlID0gISEobm9kZS5jb25uZWN0YWJsZSB8fCAobm9kZXNDb25uZWN0YWJsZSAmJiB0eXBlb2Ygbm9kZS5jb25uZWN0YWJsZSA9PT0gJ3VuZGVmaW5lZCcpKTtcbiAgICAgICAgY29uc3QgaXNGb2N1c2FibGUgPSAhIShub2RlLmZvY3VzYWJsZSB8fCAobm9kZXNGb2N1c2FibGUgJiYgdHlwZW9mIG5vZGUuZm9jdXNhYmxlID09PSAndW5kZWZpbmVkJykpO1xuICAgICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBwcm9wcy5ub2RlRXh0ZW50XG4gICAgICAgICAgICA/IGNsYW1wUG9zaXRpb24obm9kZS5wb3NpdGlvbkFic29sdXRlLCBwcm9wcy5ub2RlRXh0ZW50KVxuICAgICAgICAgICAgOiBub2RlLnBvc2l0aW9uQWJzb2x1dGU7XG4gICAgICAgIGNvbnN0IHBvc1ggPSBjbGFtcGVkUG9zaXRpb24/LnggPz8gMDtcbiAgICAgICAgY29uc3QgcG9zWSA9IGNsYW1wZWRQb3NpdGlvbj8ueSA/PyAwO1xuICAgICAgICBjb25zdCBwb3NPcmlnaW4gPSBnZXRQb3NpdGlvbldpdGhPcmlnaW4oe1xuICAgICAgICAgICAgeDogcG9zWCxcbiAgICAgICAgICAgIHk6IHBvc1ksXG4gICAgICAgICAgICB3aWR0aDogbm9kZS53aWR0aCA/PyAwLFxuICAgICAgICAgICAgaGVpZ2h0OiBub2RlLmhlaWdodCA/PyAwLFxuICAgICAgICAgICAgb3JpZ2luOiBwcm9wcy5ub2RlT3JpZ2luLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVDb21wb25lbnQsIHsga2V5OiBub2RlLmlkLCBpZDogbm9kZS5pZCwgY2xhc3NOYW1lOiBub2RlLmNsYXNzTmFtZSwgc3R5bGU6IG5vZGUuc3R5bGUsIHR5cGU6IG5vZGVUeXBlLCBkYXRhOiBub2RlLmRhdGEsIHNvdXJjZVBvc2l0aW9uOiBub2RlLnNvdXJjZVBvc2l0aW9uIHx8IFBvc2l0aW9uLkJvdHRvbSwgdGFyZ2V0UG9zaXRpb246IG5vZGUudGFyZ2V0UG9zaXRpb24gfHwgUG9zaXRpb24uVG9wLCBoaWRkZW46IG5vZGUuaGlkZGVuLCB4UG9zOiBwb3NYLCB5UG9zOiBwb3NZLCB4UG9zT3JpZ2luOiBwb3NPcmlnaW4ueCwgeVBvc09yaWdpbjogcG9zT3JpZ2luLnksIHNlbGVjdE5vZGVzT25EcmFnOiBwcm9wcy5zZWxlY3ROb2Rlc09uRHJhZywgb25DbGljazogcHJvcHMub25Ob2RlQ2xpY2ssIG9uTW91c2VFbnRlcjogcHJvcHMub25Ob2RlTW91c2VFbnRlciwgb25Nb3VzZU1vdmU6IHByb3BzLm9uTm9kZU1vdXNlTW92ZSwgb25Nb3VzZUxlYXZlOiBwcm9wcy5vbk5vZGVNb3VzZUxlYXZlLCBvbkNvbnRleHRNZW51OiBwcm9wcy5vbk5vZGVDb250ZXh0TWVudSwgb25Eb3VibGVDbGljazogcHJvcHMub25Ob2RlRG91YmxlQ2xpY2ssIHNlbGVjdGVkOiAhIW5vZGUuc2VsZWN0ZWQsIGlzRHJhZ2dhYmxlOiBpc0RyYWdnYWJsZSwgaXNTZWxlY3RhYmxlOiBpc1NlbGVjdGFibGUsIGlzQ29ubmVjdGFibGU6IGlzQ29ubmVjdGFibGUsIGlzRm9jdXNhYmxlOiBpc0ZvY3VzYWJsZSwgcmVzaXplT2JzZXJ2ZXI6IHJlc2l6ZU9ic2VydmVyLCBkcmFnSGFuZGxlOiBub2RlLmRyYWdIYW5kbGUsIHpJbmRleDogbm9kZVtpbnRlcm5hbHNTeW1ib2xdPy56ID8/IDAsIGlzUGFyZW50OiAhIW5vZGVbaW50ZXJuYWxzU3ltYm9sXT8uaXNQYXJlbnQsIG5vRHJhZ0NsYXNzTmFtZTogcHJvcHMubm9EcmFnQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZTogcHJvcHMubm9QYW5DbGFzc05hbWUsIGluaXRpYWxpemVkOiAhIW5vZGUud2lkdGggJiYgISFub2RlLmhlaWdodCwgcmZJZDogcHJvcHMucmZJZCwgZGlzYWJsZUtleWJvYXJkQTExeTogcHJvcHMuZGlzYWJsZUtleWJvYXJkQTExeSwgYXJpYUxhYmVsOiBub2RlLmFyaWFMYWJlbCwgaGFzSGFuZGxlQm91bmRzOiAhIW5vZGVbaW50ZXJuYWxzU3ltYm9sXT8uaGFuZGxlQm91bmRzIH0pKTtcbiAgICB9KSkpO1xufTtcbk5vZGVSZW5kZXJlci5kaXNwbGF5TmFtZSA9ICdOb2RlUmVuZGVyZXInO1xudmFyIE5vZGVSZW5kZXJlciQxID0gbWVtbyhOb2RlUmVuZGVyZXIpO1xuXG5jb25zdCBzaGlmdFggPSAoeCwgc2hpZnQsIHBvc2l0aW9uKSA9PiB7XG4gICAgaWYgKHBvc2l0aW9uID09PSBQb3NpdGlvbi5MZWZ0KVxuICAgICAgICByZXR1cm4geCAtIHNoaWZ0O1xuICAgIGlmIChwb3NpdGlvbiA9PT0gUG9zaXRpb24uUmlnaHQpXG4gICAgICAgIHJldHVybiB4ICsgc2hpZnQ7XG4gICAgcmV0dXJuIHg7XG59O1xuY29uc3Qgc2hpZnRZID0gKHksIHNoaWZ0LCBwb3NpdGlvbikgPT4ge1xuICAgIGlmIChwb3NpdGlvbiA9PT0gUG9zaXRpb24uVG9wKVxuICAgICAgICByZXR1cm4geSAtIHNoaWZ0O1xuICAgIGlmIChwb3NpdGlvbiA9PT0gUG9zaXRpb24uQm90dG9tKVxuICAgICAgICByZXR1cm4geSArIHNoaWZ0O1xuICAgIHJldHVybiB5O1xufTtcbmNvbnN0IEVkZ2VVcGRhdGVyQ2xhc3NOYW1lID0gJ3JlYWN0LWZsb3dfX2VkZ2V1cGRhdGVyJztcbmNvbnN0IEVkZ2VBbmNob3IgPSAoeyBwb3NpdGlvbiwgY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzID0gMTAsIG9uTW91c2VEb3duLCBvbk1vdXNlRW50ZXIsIG9uTW91c2VPdXQsIHR5cGUsIH0pID0+IChSZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHsgb25Nb3VzZURvd246IG9uTW91c2VEb3duLCBvbk1vdXNlRW50ZXI6IG9uTW91c2VFbnRlciwgb25Nb3VzZU91dDogb25Nb3VzZU91dCwgY2xhc3NOYW1lOiBjYyhbRWRnZVVwZGF0ZXJDbGFzc05hbWUsIGAke0VkZ2VVcGRhdGVyQ2xhc3NOYW1lfS0ke3R5cGV9YF0pLCBjeDogc2hpZnRYKGNlbnRlclgsIHJhZGl1cywgcG9zaXRpb24pLCBjeTogc2hpZnRZKGNlbnRlclksIHJhZGl1cywgcG9zaXRpb24pLCByOiByYWRpdXMsIHN0cm9rZTogXCJ0cmFuc3BhcmVudFwiLCBmaWxsOiBcInRyYW5zcGFyZW50XCIgfSkpO1xuXG5jb25zdCBhbHdheXNWYWxpZENvbm5lY3Rpb24gPSAoKSA9PiB0cnVlO1xudmFyIHdyYXBFZGdlID0gKEVkZ2VDb21wb25lbnQpID0+IHtcbiAgICBjb25zdCBFZGdlV3JhcHBlciA9ICh7IGlkLCBjbGFzc05hbWUsIHR5cGUsIGRhdGEsIG9uQ2xpY2ssIG9uRWRnZURvdWJsZUNsaWNrLCBzZWxlY3RlZCwgYW5pbWF0ZWQsIGxhYmVsLCBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZywgbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1cywgc3R5bGUsIHNvdXJjZSwgdGFyZ2V0LCBzb3VyY2VYLCBzb3VyY2VZLCB0YXJnZXRYLCB0YXJnZXRZLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb24sIGVsZW1lbnRzU2VsZWN0YWJsZSwgaGlkZGVuLCBzb3VyY2VIYW5kbGVJZCwgdGFyZ2V0SGFuZGxlSWQsIG9uQ29udGV4dE1lbnUsIG9uTW91c2VFbnRlciwgb25Nb3VzZU1vdmUsIG9uTW91c2VMZWF2ZSwgcmVjb25uZWN0UmFkaXVzLCBvblJlY29ubmVjdCwgb25SZWNvbm5lY3RTdGFydCwgb25SZWNvbm5lY3RFbmQsIG1hcmtlckVuZCwgbWFya2VyU3RhcnQsIHJmSWQsIGFyaWFMYWJlbCwgaXNGb2N1c2FibGUsIGlzUmVjb25uZWN0YWJsZSwgcGF0aE9wdGlvbnMsIGludGVyYWN0aW9uV2lkdGgsIGRpc2FibGVLZXlib2FyZEExMXksIH0pID0+IHtcbiAgICAgICAgY29uc3QgZWRnZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgICAgICAgY29uc3QgW3VwZGF0ZUhvdmVyLCBzZXRVcGRhdGVIb3Zlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgICAgIGNvbnN0IFt1cGRhdGluZywgc2V0VXBkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgICAgIGNvbnN0IG1hcmtlclN0YXJ0VXJsID0gdXNlTWVtbygoKSA9PiBgdXJsKCcjJHtnZXRNYXJrZXJJZChtYXJrZXJTdGFydCwgcmZJZCl9JylgLCBbbWFya2VyU3RhcnQsIHJmSWRdKTtcbiAgICAgICAgY29uc3QgbWFya2VyRW5kVXJsID0gdXNlTWVtbygoKSA9PiBgdXJsKCcjJHtnZXRNYXJrZXJJZChtYXJrZXJFbmQsIHJmSWQpfScpYCwgW21hcmtlckVuZCwgcmZJZF0pO1xuICAgICAgICBpZiAoaGlkZGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbkVkZ2VDbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBlZGdlcywgYWRkU2VsZWN0ZWRFZGdlcywgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzLCBtdWx0aVNlbGVjdGlvbkFjdGl2ZSB9ID0gc3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlcy5maW5kKChlKSA9PiBlLmlkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAoIWVkZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudHNTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBub2Rlc1NlbGVjdGlvbkFjdGl2ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2Uuc2VsZWN0ZWQgJiYgbXVsdGlTZWxlY3Rpb25BY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3ROb2Rlc0FuZEVkZ2VzKHsgbm9kZXM6IFtdLCBlZGdlczogW2VkZ2VdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlZGdlUmVmLmN1cnJlbnQ/LmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlbGVjdGVkRWRnZXMoW2lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICAgICAgICBvbkNsaWNrKGV2ZW50LCBlZGdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FZGdlRG91YmxlQ2xpY2tIYW5kbGVyID0gZ2V0TW91c2VIYW5kbGVyJDEoaWQsIHN0b3JlLmdldFN0YXRlLCBvbkVkZ2VEb3VibGVDbGljayk7XG4gICAgICAgIGNvbnN0IG9uRWRnZUNvbnRleHRNZW51ID0gZ2V0TW91c2VIYW5kbGVyJDEoaWQsIHN0b3JlLmdldFN0YXRlLCBvbkNvbnRleHRNZW51KTtcbiAgICAgICAgY29uc3Qgb25FZGdlTW91c2VFbnRlciA9IGdldE1vdXNlSGFuZGxlciQxKGlkLCBzdG9yZS5nZXRTdGF0ZSwgb25Nb3VzZUVudGVyKTtcbiAgICAgICAgY29uc3Qgb25FZGdlTW91c2VNb3ZlID0gZ2V0TW91c2VIYW5kbGVyJDEoaWQsIHN0b3JlLmdldFN0YXRlLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGNvbnN0IG9uRWRnZU1vdXNlTGVhdmUgPSBnZXRNb3VzZUhhbmRsZXIkMShpZCwgc3RvcmUuZ2V0U3RhdGUsIG9uTW91c2VMZWF2ZSk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUVkZ2VVcGRhdGVyID0gKGV2ZW50LCBpc1NvdXJjZUhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgLy8gYXZvaWQgdHJpZ2dlcmluZyBlZGdlIHVwZGF0ZXIgaWYgbW91c2UgYnRuIGlzIG5vdCBsZWZ0XG4gICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBlZGdlcywgaXNWYWxpZENvbm5lY3Rpb246IGlzVmFsaWRDb25uZWN0aW9uU3RvcmUgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgICBjb25zdCBub2RlSWQgPSBpc1NvdXJjZUhhbmRsZSA/IHRhcmdldCA6IHNvdXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUlkID0gKGlzU291cmNlSGFuZGxlID8gdGFyZ2V0SGFuZGxlSWQgOiBzb3VyY2VIYW5kbGVJZCkgfHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVR5cGUgPSBpc1NvdXJjZUhhbmRsZSA/ICd0YXJnZXQnIDogJ3NvdXJjZSc7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkQ29ubmVjdGlvbiA9IGlzVmFsaWRDb25uZWN0aW9uU3RvcmUgfHwgYWx3YXlzVmFsaWRDb25uZWN0aW9uO1xuICAgICAgICAgICAgY29uc3QgaXNUYXJnZXQgPSBpc1NvdXJjZUhhbmRsZTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlcy5maW5kKChlKSA9PiBlLmlkID09PSBpZCk7XG4gICAgICAgICAgICBzZXRVcGRhdGluZyh0cnVlKTtcbiAgICAgICAgICAgIG9uUmVjb25uZWN0U3RhcnQ/LihldmVudCwgZWRnZSwgaGFuZGxlVHlwZSk7XG4gICAgICAgICAgICBjb25zdCBfb25SZWNvbm5lY3RFbmQgPSAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VXBkYXRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgIG9uUmVjb25uZWN0RW5kPy4oZXZ0LCBlZGdlLCBoYW5kbGVUeXBlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBvbkNvbm5lY3RFZGdlID0gKGNvbm5lY3Rpb24pID0+IG9uUmVjb25uZWN0Py4oZWRnZSwgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBoYW5kbGVQb2ludGVyRG93bih7XG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgaGFuZGxlSWQsXG4gICAgICAgICAgICAgICAgbm9kZUlkLFxuICAgICAgICAgICAgICAgIG9uQ29ubmVjdDogb25Db25uZWN0RWRnZSxcbiAgICAgICAgICAgICAgICBpc1RhcmdldCxcbiAgICAgICAgICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgICAgICAgICAgc2V0U3RhdGU6IHN0b3JlLnNldFN0YXRlLFxuICAgICAgICAgICAgICAgIGlzVmFsaWRDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGVkZ2VVcGRhdGVyVHlwZTogaGFuZGxlVHlwZSxcbiAgICAgICAgICAgICAgICBvblJlY29ubmVjdEVuZDogX29uUmVjb25uZWN0RW5kLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uRWRnZVVwZGF0ZXJTb3VyY2VNb3VzZURvd24gPSAoZXZlbnQpID0+IGhhbmRsZUVkZ2VVcGRhdGVyKGV2ZW50LCB0cnVlKTtcbiAgICAgICAgY29uc3Qgb25FZGdlVXBkYXRlclRhcmdldE1vdXNlRG93biA9IChldmVudCkgPT4gaGFuZGxlRWRnZVVwZGF0ZXIoZXZlbnQsIGZhbHNlKTtcbiAgICAgICAgY29uc3Qgb25FZGdlVXBkYXRlck1vdXNlRW50ZXIgPSAoKSA9PiBzZXRVcGRhdGVIb3Zlcih0cnVlKTtcbiAgICAgICAgY29uc3Qgb25FZGdlVXBkYXRlck1vdXNlT3V0ID0gKCkgPT4gc2V0VXBkYXRlSG92ZXIoZmFsc2UpO1xuICAgICAgICBjb25zdCBpbmFjdGl2ZSA9ICFlbGVtZW50c1NlbGVjdGFibGUgJiYgIW9uQ2xpY2s7XG4gICAgICAgIGNvbnN0IG9uS2V5RG93biA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkaXNhYmxlS2V5Ym9hcmRBMTF5ICYmIGVsZW1lbnRTZWxlY3Rpb25LZXlzLmluY2x1ZGVzKGV2ZW50LmtleSkgJiYgZWxlbWVudHNTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB1bnNlbGVjdE5vZGVzQW5kRWRnZXMsIGFkZFNlbGVjdGVkRWRnZXMsIGVkZ2VzIH0gPSBzdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuc2VsZWN0ID0gZXZlbnQua2V5ID09PSAnRXNjYXBlJztcbiAgICAgICAgICAgICAgICBpZiAodW5zZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZWRnZVJlZi5jdXJyZW50Py5ibHVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0Tm9kZXNBbmRFZGdlcyh7IGVkZ2VzOiBbZWRnZXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFNlbGVjdGVkRWRnZXMoW2lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHsgY2xhc3NOYW1lOiBjYyhbXG4gICAgICAgICAgICAgICAgJ3JlYWN0LWZsb3dfX2VkZ2UnLFxuICAgICAgICAgICAgICAgIGByZWFjdC1mbG93X19lZGdlLSR7dHlwZX1gLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICB7IHNlbGVjdGVkLCBhbmltYXRlZCwgaW5hY3RpdmUsIHVwZGF0aW5nOiB1cGRhdGVIb3ZlciB9LFxuICAgICAgICAgICAgXSksIG9uQ2xpY2s6IG9uRWRnZUNsaWNrLCBvbkRvdWJsZUNsaWNrOiBvbkVkZ2VEb3VibGVDbGlja0hhbmRsZXIsIG9uQ29udGV4dE1lbnU6IG9uRWRnZUNvbnRleHRNZW51LCBvbk1vdXNlRW50ZXI6IG9uRWRnZU1vdXNlRW50ZXIsIG9uTW91c2VNb3ZlOiBvbkVkZ2VNb3VzZU1vdmUsIG9uTW91c2VMZWF2ZTogb25FZGdlTW91c2VMZWF2ZSwgb25LZXlEb3duOiBpc0ZvY3VzYWJsZSA/IG9uS2V5RG93biA6IHVuZGVmaW5lZCwgdGFiSW5kZXg6IGlzRm9jdXNhYmxlID8gMCA6IHVuZGVmaW5lZCwgcm9sZTogaXNGb2N1c2FibGUgPyAnYnV0dG9uJyA6ICdpbWcnLCBcImRhdGEtdGVzdGlkXCI6IGByZl9fZWRnZS0ke2lkfWAsIFwiYXJpYS1sYWJlbFwiOiBhcmlhTGFiZWwgPT09IG51bGwgPyB1bmRlZmluZWQgOiBhcmlhTGFiZWwgPyBhcmlhTGFiZWwgOiBgRWRnZSBmcm9tICR7c291cmNlfSB0byAke3RhcmdldH1gLCBcImFyaWEtZGVzY3JpYmVkYnlcIjogaXNGb2N1c2FibGUgPyBgJHtBUklBX0VER0VfREVTQ19LRVl9LSR7cmZJZH1gIDogdW5kZWZpbmVkLCByZWY6IGVkZ2VSZWYgfSxcbiAgICAgICAgICAgICF1cGRhdGluZyAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChFZGdlQ29tcG9uZW50LCB7IGlkOiBpZCwgc291cmNlOiBzb3VyY2UsIHRhcmdldDogdGFyZ2V0LCBzZWxlY3RlZDogc2VsZWN0ZWQsIGFuaW1hdGVkOiBhbmltYXRlZCwgbGFiZWw6IGxhYmVsLCBsYWJlbFN0eWxlOiBsYWJlbFN0eWxlLCBsYWJlbFNob3dCZzogbGFiZWxTaG93QmcsIGxhYmVsQmdTdHlsZTogbGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogbGFiZWxCZ1BhZGRpbmcsIGxhYmVsQmdCb3JkZXJSYWRpdXM6IGxhYmVsQmdCb3JkZXJSYWRpdXMsIGRhdGE6IGRhdGEsIHN0eWxlOiBzdHlsZSwgc291cmNlWDogc291cmNlWCwgc291cmNlWTogc291cmNlWSwgdGFyZ2V0WDogdGFyZ2V0WCwgdGFyZ2V0WTogdGFyZ2V0WSwgc291cmNlUG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLCB0YXJnZXRQb3NpdGlvbjogdGFyZ2V0UG9zaXRpb24sIHNvdXJjZUhhbmRsZUlkOiBzb3VyY2VIYW5kbGVJZCwgdGFyZ2V0SGFuZGxlSWQ6IHRhcmdldEhhbmRsZUlkLCBtYXJrZXJTdGFydDogbWFya2VyU3RhcnRVcmwsIG1hcmtlckVuZDogbWFya2VyRW5kVXJsLCBwYXRoT3B0aW9uczogcGF0aE9wdGlvbnMsIGludGVyYWN0aW9uV2lkdGg6IGludGVyYWN0aW9uV2lkdGggfSkpLFxuICAgICAgICAgICAgaXNSZWNvbm5lY3RhYmxlICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgIChpc1JlY29ubmVjdGFibGUgPT09ICdzb3VyY2UnIHx8IGlzUmVjb25uZWN0YWJsZSA9PT0gdHJ1ZSkgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRWRnZUFuY2hvciwgeyBwb3NpdGlvbjogc291cmNlUG9zaXRpb24sIGNlbnRlclg6IHNvdXJjZVgsIGNlbnRlclk6IHNvdXJjZVksIHJhZGl1czogcmVjb25uZWN0UmFkaXVzLCBvbk1vdXNlRG93bjogb25FZGdlVXBkYXRlclNvdXJjZU1vdXNlRG93biwgb25Nb3VzZUVudGVyOiBvbkVkZ2VVcGRhdGVyTW91c2VFbnRlciwgb25Nb3VzZU91dDogb25FZGdlVXBkYXRlck1vdXNlT3V0LCB0eXBlOiBcInNvdXJjZVwiIH0pKSxcbiAgICAgICAgICAgICAgICAoaXNSZWNvbm5lY3RhYmxlID09PSAndGFyZ2V0JyB8fCBpc1JlY29ubmVjdGFibGUgPT09IHRydWUpICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KEVkZ2VBbmNob3IsIHsgcG9zaXRpb246IHRhcmdldFBvc2l0aW9uLCBjZW50ZXJYOiB0YXJnZXRYLCBjZW50ZXJZOiB0YXJnZXRZLCByYWRpdXM6IHJlY29ubmVjdFJhZGl1cywgb25Nb3VzZURvd246IG9uRWRnZVVwZGF0ZXJUYXJnZXRNb3VzZURvd24sIG9uTW91c2VFbnRlcjogb25FZGdlVXBkYXRlck1vdXNlRW50ZXIsIG9uTW91c2VPdXQ6IG9uRWRnZVVwZGF0ZXJNb3VzZU91dCwgdHlwZTogXCJ0YXJnZXRcIiB9KSkpKSkpO1xuICAgIH07XG4gICAgRWRnZVdyYXBwZXIuZGlzcGxheU5hbWUgPSAnRWRnZVdyYXBwZXInO1xuICAgIHJldHVybiBtZW1vKEVkZ2VXcmFwcGVyKTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUVkZ2VUeXBlcyhlZGdlVHlwZXMpIHtcbiAgICBjb25zdCBzdGFuZGFyZFR5cGVzID0ge1xuICAgICAgICBkZWZhdWx0OiB3cmFwRWRnZSgoZWRnZVR5cGVzLmRlZmF1bHQgfHwgQmV6aWVyRWRnZSkpLFxuICAgICAgICBzdHJhaWdodDogd3JhcEVkZ2UoKGVkZ2VUeXBlcy5iZXppZXIgfHwgU3RyYWlnaHRFZGdlKSksXG4gICAgICAgIHN0ZXA6IHdyYXBFZGdlKChlZGdlVHlwZXMuc3RlcCB8fCBTdGVwRWRnZSkpLFxuICAgICAgICBzbW9vdGhzdGVwOiB3cmFwRWRnZSgoZWRnZVR5cGVzLnN0ZXAgfHwgU21vb3RoU3RlcEVkZ2UpKSxcbiAgICAgICAgc2ltcGxlYmV6aWVyOiB3cmFwRWRnZSgoZWRnZVR5cGVzLnNpbXBsZWJlemllciB8fCBTaW1wbGVCZXppZXJFZGdlKSksXG4gICAgfTtcbiAgICBjb25zdCB3cmFwcGVkVHlwZXMgPSB7fTtcbiAgICBjb25zdCBzcGVjaWFsVHlwZXMgPSBPYmplY3Qua2V5cyhlZGdlVHlwZXMpXG4gICAgICAgIC5maWx0ZXIoKGspID0+ICFbJ2RlZmF1bHQnLCAnYmV6aWVyJ10uaW5jbHVkZXMoaykpXG4gICAgICAgIC5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XG4gICAgICAgIHJlc1trZXldID0gd3JhcEVkZ2UoKGVkZ2VUeXBlc1trZXldIHx8IEJlemllckVkZ2UpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB3cmFwcGVkVHlwZXMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YW5kYXJkVHlwZXMsXG4gICAgICAgIC4uLnNwZWNpYWxUeXBlcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0SGFuZGxlUG9zaXRpb24ocG9zaXRpb24sIG5vZGVSZWN0LCBoYW5kbGUgPSBudWxsKSB7XG4gICAgY29uc3QgeCA9IChoYW5kbGU/LnggfHwgMCkgKyBub2RlUmVjdC54O1xuICAgIGNvbnN0IHkgPSAoaGFuZGxlPy55IHx8IDApICsgbm9kZVJlY3QueTtcbiAgICBjb25zdCB3aWR0aCA9IGhhbmRsZT8ud2lkdGggfHwgbm9kZVJlY3Qud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gaGFuZGxlPy5oZWlnaHQgfHwgbm9kZVJlY3QuaGVpZ2h0O1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgICAgY2FzZSBQb3NpdGlvbi5Ub3A6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IHggKyB3aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgUG9zaXRpb24uUmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IHggKyB3aWR0aCxcbiAgICAgICAgICAgICAgICB5OiB5ICsgaGVpZ2h0IC8gMixcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgUG9zaXRpb24uQm90dG9tOlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiB4ICsgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHk6IHkgKyBoZWlnaHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICBjYXNlIFBvc2l0aW9uLkxlZnQ6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgeTogeSArIGhlaWdodCAvIDIsXG4gICAgICAgICAgICB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEhhbmRsZShib3VuZHMsIGhhbmRsZUlkKSB7XG4gICAgaWYgKCFib3VuZHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChib3VuZHMubGVuZ3RoID09PSAxIHx8ICFoYW5kbGVJZCkge1xuICAgICAgICByZXR1cm4gYm91bmRzWzBdO1xuICAgIH1cbiAgICBlbHNlIGlmIChoYW5kbGVJZCkge1xuICAgICAgICByZXR1cm4gYm91bmRzLmZpbmQoKGQpID0+IGQuaWQgPT09IGhhbmRsZUlkKSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IGdldEVkZ2VQb3NpdGlvbnMgPSAoc291cmNlTm9kZVJlY3QsIHNvdXJjZUhhbmRsZSwgc291cmNlUG9zaXRpb24sIHRhcmdldE5vZGVSZWN0LCB0YXJnZXRIYW5kbGUsIHRhcmdldFBvc2l0aW9uKSA9PiB7XG4gICAgY29uc3Qgc291cmNlSGFuZGxlUG9zID0gZ2V0SGFuZGxlUG9zaXRpb24oc291cmNlUG9zaXRpb24sIHNvdXJjZU5vZGVSZWN0LCBzb3VyY2VIYW5kbGUpO1xuICAgIGNvbnN0IHRhcmdldEhhbmRsZVBvcyA9IGdldEhhbmRsZVBvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCB0YXJnZXROb2RlUmVjdCwgdGFyZ2V0SGFuZGxlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2VYOiBzb3VyY2VIYW5kbGVQb3MueCxcbiAgICAgICAgc291cmNlWTogc291cmNlSGFuZGxlUG9zLnksXG4gICAgICAgIHRhcmdldFg6IHRhcmdldEhhbmRsZVBvcy54LFxuICAgICAgICB0YXJnZXRZOiB0YXJnZXRIYW5kbGVQb3MueSxcbiAgICB9O1xufTtcbmZ1bmN0aW9uIGlzRWRnZVZpc2libGUoeyBzb3VyY2VQb3MsIHRhcmdldFBvcywgc291cmNlV2lkdGgsIHNvdXJjZUhlaWdodCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgd2lkdGgsIGhlaWdodCwgdHJhbnNmb3JtLCB9KSB7XG4gICAgY29uc3QgZWRnZUJveCA9IHtcbiAgICAgICAgeDogTWF0aC5taW4oc291cmNlUG9zLngsIHRhcmdldFBvcy54KSxcbiAgICAgICAgeTogTWF0aC5taW4oc291cmNlUG9zLnksIHRhcmdldFBvcy55KSxcbiAgICAgICAgeDI6IE1hdGgubWF4KHNvdXJjZVBvcy54ICsgc291cmNlV2lkdGgsIHRhcmdldFBvcy54ICsgdGFyZ2V0V2lkdGgpLFxuICAgICAgICB5MjogTWF0aC5tYXgoc291cmNlUG9zLnkgKyBzb3VyY2VIZWlnaHQsIHRhcmdldFBvcy55ICsgdGFyZ2V0SGVpZ2h0KSxcbiAgICB9O1xuICAgIGlmIChlZGdlQm94LnggPT09IGVkZ2VCb3gueDIpIHtcbiAgICAgICAgZWRnZUJveC54MiArPSAxO1xuICAgIH1cbiAgICBpZiAoZWRnZUJveC55ID09PSBlZGdlQm94LnkyKSB7XG4gICAgICAgIGVkZ2VCb3gueTIgKz0gMTtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveCA9IHJlY3RUb0JveCh7XG4gICAgICAgIHg6ICgwIC0gdHJhbnNmb3JtWzBdKSAvIHRyYW5zZm9ybVsyXSxcbiAgICAgICAgeTogKDAgLSB0cmFuc2Zvcm1bMV0pIC8gdHJhbnNmb3JtWzJdLFxuICAgICAgICB3aWR0aDogd2lkdGggLyB0cmFuc2Zvcm1bMl0sXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC8gdHJhbnNmb3JtWzJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHhPdmVybGFwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmlld0JveC54MiwgZWRnZUJveC54MikgLSBNYXRoLm1heCh2aWV3Qm94LngsIGVkZ2VCb3gueCkpO1xuICAgIGNvbnN0IHlPdmVybGFwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odmlld0JveC55MiwgZWRnZUJveC55MikgLSBNYXRoLm1heCh2aWV3Qm94LnksIGVkZ2VCb3gueSkpO1xuICAgIGNvbnN0IG92ZXJsYXBwaW5nQXJlYSA9IE1hdGguY2VpbCh4T3ZlcmxhcCAqIHlPdmVybGFwKTtcbiAgICByZXR1cm4gb3ZlcmxhcHBpbmdBcmVhID4gMDtcbn1cbmZ1bmN0aW9uIGdldE5vZGVEYXRhKG5vZGUpIHtcbiAgICBjb25zdCBoYW5kbGVCb3VuZHMgPSBub2RlPy5baW50ZXJuYWxzU3ltYm9sXT8uaGFuZGxlQm91bmRzIHx8IG51bGw7XG4gICAgY29uc3QgaXNWYWxpZCA9IGhhbmRsZUJvdW5kcyAmJlxuICAgICAgICBub2RlPy53aWR0aCAmJlxuICAgICAgICBub2RlPy5oZWlnaHQgJiZcbiAgICAgICAgdHlwZW9mIG5vZGU/LnBvc2l0aW9uQWJzb2x1dGU/LnggIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBub2RlPy5wb3NpdGlvbkFic29sdXRlPy55ICE9PSAndW5kZWZpbmVkJztcbiAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgICB4OiBub2RlPy5wb3NpdGlvbkFic29sdXRlPy54IHx8IDAsXG4gICAgICAgICAgICB5OiBub2RlPy5wb3NpdGlvbkFic29sdXRlPy55IHx8IDAsXG4gICAgICAgICAgICB3aWR0aDogbm9kZT8ud2lkdGggfHwgMCxcbiAgICAgICAgICAgIGhlaWdodDogbm9kZT8uaGVpZ2h0IHx8IDAsXG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZUJvdW5kcyxcbiAgICAgICAgISFpc1ZhbGlkLFxuICAgIF07XG59XG5cbmNvbnN0IGRlZmF1bHRFZGdlVHJlZSA9IFt7IGxldmVsOiAwLCBpc01heExldmVsOiB0cnVlLCBlZGdlczogW10gfV07XG5mdW5jdGlvbiBncm91cEVkZ2VzQnlaTGV2ZWwoZWRnZXMsIG5vZGVJbnRlcm5hbHMsIGVsZXZhdGVFZGdlc09uU2VsZWN0ID0gZmFsc2UpIHtcbiAgICBsZXQgbWF4TGV2ZWwgPSAtMTtcbiAgICBjb25zdCBsZXZlbExvb2t1cCA9IGVkZ2VzLnJlZHVjZSgodHJlZSwgZWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNaSW5kZXggPSBpc051bWVyaWMoZWRnZS56SW5kZXgpO1xuICAgICAgICBsZXQgeiA9IGhhc1pJbmRleCA/IGVkZ2UuekluZGV4IDogMDtcbiAgICAgICAgaWYgKGVsZXZhdGVFZGdlc09uU2VsZWN0KSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gbm9kZUludGVybmFscy5nZXQoZWRnZS50YXJnZXQpO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KGVkZ2Uuc291cmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VPckNvbm5lY3RlZE5vZGVTZWxlY3RlZCA9IGVkZ2Uuc2VsZWN0ZWQgfHwgdGFyZ2V0Tm9kZT8uc2VsZWN0ZWQgfHwgc291cmNlTm9kZT8uc2VsZWN0ZWQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFpJbmRleCA9IE1hdGgubWF4KHNvdXJjZU5vZGU/LltpbnRlcm5hbHNTeW1ib2xdPy56IHx8IDAsIHRhcmdldE5vZGU/LltpbnRlcm5hbHNTeW1ib2xdPy56IHx8IDAsIDEwMDApO1xuICAgICAgICAgICAgeiA9IChoYXNaSW5kZXggPyBlZGdlLnpJbmRleCA6IDApICsgKGVkZ2VPckNvbm5lY3RlZE5vZGVTZWxlY3RlZCA/IHNlbGVjdGVkWkluZGV4IDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyZWVbel0pIHtcbiAgICAgICAgICAgIHRyZWVbel0ucHVzaChlZGdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyZWVbel0gPSBbZWRnZV07XG4gICAgICAgIH1cbiAgICAgICAgbWF4TGV2ZWwgPSB6ID4gbWF4TGV2ZWwgPyB6IDogbWF4TGV2ZWw7XG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBlZGdlVHJlZSA9IE9iamVjdC5lbnRyaWVzKGxldmVsTG9va3VwKS5tYXAoKFtrZXksIGVkZ2VzXSkgPT4ge1xuICAgICAgICBjb25zdCBsZXZlbCA9ICtrZXk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlZGdlcyxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgaXNNYXhMZXZlbDogbGV2ZWwgPT09IG1heExldmVsLFxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGlmIChlZGdlVHJlZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRFZGdlVHJlZTtcbiAgICB9XG4gICAgcmV0dXJuIGVkZ2VUcmVlO1xufVxuZnVuY3Rpb24gdXNlVmlzaWJsZUVkZ2VzKG9ubHlSZW5kZXJWaXNpYmxlLCBub2RlSW50ZXJuYWxzLCBlbGV2YXRlRWRnZXNPblNlbGVjdCkge1xuICAgIGNvbnN0IGVkZ2VzID0gdXNlU3RvcmUodXNlQ2FsbGJhY2soKHMpID0+IHtcbiAgICAgICAgaWYgKCFvbmx5UmVuZGVyVmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHMuZWRnZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHMuZWRnZXMuZmlsdGVyKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VOb2RlID0gbm9kZUludGVybmFscy5nZXQoZS5zb3VyY2UpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5vZGVJbnRlcm5hbHMuZ2V0KGUudGFyZ2V0KTtcbiAgICAgICAgICAgIHJldHVybiAoc291cmNlTm9kZT8ud2lkdGggJiZcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlPy5oZWlnaHQgJiZcbiAgICAgICAgICAgICAgICB0YXJnZXROb2RlPy53aWR0aCAmJlxuICAgICAgICAgICAgICAgIHRhcmdldE5vZGU/LmhlaWdodCAmJlxuICAgICAgICAgICAgICAgIGlzRWRnZVZpc2libGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQb3M6IHNvdXJjZU5vZGUucG9zaXRpb25BYnNvbHV0ZSB8fCB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UG9zOiB0YXJnZXROb2RlLnBvc2l0aW9uQWJzb2x1dGUgfHwgeyB4OiAwLCB5OiAwIH0sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVdpZHRoOiBzb3VyY2VOb2RlLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VIZWlnaHQ6IHNvdXJjZU5vZGUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aDogdGFyZ2V0Tm9kZS53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0OiB0YXJnZXROb2RlLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHMud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9LCBbb25seVJlbmRlclZpc2libGUsIG5vZGVJbnRlcm5hbHNdKSk7XG4gICAgcmV0dXJuIGdyb3VwRWRnZXNCeVpMZXZlbChlZGdlcywgbm9kZUludGVybmFscywgZWxldmF0ZUVkZ2VzT25TZWxlY3QpO1xufVxuXG5jb25zdCBBcnJvd1N5bWJvbCA9ICh7IGNvbG9yID0gJ25vbmUnLCBzdHJva2VXaWR0aCA9IDEgfSkgPT4ge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInBvbHlsaW5lXCIsIHsgc3R5bGU6IHtcbiAgICAgICAgICAgIHN0cm9rZTogY29sb3IsXG4gICAgICAgICAgICBzdHJva2VXaWR0aCxcbiAgICAgICAgfSwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgcG9pbnRzOiBcIi01LC00IDAsMCAtNSw0XCIgfSkpO1xufTtcbmNvbnN0IEFycm93Q2xvc2VkU3ltYm9sID0gKHsgY29sb3IgPSAnbm9uZScsIHN0cm9rZVdpZHRoID0gMSB9KSA9PiB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwicG9seWxpbmVcIiwgeyBzdHlsZToge1xuICAgICAgICAgICAgc3Ryb2tlOiBjb2xvcixcbiAgICAgICAgICAgIGZpbGw6IGNvbG9yLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGgsXG4gICAgICAgIH0sIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIiwgcG9pbnRzOiBcIi01LC00IDAsMCAtNSw0IC01LC00XCIgfSkpO1xufTtcbmNvbnN0IE1hcmtlclN5bWJvbHMgPSB7XG4gICAgW01hcmtlclR5cGUuQXJyb3ddOiBBcnJvd1N5bWJvbCxcbiAgICBbTWFya2VyVHlwZS5BcnJvd0Nsb3NlZF06IEFycm93Q2xvc2VkU3ltYm9sLFxufTtcbmZ1bmN0aW9uIHVzZU1hcmtlclN5bWJvbCh0eXBlKSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIGNvbnN0IHN5bWJvbCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBzeW1ib2xFeGlzdHMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoTWFya2VyU3ltYm9scywgdHlwZSk7XG4gICAgICAgIGlmICghc3ltYm9sRXhpc3RzKSB7XG4gICAgICAgICAgICBzdG9yZS5nZXRTdGF0ZSgpLm9uRXJyb3I/LignMDA5JywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDknXSh0eXBlKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWFya2VyU3ltYm9sc1t0eXBlXTtcbiAgICB9LCBbdHlwZV0pO1xuICAgIHJldHVybiBzeW1ib2w7XG59XG5cbmNvbnN0IE1hcmtlciA9ICh7IGlkLCB0eXBlLCBjb2xvciwgd2lkdGggPSAxMi41LCBoZWlnaHQgPSAxMi41LCBtYXJrZXJVbml0cyA9ICdzdHJva2VXaWR0aCcsIHN0cm9rZVdpZHRoLCBvcmllbnQgPSAnYXV0by1zdGFydC1yZXZlcnNlJywgfSkgPT4ge1xuICAgIGNvbnN0IFN5bWJvbCA9IHVzZU1hcmtlclN5bWJvbCh0eXBlKTtcbiAgICBpZiAoIVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwibWFya2VyXCIsIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2Fycm93aGVhZFwiLCBpZDogaWQsIG1hcmtlcldpZHRoOiBgJHt3aWR0aH1gLCBtYXJrZXJIZWlnaHQ6IGAke2hlaWdodH1gLCB2aWV3Qm94OiBcIi0xMCAtMTAgMjAgMjBcIiwgbWFya2VyVW5pdHM6IG1hcmtlclVuaXRzLCBvcmllbnQ6IG9yaWVudCwgcmVmWDogXCIwXCIsIHJlZlk6IFwiMFwiIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3ltYm9sLCB7IGNvbG9yOiBjb2xvciwgc3Ryb2tlV2lkdGg6IHN0cm9rZVdpZHRoIH0pKSk7XG59O1xuY29uc3QgbWFya2VyU2VsZWN0b3IgPSAoeyBkZWZhdWx0Q29sb3IsIHJmSWQgfSkgPT4gKHMpID0+IHtcbiAgICBjb25zdCBpZHMgPSBbXTtcbiAgICByZXR1cm4gcy5lZGdlc1xuICAgICAgICAucmVkdWNlKChtYXJrZXJzLCBlZGdlKSA9PiB7XG4gICAgICAgIFtlZGdlLm1hcmtlclN0YXJ0LCBlZGdlLm1hcmtlckVuZF0uZm9yRWFjaCgobWFya2VyKSA9PiB7XG4gICAgICAgICAgICBpZiAobWFya2VyICYmIHR5cGVvZiBtYXJrZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWQgPSBnZXRNYXJrZXJJZChtYXJrZXIsIHJmSWQpO1xuICAgICAgICAgICAgICAgIGlmICghaWRzLmluY2x1ZGVzKG1hcmtlcklkKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goeyBpZDogbWFya2VySWQsIGNvbG9yOiBtYXJrZXIuY29sb3IgfHwgZGVmYXVsdENvbG9yLCAuLi5tYXJrZXIgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKG1hcmtlcklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFya2VycztcbiAgICB9LCBbXSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaWQubG9jYWxlQ29tcGFyZShiLmlkKSk7XG59O1xuLy8gd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBmbG93cyBvbiBhIHBhZ2UgYW5kIHlvdSBoaWRlIHRoZSBmaXJzdCBvbmUsIHRoZSBvdGhlciBvbmVzIGhhdmUgbm8gbWFya2VycyBhbnltb3JlXG4vLyB3aGVuIHRoZXkgZG8gaGF2ZSBtYXJrZXJzIHdpdGggdGhlIHNhbWUgaWRzLiBUbyBwcmV2ZW50IHRoaXMgdGhlIHVzZXIgY2FuIHBhc3MgYSB1bmlxdWUgaWQgdG8gdGhlIHJlYWN0IGZsb3cgd3JhcHBlclxuLy8gdGhhdCB3ZSBjYW4gdGhlbiB1c2UgZm9yIGNyZWF0aW5nIG91ciB1bmlxdWUgbWFya2VyIGlkc1xuY29uc3QgTWFya2VyRGVmaW5pdGlvbnMgPSAoeyBkZWZhdWx0Q29sb3IsIHJmSWQgfSkgPT4ge1xuICAgIGNvbnN0IG1hcmtlcnMgPSB1c2VTdG9yZSh1c2VDYWxsYmFjayhtYXJrZXJTZWxlY3Rvcih7IGRlZmF1bHRDb2xvciwgcmZJZCB9KSwgW2RlZmF1bHRDb2xvciwgcmZJZF0pLCBcbiAgICAvLyB0aGUgaWQgaW5jbHVkZXMgYWxsIG1hcmtlciBvcHRpb25zLCBzbyB3ZSBqdXN0IG5lZWQgdG8gbG9vayBhdCB0aGF0IHBhcnQgb2YgdGhlIG1hcmtlclxuICAgIChhLCBiKSA9PiAhKGEubGVuZ3RoICE9PSBiLmxlbmd0aCB8fCBhLnNvbWUoKG0sIGkpID0+IG0uaWQgIT09IGJbaV0uaWQpKSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCBtYXJrZXJzLm1hcCgobWFya2VyKSA9PiAoUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZXIsIHsgaWQ6IG1hcmtlci5pZCwga2V5OiBtYXJrZXIuaWQsIHR5cGU6IG1hcmtlci50eXBlLCBjb2xvcjogbWFya2VyLmNvbG9yLCB3aWR0aDogbWFya2VyLndpZHRoLCBoZWlnaHQ6IG1hcmtlci5oZWlnaHQsIG1hcmtlclVuaXRzOiBtYXJrZXIubWFya2VyVW5pdHMsIHN0cm9rZVdpZHRoOiBtYXJrZXIuc3Ryb2tlV2lkdGgsIG9yaWVudDogbWFya2VyLm9yaWVudCB9KSkpKSk7XG59O1xuTWFya2VyRGVmaW5pdGlvbnMuZGlzcGxheU5hbWUgPSAnTWFya2VyRGVmaW5pdGlvbnMnO1xudmFyIE1hcmtlckRlZmluaXRpb25zJDEgPSBtZW1vKE1hcmtlckRlZmluaXRpb25zKTtcblxuY29uc3Qgc2VsZWN0b3IkNCA9IChzKSA9PiAoe1xuICAgIG5vZGVzQ29ubmVjdGFibGU6IHMubm9kZXNDb25uZWN0YWJsZSxcbiAgICBlZGdlc0ZvY3VzYWJsZTogcy5lZGdlc0ZvY3VzYWJsZSxcbiAgICBlZGdlc1VwZGF0YWJsZTogcy5lZGdlc1VwZGF0YWJsZSxcbiAgICBlbGVtZW50c1NlbGVjdGFibGU6IHMuZWxlbWVudHNTZWxlY3RhYmxlLFxuICAgIHdpZHRoOiBzLndpZHRoLFxuICAgIGhlaWdodDogcy5oZWlnaHQsXG4gICAgY29ubmVjdGlvbk1vZGU6IHMuY29ubmVjdGlvbk1vZGUsXG4gICAgbm9kZUludGVybmFsczogcy5ub2RlSW50ZXJuYWxzLFxuICAgIG9uRXJyb3I6IHMub25FcnJvcixcbn0pO1xuY29uc3QgRWRnZVJlbmRlcmVyID0gKHsgZGVmYXVsdE1hcmtlckNvbG9yLCBvbmx5UmVuZGVyVmlzaWJsZUVsZW1lbnRzLCBlbGV2YXRlRWRnZXNPblNlbGVjdCwgcmZJZCwgZWRnZVR5cGVzLCBub1BhbkNsYXNzTmFtZSwgb25FZGdlQ29udGV4dE1lbnUsIG9uRWRnZU1vdXNlRW50ZXIsIG9uRWRnZU1vdXNlTW92ZSwgb25FZGdlTW91c2VMZWF2ZSwgb25FZGdlQ2xpY2ssIG9uRWRnZURvdWJsZUNsaWNrLCBvblJlY29ubmVjdCwgb25SZWNvbm5lY3RTdGFydCwgb25SZWNvbm5lY3RFbmQsIHJlY29ubmVjdFJhZGl1cywgY2hpbGRyZW4sIGRpc2FibGVLZXlib2FyZEExMXksIH0pID0+IHtcbiAgICBjb25zdCB7IGVkZ2VzRm9jdXNhYmxlLCBlZGdlc1VwZGF0YWJsZSwgZWxlbWVudHNTZWxlY3RhYmxlLCB3aWR0aCwgaGVpZ2h0LCBjb25uZWN0aW9uTW9kZSwgbm9kZUludGVybmFscywgb25FcnJvciB9ID0gdXNlU3RvcmUoc2VsZWN0b3IkNCwgc2hhbGxvdyk7XG4gICAgY29uc3QgZWRnZVRyZWUgPSB1c2VWaXNpYmxlRWRnZXMob25seVJlbmRlclZpc2libGVFbGVtZW50cywgbm9kZUludGVybmFscywgZWxldmF0ZUVkZ2VzT25TZWxlY3QpO1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgZWRnZVRyZWUubWFwKCh7IGxldmVsLCBlZGdlcywgaXNNYXhMZXZlbCB9KSA9PiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IGtleTogbGV2ZWwsIHN0eWxlOiB7IHpJbmRleDogbGV2ZWwgfSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2VkZ2VzIHJlYWN0LWZsb3dfX2NvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICBpc01heExldmVsICYmIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2VyRGVmaW5pdGlvbnMkMSwgeyBkZWZhdWx0Q29sb3I6IGRlZmF1bHRNYXJrZXJDb2xvciwgcmZJZDogcmZJZCB9KSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzb3VyY2VOb2RlUmVjdCwgc291cmNlSGFuZGxlQm91bmRzLCBzb3VyY2VJc1ZhbGlkXSA9IGdldE5vZGVEYXRhKG5vZGVJbnRlcm5hbHMuZ2V0KGVkZ2Uuc291cmNlKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgW3RhcmdldE5vZGVSZWN0LCB0YXJnZXRIYW5kbGVCb3VuZHMsIHRhcmdldElzVmFsaWRdID0gZ2V0Tm9kZURhdGEobm9kZUludGVybmFscy5nZXQoZWRnZS50YXJnZXQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZUlzVmFsaWQgfHwgIXRhcmdldElzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlZGdlVHlwZSA9IGVkZ2UudHlwZSB8fCAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgaWYgKCFlZGdlVHlwZXNbZWRnZVR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3I/LignMDExJywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMTEnXShlZGdlVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBlZGdlVHlwZSA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgRWRnZUNvbXBvbmVudCA9IGVkZ2VUeXBlc1tlZGdlVHlwZV0gfHwgZWRnZVR5cGVzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBjb25uZWN0aW9uIHR5cGUgaXMgbG9vc2Ugd2UgY2FuIGRlZmluZSBhbGwgaGFuZGxlcyBhcyBzb3VyY2VzIGFuZCBjb25uZWN0IHNvdXJjZSAtPiBzb3VyY2VcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXROb2RlSGFuZGxlcyA9IGNvbm5lY3Rpb25Nb2RlID09PSBDb25uZWN0aW9uTW9kZS5TdHJpY3RcbiAgICAgICAgICAgICAgICAgICAgPyB0YXJnZXRIYW5kbGVCb3VuZHMudGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIDogKHRhcmdldEhhbmRsZUJvdW5kcy50YXJnZXQgPz8gW10pLmNvbmNhdCh0YXJnZXRIYW5kbGVCb3VuZHMuc291cmNlID8/IFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VIYW5kbGUgPSBnZXRIYW5kbGUoc291cmNlSGFuZGxlQm91bmRzLnNvdXJjZSwgZWRnZS5zb3VyY2VIYW5kbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEhhbmRsZSA9IGdldEhhbmRsZSh0YXJnZXROb2RlSGFuZGxlcywgZWRnZS50YXJnZXRIYW5kbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBvc2l0aW9uID0gc291cmNlSGFuZGxlPy5wb3NpdGlvbiB8fCBQb3NpdGlvbi5Cb3R0b207XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9zaXRpb24gPSB0YXJnZXRIYW5kbGU/LnBvc2l0aW9uIHx8IFBvc2l0aW9uLlRvcDtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZvY3VzYWJsZSA9ICEhKGVkZ2UuZm9jdXNhYmxlIHx8IChlZGdlc0ZvY3VzYWJsZSAmJiB0eXBlb2YgZWRnZS5mb2N1c2FibGUgPT09ICd1bmRlZmluZWQnKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZVJlY29ubmVjdGFibGUgPSBlZGdlLnJlY29ubmVjdGFibGUgfHwgZWRnZS51cGRhdGFibGU7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZWNvbm5lY3RhYmxlID0gdHlwZW9mIG9uUmVjb25uZWN0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAoZWRnZVJlY29ubmVjdGFibGUgfHwgKGVkZ2VzVXBkYXRhYmxlICYmIHR5cGVvZiBlZGdlUmVjb25uZWN0YWJsZSA9PT0gJ3VuZGVmaW5lZCcpKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZUhhbmRsZSB8fCAhdGFyZ2V0SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3I/LignMDA4JywgZXJyb3JNZXNzYWdlc1snZXJyb3IwMDgnXShzb3VyY2VIYW5kbGUsIGVkZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgc291cmNlWCwgc291cmNlWSwgdGFyZ2V0WCwgdGFyZ2V0WSB9ID0gZ2V0RWRnZVBvc2l0aW9ucyhzb3VyY2VOb2RlUmVjdCwgc291cmNlSGFuZGxlLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0Tm9kZVJlY3QsIHRhcmdldEhhbmRsZSwgdGFyZ2V0UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChFZGdlQ29tcG9uZW50LCB7IGtleTogZWRnZS5pZCwgaWQ6IGVkZ2UuaWQsIGNsYXNzTmFtZTogY2MoW2VkZ2UuY2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZV0pLCB0eXBlOiBlZGdlVHlwZSwgZGF0YTogZWRnZS5kYXRhLCBzZWxlY3RlZDogISFlZGdlLnNlbGVjdGVkLCBhbmltYXRlZDogISFlZGdlLmFuaW1hdGVkLCBoaWRkZW46ICEhZWRnZS5oaWRkZW4sIGxhYmVsOiBlZGdlLmxhYmVsLCBsYWJlbFN0eWxlOiBlZGdlLmxhYmVsU3R5bGUsIGxhYmVsU2hvd0JnOiBlZGdlLmxhYmVsU2hvd0JnLCBsYWJlbEJnU3R5bGU6IGVkZ2UubGFiZWxCZ1N0eWxlLCBsYWJlbEJnUGFkZGluZzogZWRnZS5sYWJlbEJnUGFkZGluZywgbGFiZWxCZ0JvcmRlclJhZGl1czogZWRnZS5sYWJlbEJnQm9yZGVyUmFkaXVzLCBzdHlsZTogZWRnZS5zdHlsZSwgc291cmNlOiBlZGdlLnNvdXJjZSwgdGFyZ2V0OiBlZGdlLnRhcmdldCwgc291cmNlSGFuZGxlSWQ6IGVkZ2Uuc291cmNlSGFuZGxlLCB0YXJnZXRIYW5kbGVJZDogZWRnZS50YXJnZXRIYW5kbGUsIG1hcmtlckVuZDogZWRnZS5tYXJrZXJFbmQsIG1hcmtlclN0YXJ0OiBlZGdlLm1hcmtlclN0YXJ0LCBzb3VyY2VYOiBzb3VyY2VYLCBzb3VyY2VZOiBzb3VyY2VZLCB0YXJnZXRYOiB0YXJnZXRYLCB0YXJnZXRZOiB0YXJnZXRZLCBzb3VyY2VQb3NpdGlvbjogc291cmNlUG9zaXRpb24sIHRhcmdldFBvc2l0aW9uOiB0YXJnZXRQb3NpdGlvbiwgZWxlbWVudHNTZWxlY3RhYmxlOiBlbGVtZW50c1NlbGVjdGFibGUsIG9uQ29udGV4dE1lbnU6IG9uRWRnZUNvbnRleHRNZW51LCBvbk1vdXNlRW50ZXI6IG9uRWRnZU1vdXNlRW50ZXIsIG9uTW91c2VNb3ZlOiBvbkVkZ2VNb3VzZU1vdmUsIG9uTW91c2VMZWF2ZTogb25FZGdlTW91c2VMZWF2ZSwgb25DbGljazogb25FZGdlQ2xpY2ssIG9uRWRnZURvdWJsZUNsaWNrOiBvbkVkZ2VEb3VibGVDbGljaywgb25SZWNvbm5lY3Q6IG9uUmVjb25uZWN0LCBvblJlY29ubmVjdFN0YXJ0OiBvblJlY29ubmVjdFN0YXJ0LCBvblJlY29ubmVjdEVuZDogb25SZWNvbm5lY3RFbmQsIHJlY29ubmVjdFJhZGl1czogcmVjb25uZWN0UmFkaXVzLCByZklkOiByZklkLCBhcmlhTGFiZWw6IGVkZ2UuYXJpYUxhYmVsLCBpc0ZvY3VzYWJsZTogaXNGb2N1c2FibGUsIGlzUmVjb25uZWN0YWJsZTogaXNSZWNvbm5lY3RhYmxlLCBwYXRoT3B0aW9uczogJ3BhdGhPcHRpb25zJyBpbiBlZGdlID8gZWRnZS5wYXRoT3B0aW9ucyA6IHVuZGVmaW5lZCwgaW50ZXJhY3Rpb25XaWR0aDogZWRnZS5pbnRlcmFjdGlvbldpZHRoLCBkaXNhYmxlS2V5Ym9hcmRBMTF5OiBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0pKTtcbiAgICAgICAgICAgIH0pKSkpKSxcbiAgICAgICAgY2hpbGRyZW4pKTtcbn07XG5FZGdlUmVuZGVyZXIuZGlzcGxheU5hbWUgPSAnRWRnZVJlbmRlcmVyJztcbnZhciBFZGdlUmVuZGVyZXIkMSA9IG1lbW8oRWRnZVJlbmRlcmVyKTtcblxuY29uc3Qgc2VsZWN0b3IkMyA9IChzKSA9PiBgdHJhbnNsYXRlKCR7cy50cmFuc2Zvcm1bMF19cHgsJHtzLnRyYW5zZm9ybVsxXX1weCkgc2NhbGUoJHtzLnRyYW5zZm9ybVsyXX0pYDtcbmZ1bmN0aW9uIFZpZXdwb3J0KHsgY2hpbGRyZW4gfSkge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHVzZVN0b3JlKHNlbGVjdG9yJDMpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X192aWV3cG9ydCByZWFjdC1mbG93X19jb250YWluZXJcIiwgc3R5bGU6IHsgdHJhbnNmb3JtIH0gfSwgY2hpbGRyZW4pKTtcbn1cblxuZnVuY3Rpb24gdXNlT25Jbml0SGFuZGxlcihvbkluaXQpIHtcbiAgICBjb25zdCByZkluc3RhbmNlID0gdXNlUmVhY3RGbG93KCk7XG4gICAgY29uc3QgaXNJbml0aWFsaXplZCA9IHVzZVJlZihmYWxzZSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFpc0luaXRpYWxpemVkLmN1cnJlbnQgJiYgcmZJbnN0YW5jZS52aWV3cG9ydEluaXRpYWxpemVkICYmIG9uSW5pdCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBvbkluaXQocmZJbnN0YW5jZSksIDEpO1xuICAgICAgICAgICAgaXNJbml0aWFsaXplZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sIFtvbkluaXQsIHJmSW5zdGFuY2Uudmlld3BvcnRJbml0aWFsaXplZF0pO1xufVxuXG5jb25zdCBvcHBvc2l0ZVBvc2l0aW9uID0ge1xuICAgIFtQb3NpdGlvbi5MZWZ0XTogUG9zaXRpb24uUmlnaHQsXG4gICAgW1Bvc2l0aW9uLlJpZ2h0XTogUG9zaXRpb24uTGVmdCxcbiAgICBbUG9zaXRpb24uVG9wXTogUG9zaXRpb24uQm90dG9tLFxuICAgIFtQb3NpdGlvbi5Cb3R0b21dOiBQb3NpdGlvbi5Ub3AsXG59O1xuY29uc3QgQ29ubmVjdGlvbkxpbmUgPSAoeyBub2RlSWQsIGhhbmRsZVR5cGUsIHN0eWxlLCB0eXBlID0gQ29ubmVjdGlvbkxpbmVUeXBlLkJlemllciwgQ3VzdG9tQ29tcG9uZW50LCBjb25uZWN0aW9uU3RhdHVzLCB9KSA9PiB7XG4gICAgY29uc3QgeyBmcm9tTm9kZSwgaGFuZGxlSWQsIHRvWCwgdG9ZLCBjb25uZWN0aW9uTW9kZSB9ID0gdXNlU3RvcmUodXNlQ2FsbGJhY2soKHMpID0+ICh7XG4gICAgICAgIGZyb21Ob2RlOiBzLm5vZGVJbnRlcm5hbHMuZ2V0KG5vZGVJZCksXG4gICAgICAgIGhhbmRsZUlkOiBzLmNvbm5lY3Rpb25IYW5kbGVJZCxcbiAgICAgICAgdG9YOiAocy5jb25uZWN0aW9uUG9zaXRpb24ueCAtIHMudHJhbnNmb3JtWzBdKSAvIHMudHJhbnNmb3JtWzJdLFxuICAgICAgICB0b1k6IChzLmNvbm5lY3Rpb25Qb3NpdGlvbi55IC0gcy50cmFuc2Zvcm1bMV0pIC8gcy50cmFuc2Zvcm1bMl0sXG4gICAgICAgIGNvbm5lY3Rpb25Nb2RlOiBzLmNvbm5lY3Rpb25Nb2RlLFxuICAgIH0pLCBbbm9kZUlkXSksIHNoYWxsb3cpO1xuICAgIGNvbnN0IGZyb21IYW5kbGVCb3VuZHMgPSBmcm9tTm9kZT8uW2ludGVybmFsc1N5bWJvbF0/LmhhbmRsZUJvdW5kcztcbiAgICBsZXQgaGFuZGxlQm91bmRzID0gZnJvbUhhbmRsZUJvdW5kcz8uW2hhbmRsZVR5cGVdO1xuICAgIGlmIChjb25uZWN0aW9uTW9kZSA9PT0gQ29ubmVjdGlvbk1vZGUuTG9vc2UpIHtcbiAgICAgICAgaGFuZGxlQm91bmRzID0gaGFuZGxlQm91bmRzID8gaGFuZGxlQm91bmRzIDogZnJvbUhhbmRsZUJvdW5kcz8uW2hhbmRsZVR5cGUgPT09ICdzb3VyY2UnID8gJ3RhcmdldCcgOiAnc291cmNlJ107XG4gICAgfVxuICAgIGlmICghZnJvbU5vZGUgfHwgIWhhbmRsZUJvdW5kcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZnJvbUhhbmRsZSA9IGhhbmRsZUlkID8gaGFuZGxlQm91bmRzLmZpbmQoKGQpID0+IGQuaWQgPT09IGhhbmRsZUlkKSA6IGhhbmRsZUJvdW5kc1swXTtcbiAgICBjb25zdCBmcm9tSGFuZGxlWCA9IGZyb21IYW5kbGUgPyBmcm9tSGFuZGxlLnggKyBmcm9tSGFuZGxlLndpZHRoIC8gMiA6IChmcm9tTm9kZS53aWR0aCA/PyAwKSAvIDI7XG4gICAgY29uc3QgZnJvbUhhbmRsZVkgPSBmcm9tSGFuZGxlID8gZnJvbUhhbmRsZS55ICsgZnJvbUhhbmRsZS5oZWlnaHQgLyAyIDogZnJvbU5vZGUuaGVpZ2h0ID8/IDA7XG4gICAgY29uc3QgZnJvbVggPSAoZnJvbU5vZGUucG9zaXRpb25BYnNvbHV0ZT8ueCA/PyAwKSArIGZyb21IYW5kbGVYO1xuICAgIGNvbnN0IGZyb21ZID0gKGZyb21Ob2RlLnBvc2l0aW9uQWJzb2x1dGU/LnkgPz8gMCkgKyBmcm9tSGFuZGxlWTtcbiAgICBjb25zdCBmcm9tUG9zaXRpb24gPSBmcm9tSGFuZGxlPy5wb3NpdGlvbjtcbiAgICBjb25zdCB0b1Bvc2l0aW9uID0gZnJvbVBvc2l0aW9uID8gb3Bwb3NpdGVQb3NpdGlvbltmcm9tUG9zaXRpb25dIDogbnVsbDtcbiAgICBpZiAoIWZyb21Qb3NpdGlvbiB8fCAhdG9Qb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKEN1c3RvbUNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3VzdG9tQ29tcG9uZW50LCB7IGNvbm5lY3Rpb25MaW5lVHlwZTogdHlwZSwgY29ubmVjdGlvbkxpbmVTdHlsZTogc3R5bGUsIGZyb21Ob2RlOiBmcm9tTm9kZSwgZnJvbUhhbmRsZTogZnJvbUhhbmRsZSwgZnJvbVg6IGZyb21YLCBmcm9tWTogZnJvbVksIHRvWDogdG9YLCB0b1k6IHRvWSwgZnJvbVBvc2l0aW9uOiBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb246IHRvUG9zaXRpb24sIGNvbm5lY3Rpb25TdGF0dXM6IGNvbm5lY3Rpb25TdGF0dXMgfSkpO1xuICAgIH1cbiAgICBsZXQgZEF0dHIgPSAnJztcbiAgICBjb25zdCBwYXRoUGFyYW1zID0ge1xuICAgICAgICBzb3VyY2VYOiBmcm9tWCxcbiAgICAgICAgc291cmNlWTogZnJvbVksXG4gICAgICAgIHNvdXJjZVBvc2l0aW9uOiBmcm9tUG9zaXRpb24sXG4gICAgICAgIHRhcmdldFg6IHRvWCxcbiAgICAgICAgdGFyZ2V0WTogdG9ZLFxuICAgICAgICB0YXJnZXRQb3NpdGlvbjogdG9Qb3NpdGlvbixcbiAgICB9O1xuICAgIGlmICh0eXBlID09PSBDb25uZWN0aW9uTGluZVR5cGUuQmV6aWVyKSB7XG4gICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgZGVzdGluYXRpb24gcG9zaXRpb24gaXMgb3Bwb3NpdGUgdG8gdGhlIHNvdXJjZSBwb3NpdGlvblxuICAgICAgICBbZEF0dHJdID0gZ2V0QmV6aWVyUGF0aChwYXRoUGFyYW1zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gQ29ubmVjdGlvbkxpbmVUeXBlLlN0ZXApIHtcbiAgICAgICAgW2RBdHRyXSA9IGdldFNtb290aFN0ZXBQYXRoKHtcbiAgICAgICAgICAgIC4uLnBhdGhQYXJhbXMsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSBDb25uZWN0aW9uTGluZVR5cGUuU21vb3RoU3RlcCkge1xuICAgICAgICBbZEF0dHJdID0gZ2V0U21vb3RoU3RlcFBhdGgocGF0aFBhcmFtcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09IENvbm5lY3Rpb25MaW5lVHlwZS5TaW1wbGVCZXppZXIpIHtcbiAgICAgICAgW2RBdHRyXSA9IGdldFNpbXBsZUJlemllclBhdGgocGF0aFBhcmFtcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkQXR0ciA9IGBNJHtmcm9tWH0sJHtmcm9tWX0gJHt0b1h9LCR7dG9ZfWA7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IGRBdHRyLCBmaWxsOiBcIm5vbmVcIiwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2Nvbm5lY3Rpb24tcGF0aFwiLCBzdHlsZTogc3R5bGUgfSk7XG59O1xuQ29ubmVjdGlvbkxpbmUuZGlzcGxheU5hbWUgPSAnQ29ubmVjdGlvbkxpbmUnO1xuY29uc3Qgc2VsZWN0b3IkMiA9IChzKSA9PiAoe1xuICAgIG5vZGVJZDogcy5jb25uZWN0aW9uTm9kZUlkLFxuICAgIGhhbmRsZVR5cGU6IHMuY29ubmVjdGlvbkhhbmRsZVR5cGUsXG4gICAgbm9kZXNDb25uZWN0YWJsZTogcy5ub2Rlc0Nvbm5lY3RhYmxlLFxuICAgIGNvbm5lY3Rpb25TdGF0dXM6IHMuY29ubmVjdGlvblN0YXR1cyxcbiAgICB3aWR0aDogcy53aWR0aCxcbiAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxufSk7XG5mdW5jdGlvbiBDb25uZWN0aW9uTGluZVdyYXBwZXIoeyBjb250YWluZXJTdHlsZSwgc3R5bGUsIHR5cGUsIGNvbXBvbmVudCB9KSB7XG4gICAgY29uc3QgeyBub2RlSWQsIGhhbmRsZVR5cGUsIG5vZGVzQ29ubmVjdGFibGUsIHdpZHRoLCBoZWlnaHQsIGNvbm5lY3Rpb25TdGF0dXMgfSA9IHVzZVN0b3JlKHNlbGVjdG9yJDIsIHNoYWxsb3cpO1xuICAgIGNvbnN0IGlzVmFsaWQgPSAhIShub2RlSWQgJiYgaGFuZGxlVHlwZSAmJiB3aWR0aCAmJiBub2Rlc0Nvbm5lY3RhYmxlKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHN0eWxlOiBjb250YWluZXJTdHlsZSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2VkZ2VzIHJlYWN0LWZsb3dfX2Nvbm5lY3Rpb25saW5lIHJlYWN0LWZsb3dfX2NvbnRhaW5lclwiIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHsgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3dfX2Nvbm5lY3Rpb24nLCBjb25uZWN0aW9uU3RhdHVzXSkgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdGlvbkxpbmUsIHsgbm9kZUlkOiBub2RlSWQsIGhhbmRsZVR5cGU6IGhhbmRsZVR5cGUsIHN0eWxlOiBzdHlsZSwgdHlwZTogdHlwZSwgQ3VzdG9tQ29tcG9uZW50OiBjb21wb25lbnQsIGNvbm5lY3Rpb25TdGF0dXM6IGNvbm5lY3Rpb25TdGF0dXMgfSkpKSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiB1c2VOb2RlT3JFZGdlVHlwZXMobm9kZU9yRWRnZVR5cGVzLCBjcmVhdGVUeXBlcykge1xuICAgIGNvbnN0IHR5cGVzS2V5c1JlZiA9IHVzZVJlZihudWxsKTtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgdHlwZXNQYXJzZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlS2V5cyA9IE9iamVjdC5rZXlzKG5vZGVPckVkZ2VUeXBlcyk7XG4gICAgICAgICAgICBpZiAoc2hhbGxvdyh0eXBlc0tleXNSZWYuY3VycmVudCwgdHlwZUtleXMpKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuZ2V0U3RhdGUoKS5vbkVycm9yPy4oJzAwMicsIGVycm9yTWVzc2FnZXNbJ2Vycm9yMDAyJ10oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0eXBlc0tleXNSZWYuY3VycmVudCA9IHR5cGVLZXlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVUeXBlcyhub2RlT3JFZGdlVHlwZXMpO1xuICAgIH0sIFtub2RlT3JFZGdlVHlwZXNdKTtcbiAgICByZXR1cm4gdHlwZXNQYXJzZWQ7XG59XG5cbmNvbnN0IEdyYXBoVmlldyA9ICh7IG5vZGVUeXBlcywgZWRnZVR5cGVzLCBvbk1vdmUsIG9uTW92ZVN0YXJ0LCBvbk1vdmVFbmQsIG9uSW5pdCwgb25Ob2RlQ2xpY2ssIG9uRWRnZUNsaWNrLCBvbk5vZGVEb3VibGVDbGljaywgb25FZGdlRG91YmxlQ2xpY2ssIG9uTm9kZU1vdXNlRW50ZXIsIG9uTm9kZU1vdXNlTW92ZSwgb25Ob2RlTW91c2VMZWF2ZSwgb25Ob2RlQ29udGV4dE1lbnUsIG9uU2VsZWN0aW9uQ29udGV4dE1lbnUsIG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kLCBjb25uZWN0aW9uTGluZVR5cGUsIGNvbm5lY3Rpb25MaW5lU3R5bGUsIGNvbm5lY3Rpb25MaW5lQ29tcG9uZW50LCBjb25uZWN0aW9uTGluZUNvbnRhaW5lclN0eWxlLCBzZWxlY3Rpb25LZXlDb2RlLCBzZWxlY3Rpb25PbkRyYWcsIHNlbGVjdGlvbk1vZGUsIG11bHRpU2VsZWN0aW9uS2V5Q29kZSwgcGFuQWN0aXZhdGlvbktleUNvZGUsIHpvb21BY3RpdmF0aW9uS2V5Q29kZSwgZGVsZXRlS2V5Q29kZSwgb25seVJlbmRlclZpc2libGVFbGVtZW50cywgZWxlbWVudHNTZWxlY3RhYmxlLCBzZWxlY3ROb2Rlc09uRHJhZywgZGVmYXVsdFZpZXdwb3J0LCB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb20sIG1heFpvb20sIHByZXZlbnRTY3JvbGxpbmcsIGRlZmF1bHRNYXJrZXJDb2xvciwgem9vbU9uU2Nyb2xsLCB6b29tT25QaW5jaCwgcGFuT25TY3JvbGwsIHBhbk9uU2Nyb2xsU3BlZWQsIHBhbk9uU2Nyb2xsTW9kZSwgem9vbU9uRG91YmxlQ2xpY2ssIHBhbk9uRHJhZywgb25QYW5lQ2xpY2ssIG9uUGFuZU1vdXNlRW50ZXIsIG9uUGFuZU1vdXNlTW92ZSwgb25QYW5lTW91c2VMZWF2ZSwgb25QYW5lU2Nyb2xsLCBvblBhbmVDb250ZXh0TWVudSwgb25FZGdlQ29udGV4dE1lbnUsIG9uRWRnZU1vdXNlRW50ZXIsIG9uRWRnZU1vdXNlTW92ZSwgb25FZGdlTW91c2VMZWF2ZSwgb25SZWNvbm5lY3QsIG9uUmVjb25uZWN0U3RhcnQsIG9uUmVjb25uZWN0RW5kLCByZWNvbm5lY3RSYWRpdXMsIG5vRHJhZ0NsYXNzTmFtZSwgbm9XaGVlbENsYXNzTmFtZSwgbm9QYW5DbGFzc05hbWUsIGVsZXZhdGVFZGdlc09uU2VsZWN0LCBkaXNhYmxlS2V5Ym9hcmRBMTF5LCBub2RlT3JpZ2luLCBub2RlRXh0ZW50LCByZklkLCB9KSA9PiB7XG4gICAgY29uc3Qgbm9kZVR5cGVzV3JhcHBlZCA9IHVzZU5vZGVPckVkZ2VUeXBlcyhub2RlVHlwZXMsIGNyZWF0ZU5vZGVUeXBlcyk7XG4gICAgY29uc3QgZWRnZVR5cGVzV3JhcHBlZCA9IHVzZU5vZGVPckVkZ2VUeXBlcyhlZGdlVHlwZXMsIGNyZWF0ZUVkZ2VUeXBlcyk7XG4gICAgdXNlT25Jbml0SGFuZGxlcihvbkluaXQpO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChGbG93UmVuZGVyZXIkMSwgeyBvblBhbmVDbGljazogb25QYW5lQ2xpY2ssIG9uUGFuZU1vdXNlRW50ZXI6IG9uUGFuZU1vdXNlRW50ZXIsIG9uUGFuZU1vdXNlTW92ZTogb25QYW5lTW91c2VNb3ZlLCBvblBhbmVNb3VzZUxlYXZlOiBvblBhbmVNb3VzZUxlYXZlLCBvblBhbmVDb250ZXh0TWVudTogb25QYW5lQ29udGV4dE1lbnUsIG9uUGFuZVNjcm9sbDogb25QYW5lU2Nyb2xsLCBkZWxldGVLZXlDb2RlOiBkZWxldGVLZXlDb2RlLCBzZWxlY3Rpb25LZXlDb2RlOiBzZWxlY3Rpb25LZXlDb2RlLCBzZWxlY3Rpb25PbkRyYWc6IHNlbGVjdGlvbk9uRHJhZywgc2VsZWN0aW9uTW9kZTogc2VsZWN0aW9uTW9kZSwgb25TZWxlY3Rpb25TdGFydDogb25TZWxlY3Rpb25TdGFydCwgb25TZWxlY3Rpb25FbmQ6IG9uU2VsZWN0aW9uRW5kLCBtdWx0aVNlbGVjdGlvbktleUNvZGU6IG11bHRpU2VsZWN0aW9uS2V5Q29kZSwgcGFuQWN0aXZhdGlvbktleUNvZGU6IHBhbkFjdGl2YXRpb25LZXlDb2RlLCB6b29tQWN0aXZhdGlvbktleUNvZGU6IHpvb21BY3RpdmF0aW9uS2V5Q29kZSwgZWxlbWVudHNTZWxlY3RhYmxlOiBlbGVtZW50c1NlbGVjdGFibGUsIG9uTW92ZTogb25Nb3ZlLCBvbk1vdmVTdGFydDogb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZDogb25Nb3ZlRW5kLCB6b29tT25TY3JvbGw6IHpvb21PblNjcm9sbCwgem9vbU9uUGluY2g6IHpvb21PblBpbmNoLCB6b29tT25Eb3VibGVDbGljazogem9vbU9uRG91YmxlQ2xpY2ssIHBhbk9uU2Nyb2xsOiBwYW5PblNjcm9sbCwgcGFuT25TY3JvbGxTcGVlZDogcGFuT25TY3JvbGxTcGVlZCwgcGFuT25TY3JvbGxNb2RlOiBwYW5PblNjcm9sbE1vZGUsIHBhbk9uRHJhZzogcGFuT25EcmFnLCBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCwgdHJhbnNsYXRlRXh0ZW50OiB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb206IG1pblpvb20sIG1heFpvb206IG1heFpvb20sIG9uU2VsZWN0aW9uQ29udGV4dE1lbnU6IG9uU2VsZWN0aW9uQ29udGV4dE1lbnUsIHByZXZlbnRTY3JvbGxpbmc6IHByZXZlbnRTY3JvbGxpbmcsIG5vRHJhZ0NsYXNzTmFtZTogbm9EcmFnQ2xhc3NOYW1lLCBub1doZWVsQ2xhc3NOYW1lOiBub1doZWVsQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZTogbm9QYW5DbGFzc05hbWUsIGRpc2FibGVLZXlib2FyZEExMXk6IGRpc2FibGVLZXlib2FyZEExMXkgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChWaWV3cG9ydCwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRWRnZVJlbmRlcmVyJDEsIHsgZWRnZVR5cGVzOiBlZGdlVHlwZXNXcmFwcGVkLCBvbkVkZ2VDbGljazogb25FZGdlQ2xpY2ssIG9uRWRnZURvdWJsZUNsaWNrOiBvbkVkZ2VEb3VibGVDbGljaywgb25seVJlbmRlclZpc2libGVFbGVtZW50czogb25seVJlbmRlclZpc2libGVFbGVtZW50cywgb25FZGdlQ29udGV4dE1lbnU6IG9uRWRnZUNvbnRleHRNZW51LCBvbkVkZ2VNb3VzZUVudGVyOiBvbkVkZ2VNb3VzZUVudGVyLCBvbkVkZ2VNb3VzZU1vdmU6IG9uRWRnZU1vdXNlTW92ZSwgb25FZGdlTW91c2VMZWF2ZTogb25FZGdlTW91c2VMZWF2ZSwgb25SZWNvbm5lY3Q6IG9uUmVjb25uZWN0LCBvblJlY29ubmVjdFN0YXJ0OiBvblJlY29ubmVjdFN0YXJ0LCBvblJlY29ubmVjdEVuZDogb25SZWNvbm5lY3RFbmQsIHJlY29ubmVjdFJhZGl1czogcmVjb25uZWN0UmFkaXVzLCBkZWZhdWx0TWFya2VyQ29sb3I6IGRlZmF1bHRNYXJrZXJDb2xvciwgbm9QYW5DbGFzc05hbWU6IG5vUGFuQ2xhc3NOYW1lLCBlbGV2YXRlRWRnZXNPblNlbGVjdDogISFlbGV2YXRlRWRnZXNPblNlbGVjdCwgZGlzYWJsZUtleWJvYXJkQTExeTogZGlzYWJsZUtleWJvYXJkQTExeSwgcmZJZDogcmZJZCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29ubmVjdGlvbkxpbmVXcmFwcGVyLCB7IHN0eWxlOiBjb25uZWN0aW9uTGluZVN0eWxlLCB0eXBlOiBjb25uZWN0aW9uTGluZVR5cGUsIGNvbXBvbmVudDogY29ubmVjdGlvbkxpbmVDb21wb25lbnQsIGNvbnRhaW5lclN0eWxlOiBjb25uZWN0aW9uTGluZUNvbnRhaW5lclN0eWxlIH0pKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fZWRnZWxhYmVsLXJlbmRlcmVyXCIgfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVSZW5kZXJlciQxLCB7IG5vZGVUeXBlczogbm9kZVR5cGVzV3JhcHBlZCwgb25Ob2RlQ2xpY2s6IG9uTm9kZUNsaWNrLCBvbk5vZGVEb3VibGVDbGljazogb25Ob2RlRG91YmxlQ2xpY2ssIG9uTm9kZU1vdXNlRW50ZXI6IG9uTm9kZU1vdXNlRW50ZXIsIG9uTm9kZU1vdXNlTW92ZTogb25Ob2RlTW91c2VNb3ZlLCBvbk5vZGVNb3VzZUxlYXZlOiBvbk5vZGVNb3VzZUxlYXZlLCBvbk5vZGVDb250ZXh0TWVudTogb25Ob2RlQ29udGV4dE1lbnUsIHNlbGVjdE5vZGVzT25EcmFnOiBzZWxlY3ROb2Rlc09uRHJhZywgb25seVJlbmRlclZpc2libGVFbGVtZW50czogb25seVJlbmRlclZpc2libGVFbGVtZW50cywgbm9QYW5DbGFzc05hbWU6IG5vUGFuQ2xhc3NOYW1lLCBub0RyYWdDbGFzc05hbWU6IG5vRHJhZ0NsYXNzTmFtZSwgZGlzYWJsZUtleWJvYXJkQTExeTogZGlzYWJsZUtleWJvYXJkQTExeSwgbm9kZU9yaWdpbjogbm9kZU9yaWdpbiwgbm9kZUV4dGVudDogbm9kZUV4dGVudCwgcmZJZDogcmZJZCB9KSkpKTtcbn07XG5HcmFwaFZpZXcuZGlzcGxheU5hbWUgPSAnR3JhcGhWaWV3JztcbnZhciBHcmFwaFZpZXckMSA9IG1lbW8oR3JhcGhWaWV3KTtcblxuY29uc3QgaW5maW5pdGVFeHRlbnQgPSBbXG4gICAgW051bWJlci5ORUdBVElWRV9JTkZJTklUWSwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXSxcbiAgICBbTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFldLFxuXTtcbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICByZklkOiAnMScsXG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHRyYW5zZm9ybTogWzAsIDAsIDFdLFxuICAgIG5vZGVJbnRlcm5hbHM6IG5ldyBNYXAoKSxcbiAgICBlZGdlczogW10sXG4gICAgb25Ob2Rlc0NoYW5nZTogbnVsbCxcbiAgICBvbkVkZ2VzQ2hhbmdlOiBudWxsLFxuICAgIGhhc0RlZmF1bHROb2RlczogZmFsc2UsXG4gICAgaGFzRGVmYXVsdEVkZ2VzOiBmYWxzZSxcbiAgICBkM1pvb206IG51bGwsXG4gICAgZDNTZWxlY3Rpb246IG51bGwsXG4gICAgZDNab29tSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgIG1pblpvb206IDAuNSxcbiAgICBtYXhab29tOiAyLFxuICAgIHRyYW5zbGF0ZUV4dGVudDogaW5maW5pdGVFeHRlbnQsXG4gICAgbm9kZUV4dGVudDogaW5maW5pdGVFeHRlbnQsXG4gICAgbm9kZXNTZWxlY3Rpb25BY3RpdmU6IGZhbHNlLFxuICAgIHVzZXJTZWxlY3Rpb25BY3RpdmU6IGZhbHNlLFxuICAgIHVzZXJTZWxlY3Rpb25SZWN0OiBudWxsLFxuICAgIGNvbm5lY3Rpb25Ob2RlSWQ6IG51bGwsXG4gICAgY29ubmVjdGlvbkhhbmRsZUlkOiBudWxsLFxuICAgIGNvbm5lY3Rpb25IYW5kbGVUeXBlOiAnc291cmNlJyxcbiAgICBjb25uZWN0aW9uUG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgIGNvbm5lY3Rpb25TdGF0dXM6IG51bGwsXG4gICAgY29ubmVjdGlvbk1vZGU6IENvbm5lY3Rpb25Nb2RlLlN0cmljdCxcbiAgICBkb21Ob2RlOiBudWxsLFxuICAgIHBhbmVEcmFnZ2luZzogZmFsc2UsXG4gICAgbm9QYW5DbGFzc05hbWU6ICdub3BhbicsXG4gICAgbm9kZU9yaWdpbjogWzAsIDBdLFxuICAgIG5vZGVEcmFnVGhyZXNob2xkOiAwLFxuICAgIHNuYXBHcmlkOiBbMTUsIDE1XSxcbiAgICBzbmFwVG9HcmlkOiBmYWxzZSxcbiAgICBub2Rlc0RyYWdnYWJsZTogdHJ1ZSxcbiAgICBub2Rlc0Nvbm5lY3RhYmxlOiB0cnVlLFxuICAgIG5vZGVzRm9jdXNhYmxlOiB0cnVlLFxuICAgIGVkZ2VzRm9jdXNhYmxlOiB0cnVlLFxuICAgIGVkZ2VzVXBkYXRhYmxlOiB0cnVlLFxuICAgIGVsZW1lbnRzU2VsZWN0YWJsZTogdHJ1ZSxcbiAgICBlbGV2YXRlTm9kZXNPblNlbGVjdDogdHJ1ZSxcbiAgICBmaXRWaWV3T25Jbml0OiBmYWxzZSxcbiAgICBmaXRWaWV3T25Jbml0RG9uZTogZmFsc2UsXG4gICAgZml0Vmlld09uSW5pdE9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICBvblNlbGVjdGlvbkNoYW5nZTogW10sXG4gICAgbXVsdGlTZWxlY3Rpb25BY3RpdmU6IGZhbHNlLFxuICAgIGNvbm5lY3Rpb25TdGFydEhhbmRsZTogbnVsbCxcbiAgICBjb25uZWN0aW9uRW5kSGFuZGxlOiBudWxsLFxuICAgIGNvbm5lY3Rpb25DbGlja1N0YXJ0SGFuZGxlOiBudWxsLFxuICAgIGNvbm5lY3RPbkNsaWNrOiB0cnVlLFxuICAgIGFyaWFMaXZlTWVzc2FnZTogJycsXG4gICAgYXV0b1Bhbk9uQ29ubmVjdDogdHJ1ZSxcbiAgICBhdXRvUGFuT25Ob2RlRHJhZzogdHJ1ZSxcbiAgICBjb25uZWN0aW9uUmFkaXVzOiAyMCxcbiAgICBvbkVycm9yOiBkZXZXYXJuLFxuICAgIGlzVmFsaWRDb25uZWN0aW9uOiB1bmRlZmluZWQsXG59O1xuXG5jb25zdCBjcmVhdGVSRlN0b3JlID0gKCkgPT4gY3JlYXRlV2l0aEVxdWFsaXR5Rm4oKHNldCwgZ2V0KSA9PiAoe1xuICAgIC4uLmluaXRpYWxTdGF0ZSxcbiAgICBzZXROb2RlczogKG5vZGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbm9kZUludGVybmFscywgbm9kZU9yaWdpbiwgZWxldmF0ZU5vZGVzT25TZWxlY3QgfSA9IGdldCgpO1xuICAgICAgICBzZXQoeyBub2RlSW50ZXJuYWxzOiBjcmVhdGVOb2RlSW50ZXJuYWxzKG5vZGVzLCBub2RlSW50ZXJuYWxzLCBub2RlT3JpZ2luLCBlbGV2YXRlTm9kZXNPblNlbGVjdCkgfSk7XG4gICAgfSxcbiAgICBnZXROb2RlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShnZXQoKS5ub2RlSW50ZXJuYWxzLnZhbHVlcygpKTtcbiAgICB9LFxuICAgIHNldEVkZ2VzOiAoZWRnZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBkZWZhdWx0RWRnZU9wdGlvbnMgPSB7fSB9ID0gZ2V0KCk7XG4gICAgICAgIHNldCh7IGVkZ2VzOiBlZGdlcy5tYXAoKGUpID0+ICh7IC4uLmRlZmF1bHRFZGdlT3B0aW9ucywgLi4uZSB9KSkgfSk7XG4gICAgfSxcbiAgICBzZXREZWZhdWx0Tm9kZXNBbmRFZGdlczogKG5vZGVzLCBlZGdlcykgPT4ge1xuICAgICAgICBjb25zdCBoYXNEZWZhdWx0Tm9kZXMgPSB0eXBlb2Ygbm9kZXMgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICBjb25zdCBoYXNEZWZhdWx0RWRnZXMgPSB0eXBlb2YgZWRnZXMgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICBjb25zdCBub2RlSW50ZXJuYWxzID0gaGFzRGVmYXVsdE5vZGVzXG4gICAgICAgICAgICA/IGNyZWF0ZU5vZGVJbnRlcm5hbHMobm9kZXMsIG5ldyBNYXAoKSwgZ2V0KCkubm9kZU9yaWdpbiwgZ2V0KCkuZWxldmF0ZU5vZGVzT25TZWxlY3QpXG4gICAgICAgICAgICA6IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgbmV4dEVkZ2VzID0gaGFzRGVmYXVsdEVkZ2VzID8gZWRnZXMgOiBbXTtcbiAgICAgICAgc2V0KHsgbm9kZUludGVybmFscywgZWRnZXM6IG5leHRFZGdlcywgaGFzRGVmYXVsdE5vZGVzLCBoYXNEZWZhdWx0RWRnZXMgfSk7XG4gICAgfSxcbiAgICB1cGRhdGVOb2RlRGltZW5zaW9uczogKHVwZGF0ZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBvbk5vZGVzQ2hhbmdlLCBub2RlSW50ZXJuYWxzLCBmaXRWaWV3T25Jbml0LCBmaXRWaWV3T25Jbml0RG9uZSwgZml0Vmlld09uSW5pdE9wdGlvbnMsIGRvbU5vZGUsIG5vZGVPcmlnaW4sIH0gPSBnZXQoKTtcbiAgICAgICAgY29uc3Qgdmlld3BvcnROb2RlID0gZG9tTm9kZT8ucXVlcnlTZWxlY3RvcignLnJlYWN0LWZsb3dfX3ZpZXdwb3J0Jyk7XG4gICAgICAgIGlmICghdmlld3BvcnROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3cG9ydE5vZGUpO1xuICAgICAgICBjb25zdCB7IG0yMjogem9vbSB9ID0gbmV3IHdpbmRvdy5ET01NYXRyaXhSZWFkT25seShzdHlsZS50cmFuc2Zvcm0pO1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdXBkYXRlcy5yZWR1Y2UoKHJlcywgdXBkYXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZUludGVybmFscy5nZXQodXBkYXRlLmlkKTtcbiAgICAgICAgICAgIGlmIChub2RlPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlSW50ZXJuYWxzLnNldChub2RlLmlkLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgIFtpbnRlcm5hbHNTeW1ib2xdOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ub2RlW2ludGVybmFsc1N5bWJvbF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoYW5kbGUgYm91bmRzIHdoZW4gdGhlIG5vZGUgaXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBmb3JjZSBhIG5ldyBvYnNlcnZhdGlvbiB3aGVuIHRoZSBub2RlIGlzIHNob3duIGFnYWluXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb3VuZHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyh1cGRhdGUubm9kZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvVXBkYXRlID0gISEoZGltZW5zaW9ucy53aWR0aCAmJlxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zLmhlaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICAobm9kZS53aWR0aCAhPT0gZGltZW5zaW9ucy53aWR0aCB8fCBub2RlLmhlaWdodCAhPT0gZGltZW5zaW9ucy5oZWlnaHQgfHwgdXBkYXRlLmZvcmNlVXBkYXRlKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRvVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbnRlcm5hbHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW50ZXJuYWxzU3ltYm9sXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm5vZGVbaW50ZXJuYWxzU3ltYm9sXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb3VuZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBnZXRIYW5kbGVCb3VuZHMoJy5zb3VyY2UnLCB1cGRhdGUubm9kZUVsZW1lbnQsIHpvb20sIG5vZGVPcmlnaW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGdldEhhbmRsZUJvdW5kcygnLnRhcmdldCcsIHVwZGF0ZS5ub2RlRWxlbWVudCwgem9vbSwgbm9kZU9yaWdpbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5kaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGltZW5zaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHVwZGF0ZUFic29sdXRlTm9kZVBvc2l0aW9ucyhub2RlSW50ZXJuYWxzLCBub2RlT3JpZ2luKTtcbiAgICAgICAgY29uc3QgbmV4dEZpdFZpZXdPbkluaXREb25lID0gZml0Vmlld09uSW5pdERvbmUgfHxcbiAgICAgICAgICAgIChmaXRWaWV3T25Jbml0ICYmICFmaXRWaWV3T25Jbml0RG9uZSAmJiBmaXRWaWV3KGdldCwgeyBpbml0aWFsOiB0cnVlLCAuLi5maXRWaWV3T25Jbml0T3B0aW9ucyB9KSk7XG4gICAgICAgIHNldCh7IG5vZGVJbnRlcm5hbHM6IG5ldyBNYXAobm9kZUludGVybmFscyksIGZpdFZpZXdPbkluaXREb25lOiBuZXh0Rml0Vmlld09uSW5pdERvbmUgfSk7XG4gICAgICAgIGlmIChjaGFuZ2VzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBvbk5vZGVzQ2hhbmdlPy4oY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZU5vZGVQb3NpdGlvbnM6IChub2RlRHJhZ0l0ZW1zLCBwb3NpdGlvbkNoYW5nZWQgPSB0cnVlLCBkcmFnZ2luZyA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHJpZ2dlck5vZGVDaGFuZ2VzIH0gPSBnZXQoKTtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5vZGVEcmFnSXRlbXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bvc2l0aW9uJyxcbiAgICAgICAgICAgICAgICBkcmFnZ2luZyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocG9zaXRpb25DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlLnBvc2l0aW9uQWJzb2x1dGUgPSBub2RlLnBvc2l0aW9uQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgY2hhbmdlLnBvc2l0aW9uID0gbm9kZS5wb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0cmlnZ2VyTm9kZUNoYW5nZXMoY2hhbmdlcyk7XG4gICAgfSxcbiAgICB0cmlnZ2VyTm9kZUNoYW5nZXM6IChjaGFuZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb25Ob2Rlc0NoYW5nZSwgbm9kZUludGVybmFscywgaGFzRGVmYXVsdE5vZGVzLCBub2RlT3JpZ2luLCBnZXROb2RlcywgZWxldmF0ZU5vZGVzT25TZWxlY3QgfSA9IGdldCgpO1xuICAgICAgICBpZiAoY2hhbmdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzRGVmYXVsdE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBhcHBseU5vZGVDaGFuZ2VzKGNoYW5nZXMsIGdldE5vZGVzKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHROb2RlSW50ZXJuYWxzID0gY3JlYXRlTm9kZUludGVybmFscyhub2Rlcywgbm9kZUludGVybmFscywgbm9kZU9yaWdpbiwgZWxldmF0ZU5vZGVzT25TZWxlY3QpO1xuICAgICAgICAgICAgICAgIHNldCh7IG5vZGVJbnRlcm5hbHM6IG5leHROb2RlSW50ZXJuYWxzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25Ob2Rlc0NoYW5nZT8uKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBhZGRTZWxlY3RlZE5vZGVzOiAoc2VsZWN0ZWROb2RlSWRzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbXVsdGlTZWxlY3Rpb25BY3RpdmUsIGVkZ2VzLCBnZXROb2RlcyB9ID0gZ2V0KCk7XG4gICAgICAgIGxldCBjaGFuZ2VkTm9kZXM7XG4gICAgICAgIGxldCBjaGFuZ2VkRWRnZXMgPSBudWxsO1xuICAgICAgICBpZiAobXVsdGlTZWxlY3Rpb25BY3RpdmUpIHtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyA9IHNlbGVjdGVkTm9kZUlkcy5tYXAoKG5vZGVJZCkgPT4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKG5vZGVJZCwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlZE5vZGVzID0gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhnZXROb2RlcygpLCBzZWxlY3RlZE5vZGVJZHMpO1xuICAgICAgICAgICAgY2hhbmdlZEVkZ2VzID0gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhlZGdlcywgW10pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZU5vZGVzQW5kRWRnZXNTZWxlY3Rpb25zKHtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyxcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBhZGRTZWxlY3RlZEVkZ2VzOiAoc2VsZWN0ZWRFZGdlSWRzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbXVsdGlTZWxlY3Rpb25BY3RpdmUsIGVkZ2VzLCBnZXROb2RlcyB9ID0gZ2V0KCk7XG4gICAgICAgIGxldCBjaGFuZ2VkRWRnZXM7XG4gICAgICAgIGxldCBjaGFuZ2VkTm9kZXMgPSBudWxsO1xuICAgICAgICBpZiAobXVsdGlTZWxlY3Rpb25BY3RpdmUpIHtcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyA9IHNlbGVjdGVkRWRnZUlkcy5tYXAoKGVkZ2VJZCkgPT4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKGVkZ2VJZCwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlZEVkZ2VzID0gZ2V0U2VsZWN0aW9uQ2hhbmdlcyhlZGdlcywgc2VsZWN0ZWRFZGdlSWRzKTtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyA9IGdldFNlbGVjdGlvbkNoYW5nZXMoZ2V0Tm9kZXMoKSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZU5vZGVzQW5kRWRnZXNTZWxlY3Rpb25zKHtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyxcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICB1bnNlbGVjdE5vZGVzQW5kRWRnZXM6ICh7IG5vZGVzLCBlZGdlcyB9ID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgeyBlZGdlczogc3RvcmVFZGdlcywgZ2V0Tm9kZXMgfSA9IGdldCgpO1xuICAgICAgICBjb25zdCBub2Rlc1RvVW5zZWxlY3QgPSBub2RlcyA/IG5vZGVzIDogZ2V0Tm9kZXMoKTtcbiAgICAgICAgY29uc3QgZWRnZXNUb1Vuc2VsZWN0ID0gZWRnZXMgPyBlZGdlcyA6IHN0b3JlRWRnZXM7XG4gICAgICAgIGNvbnN0IGNoYW5nZWROb2RlcyA9IG5vZGVzVG9VbnNlbGVjdC5tYXAoKG4pID0+IHtcbiAgICAgICAgICAgIG4uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3Rpb25DaGFuZ2Uobi5pZCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2hhbmdlZEVkZ2VzID0gZWRnZXNUb1Vuc2VsZWN0Lm1hcCgoZWRnZSkgPT4gY3JlYXRlU2VsZWN0aW9uQ2hhbmdlKGVkZ2UuaWQsIGZhbHNlKSk7XG4gICAgICAgIHVwZGF0ZU5vZGVzQW5kRWRnZXNTZWxlY3Rpb25zKHtcbiAgICAgICAgICAgIGNoYW5nZWROb2RlcyxcbiAgICAgICAgICAgIGNoYW5nZWRFZGdlcyxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzZXRNaW5ab29tOiAobWluWm9vbSkgPT4ge1xuICAgICAgICBjb25zdCB7IGQzWm9vbSwgbWF4Wm9vbSB9ID0gZ2V0KCk7XG4gICAgICAgIGQzWm9vbT8uc2NhbGVFeHRlbnQoW21pblpvb20sIG1heFpvb21dKTtcbiAgICAgICAgc2V0KHsgbWluWm9vbSB9KTtcbiAgICB9LFxuICAgIHNldE1heFpvb206IChtYXhab29tKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZDNab29tLCBtaW5ab29tIH0gPSBnZXQoKTtcbiAgICAgICAgZDNab29tPy5zY2FsZUV4dGVudChbbWluWm9vbSwgbWF4Wm9vbV0pO1xuICAgICAgICBzZXQoeyBtYXhab29tIH0pO1xuICAgIH0sXG4gICAgc2V0VHJhbnNsYXRlRXh0ZW50OiAodHJhbnNsYXRlRXh0ZW50KSA9PiB7XG4gICAgICAgIGdldCgpLmQzWm9vbT8udHJhbnNsYXRlRXh0ZW50KHRyYW5zbGF0ZUV4dGVudCk7XG4gICAgICAgIHNldCh7IHRyYW5zbGF0ZUV4dGVudCB9KTtcbiAgICB9LFxuICAgIHJlc2V0U2VsZWN0ZWRFbGVtZW50czogKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVkZ2VzLCBnZXROb2RlcyB9ID0gZ2V0KCk7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gZ2V0Tm9kZXMoKTtcbiAgICAgICAgY29uc3Qgbm9kZXNUb1Vuc2VsZWN0ID0gbm9kZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAubWFwKChuKSA9PiBjcmVhdGVTZWxlY3Rpb25DaGFuZ2Uobi5pZCwgZmFsc2UpKTtcbiAgICAgICAgY29uc3QgZWRnZXNUb1Vuc2VsZWN0ID0gZWRnZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAubWFwKChlKSA9PiBjcmVhdGVTZWxlY3Rpb25DaGFuZ2UoZS5pZCwgZmFsc2UpKTtcbiAgICAgICAgdXBkYXRlTm9kZXNBbmRFZGdlc1NlbGVjdGlvbnMoe1xuICAgICAgICAgICAgY2hhbmdlZE5vZGVzOiBub2Rlc1RvVW5zZWxlY3QsXG4gICAgICAgICAgICBjaGFuZ2VkRWRnZXM6IGVkZ2VzVG9VbnNlbGVjdCxcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzZXROb2RlRXh0ZW50OiAobm9kZUV4dGVudCkgPT4ge1xuICAgICAgICBjb25zdCB7IG5vZGVJbnRlcm5hbHMgfSA9IGdldCgpO1xuICAgICAgICBub2RlSW50ZXJuYWxzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgIG5vZGUucG9zaXRpb25BYnNvbHV0ZSA9IGNsYW1wUG9zaXRpb24obm9kZS5wb3NpdGlvbiwgbm9kZUV4dGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXQoe1xuICAgICAgICAgICAgbm9kZUV4dGVudCxcbiAgICAgICAgICAgIG5vZGVJbnRlcm5hbHM6IG5ldyBNYXAobm9kZUludGVybmFscyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFuQnk6IChkZWx0YSkgPT4ge1xuICAgICAgICBjb25zdCB7IHRyYW5zZm9ybSwgd2lkdGgsIGhlaWdodCwgZDNab29tLCBkM1NlbGVjdGlvbiwgdHJhbnNsYXRlRXh0ZW50IH0gPSBnZXQoKTtcbiAgICAgICAgaWYgKCFkM1pvb20gfHwgIWQzU2VsZWN0aW9uIHx8ICghZGVsdGEueCAmJiAhZGVsdGEueSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0VHJhbnNmb3JtID0gem9vbUlkZW50aXR5XG4gICAgICAgICAgICAudHJhbnNsYXRlKHRyYW5zZm9ybVswXSArIGRlbHRhLngsIHRyYW5zZm9ybVsxXSArIGRlbHRhLnkpXG4gICAgICAgICAgICAuc2NhbGUodHJhbnNmb3JtWzJdKTtcbiAgICAgICAgY29uc3QgZXh0ZW50ID0gW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBjb25zdHJhaW5lZFRyYW5zZm9ybSA9IGQzWm9vbT8uY29uc3RyYWluKCkobmV4dFRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgICAgICBkM1pvb20udHJhbnNmb3JtKGQzU2VsZWN0aW9uLCBjb25zdHJhaW5lZFRyYW5zZm9ybSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybUNoYW5nZWQgPSB0cmFuc2Zvcm1bMF0gIT09IGNvbnN0cmFpbmVkVHJhbnNmb3JtLnggfHxcbiAgICAgICAgICAgIHRyYW5zZm9ybVsxXSAhPT0gY29uc3RyYWluZWRUcmFuc2Zvcm0ueSB8fFxuICAgICAgICAgICAgdHJhbnNmb3JtWzJdICE9PSBjb25zdHJhaW5lZFRyYW5zZm9ybS5rO1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2hhbmdlZDtcbiAgICB9LFxuICAgIGNhbmNlbENvbm5lY3Rpb246ICgpID0+IHNldCh7XG4gICAgICAgIGNvbm5lY3Rpb25Ob2RlSWQ6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uTm9kZUlkLFxuICAgICAgICBjb25uZWN0aW9uSGFuZGxlSWQ6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uSGFuZGxlSWQsXG4gICAgICAgIGNvbm5lY3Rpb25IYW5kbGVUeXBlOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkhhbmRsZVR5cGUsXG4gICAgICAgIGNvbm5lY3Rpb25TdGF0dXM6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uU3RhdHVzLFxuICAgICAgICBjb25uZWN0aW9uU3RhcnRIYW5kbGU6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uU3RhcnRIYW5kbGUsXG4gICAgICAgIGNvbm5lY3Rpb25FbmRIYW5kbGU6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uRW5kSGFuZGxlLFxuICAgIH0pLFxuICAgIHJlc2V0OiAoKSA9PiBzZXQoeyAuLi5pbml0aWFsU3RhdGUgfSksXG59KSwgT2JqZWN0LmlzKTtcblxuY29uc3QgUmVhY3RGbG93UHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9KSA9PiB7XG4gICAgY29uc3Qgc3RvcmVSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgaWYgKCFzdG9yZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHN0b3JlUmVmLmN1cnJlbnQgPSBjcmVhdGVSRlN0b3JlKCk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFByb3ZpZGVyJDEsIHsgdmFsdWU6IHN0b3JlUmVmLmN1cnJlbnQgfSwgY2hpbGRyZW4pO1xufTtcblJlYWN0Rmxvd1Byb3ZpZGVyLmRpc3BsYXlOYW1lID0gJ1JlYWN0Rmxvd1Byb3ZpZGVyJztcblxuY29uc3QgV3JhcHBlciA9ICh7IGNoaWxkcmVuIH0pID0+IHtcbiAgICBjb25zdCBpc1dyYXBwZWQgPSB1c2VDb250ZXh0KFN0b3JlQ29udGV4dCk7XG4gICAgaWYgKGlzV3JhcHBlZCkge1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdyYXAgaXQgd2l0aCBhIGZyYWdtZW50IGJlY2F1c2UgaXQncyBub3QgYWxsb3dlZCBmb3IgY2hpbGRyZW4gdG8gYmUgYSBSZWFjdE5vZGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQvaXNzdWVzLzE4MDUxXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBjaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0Rmxvd1Byb3ZpZGVyLCBudWxsLCBjaGlsZHJlbik7XG59O1xuV3JhcHBlci5kaXNwbGF5TmFtZSA9ICdSZWFjdEZsb3dXcmFwcGVyJztcblxuY29uc3QgZGVmYXVsdE5vZGVUeXBlcyA9IHtcbiAgICBpbnB1dDogSW5wdXROb2RlJDEsXG4gICAgZGVmYXVsdDogRGVmYXVsdE5vZGUkMSxcbiAgICBvdXRwdXQ6IE91dHB1dE5vZGUkMSxcbiAgICBncm91cDogR3JvdXBOb2RlLFxufTtcbmNvbnN0IGRlZmF1bHRFZGdlVHlwZXMgPSB7XG4gICAgZGVmYXVsdDogQmV6aWVyRWRnZSxcbiAgICBzdHJhaWdodDogU3RyYWlnaHRFZGdlLFxuICAgIHN0ZXA6IFN0ZXBFZGdlLFxuICAgIHNtb290aHN0ZXA6IFNtb290aFN0ZXBFZGdlLFxuICAgIHNpbXBsZWJlemllcjogU2ltcGxlQmV6aWVyRWRnZSxcbn07XG5jb25zdCBpbml0Tm9kZU9yaWdpbiA9IFswLCAwXTtcbmNvbnN0IGluaXRTbmFwR3JpZCA9IFsxNSwgMTVdO1xuY29uc3QgaW5pdERlZmF1bHRWaWV3cG9ydCA9IHsgeDogMCwgeTogMCwgem9vbTogMSB9O1xuY29uc3Qgd3JhcHBlclN0eWxlID0ge1xuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHpJbmRleDogMCxcbn07XG5jb25zdCBSZWFjdEZsb3cgPSBmb3J3YXJkUmVmKCh7IG5vZGVzLCBlZGdlcywgZGVmYXVsdE5vZGVzLCBkZWZhdWx0RWRnZXMsIGNsYXNzTmFtZSwgbm9kZVR5cGVzID0gZGVmYXVsdE5vZGVUeXBlcywgZWRnZVR5cGVzID0gZGVmYXVsdEVkZ2VUeXBlcywgb25Ob2RlQ2xpY2ssIG9uRWRnZUNsaWNrLCBvbkluaXQsIG9uTW92ZSwgb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZCwgb25Db25uZWN0LCBvbkNvbm5lY3RTdGFydCwgb25Db25uZWN0RW5kLCBvbkNsaWNrQ29ubmVjdFN0YXJ0LCBvbkNsaWNrQ29ubmVjdEVuZCwgb25Ob2RlTW91c2VFbnRlciwgb25Ob2RlTW91c2VNb3ZlLCBvbk5vZGVNb3VzZUxlYXZlLCBvbk5vZGVDb250ZXh0TWVudSwgb25Ob2RlRG91YmxlQ2xpY2ssIG9uTm9kZURyYWdTdGFydCwgb25Ob2RlRHJhZywgb25Ob2RlRHJhZ1N0b3AsIG9uTm9kZXNEZWxldGUsIG9uRWRnZXNEZWxldGUsIG9uU2VsZWN0aW9uQ2hhbmdlLCBvblNlbGVjdGlvbkRyYWdTdGFydCwgb25TZWxlY3Rpb25EcmFnLCBvblNlbGVjdGlvbkRyYWdTdG9wLCBvblNlbGVjdGlvbkNvbnRleHRNZW51LCBvblNlbGVjdGlvblN0YXJ0LCBvblNlbGVjdGlvbkVuZCwgY29ubmVjdGlvbk1vZGUgPSBDb25uZWN0aW9uTW9kZS5TdHJpY3QsIGNvbm5lY3Rpb25MaW5lVHlwZSA9IENvbm5lY3Rpb25MaW5lVHlwZS5CZXppZXIsIGNvbm5lY3Rpb25MaW5lU3R5bGUsIGNvbm5lY3Rpb25MaW5lQ29tcG9uZW50LCBjb25uZWN0aW9uTGluZUNvbnRhaW5lclN0eWxlLCBkZWxldGVLZXlDb2RlID0gJ0JhY2tzcGFjZScsIHNlbGVjdGlvbktleUNvZGUgPSAnU2hpZnQnLCBzZWxlY3Rpb25PbkRyYWcgPSBmYWxzZSwgc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuRnVsbCwgcGFuQWN0aXZhdGlvbktleUNvZGUgPSAnU3BhY2UnLCBtdWx0aVNlbGVjdGlvbktleUNvZGUgPSBpc01hY09zKCkgPyAnTWV0YScgOiAnQ29udHJvbCcsIHpvb21BY3RpdmF0aW9uS2V5Q29kZSA9IGlzTWFjT3MoKSA/ICdNZXRhJyA6ICdDb250cm9sJywgc25hcFRvR3JpZCA9IGZhbHNlLCBzbmFwR3JpZCA9IGluaXRTbmFwR3JpZCwgb25seVJlbmRlclZpc2libGVFbGVtZW50cyA9IGZhbHNlLCBzZWxlY3ROb2Rlc09uRHJhZyA9IHRydWUsIG5vZGVzRHJhZ2dhYmxlLCBub2Rlc0Nvbm5lY3RhYmxlLCBub2Rlc0ZvY3VzYWJsZSwgbm9kZU9yaWdpbiA9IGluaXROb2RlT3JpZ2luLCBlZGdlc0ZvY3VzYWJsZSwgZWRnZXNVcGRhdGFibGUsIGVsZW1lbnRzU2VsZWN0YWJsZSwgZGVmYXVsdFZpZXdwb3J0ID0gaW5pdERlZmF1bHRWaWV3cG9ydCwgbWluWm9vbSA9IDAuNSwgbWF4Wm9vbSA9IDIsIHRyYW5zbGF0ZUV4dGVudCA9IGluZmluaXRlRXh0ZW50LCBwcmV2ZW50U2Nyb2xsaW5nID0gdHJ1ZSwgbm9kZUV4dGVudCwgZGVmYXVsdE1hcmtlckNvbG9yID0gJyNiMWIxYjcnLCB6b29tT25TY3JvbGwgPSB0cnVlLCB6b29tT25QaW5jaCA9IHRydWUsIHBhbk9uU2Nyb2xsID0gZmFsc2UsIHBhbk9uU2Nyb2xsU3BlZWQgPSAwLjUsIHBhbk9uU2Nyb2xsTW9kZSA9IFBhbk9uU2Nyb2xsTW9kZS5GcmVlLCB6b29tT25Eb3VibGVDbGljayA9IHRydWUsIHBhbk9uRHJhZyA9IHRydWUsIG9uUGFuZUNsaWNrLCBvblBhbmVNb3VzZUVudGVyLCBvblBhbmVNb3VzZU1vdmUsIG9uUGFuZU1vdXNlTGVhdmUsIG9uUGFuZVNjcm9sbCwgb25QYW5lQ29udGV4dE1lbnUsIGNoaWxkcmVuLCBvbkVkZ2VDb250ZXh0TWVudSwgb25FZGdlRG91YmxlQ2xpY2ssIG9uRWRnZU1vdXNlRW50ZXIsIG9uRWRnZU1vdXNlTW92ZSwgb25FZGdlTW91c2VMZWF2ZSwgb25FZGdlVXBkYXRlLCBvbkVkZ2VVcGRhdGVTdGFydCwgb25FZGdlVXBkYXRlRW5kLCBvblJlY29ubmVjdCwgb25SZWNvbm5lY3RTdGFydCwgb25SZWNvbm5lY3RFbmQsIHJlY29ubmVjdFJhZGl1cyA9IDEwLCBlZGdlVXBkYXRlclJhZGl1cyA9IDEwLCBvbk5vZGVzQ2hhbmdlLCBvbkVkZ2VzQ2hhbmdlLCBub0RyYWdDbGFzc05hbWUgPSAnbm9kcmFnJywgbm9XaGVlbENsYXNzTmFtZSA9ICdub3doZWVsJywgbm9QYW5DbGFzc05hbWUgPSAnbm9wYW4nLCBmaXRWaWV3ID0gZmFsc2UsIGZpdFZpZXdPcHRpb25zLCBjb25uZWN0T25DbGljayA9IHRydWUsIGF0dHJpYnV0aW9uUG9zaXRpb24sIHByb09wdGlvbnMsIGRlZmF1bHRFZGdlT3B0aW9ucywgZWxldmF0ZU5vZGVzT25TZWxlY3QgPSB0cnVlLCBlbGV2YXRlRWRnZXNPblNlbGVjdCA9IGZhbHNlLCBkaXNhYmxlS2V5Ym9hcmRBMTF5ID0gZmFsc2UsIGF1dG9QYW5PbkNvbm5lY3QgPSB0cnVlLCBhdXRvUGFuT25Ob2RlRHJhZyA9IHRydWUsIGNvbm5lY3Rpb25SYWRpdXMgPSAyMCwgaXNWYWxpZENvbm5lY3Rpb24sIG9uRXJyb3IsIHN0eWxlLCBpZCwgbm9kZURyYWdUaHJlc2hvbGQsIC4uLnJlc3QgfSwgcmVmKSA9PiB7XG4gICAgY29uc3QgcmZJZCA9IGlkIHx8ICcxJztcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyAuLi5yZXN0LCBzdHlsZTogeyAuLi5zdHlsZSwgLi4ud3JhcHBlclN0eWxlIH0sIHJlZjogcmVmLCBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvdycsIGNsYXNzTmFtZV0pLCBcImRhdGEtdGVzdGlkXCI6IFwicmZfX3dyYXBwZXJcIiwgaWQ6IGlkIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlciwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoR3JhcGhWaWV3JDEsIHsgb25Jbml0OiBvbkluaXQsIG9uTW92ZTogb25Nb3ZlLCBvbk1vdmVTdGFydDogb25Nb3ZlU3RhcnQsIG9uTW92ZUVuZDogb25Nb3ZlRW5kLCBvbk5vZGVDbGljazogb25Ob2RlQ2xpY2ssIG9uRWRnZUNsaWNrOiBvbkVkZ2VDbGljaywgb25Ob2RlTW91c2VFbnRlcjogb25Ob2RlTW91c2VFbnRlciwgb25Ob2RlTW91c2VNb3ZlOiBvbk5vZGVNb3VzZU1vdmUsIG9uTm9kZU1vdXNlTGVhdmU6IG9uTm9kZU1vdXNlTGVhdmUsIG9uTm9kZUNvbnRleHRNZW51OiBvbk5vZGVDb250ZXh0TWVudSwgb25Ob2RlRG91YmxlQ2xpY2s6IG9uTm9kZURvdWJsZUNsaWNrLCBub2RlVHlwZXM6IG5vZGVUeXBlcywgZWRnZVR5cGVzOiBlZGdlVHlwZXMsIGNvbm5lY3Rpb25MaW5lVHlwZTogY29ubmVjdGlvbkxpbmVUeXBlLCBjb25uZWN0aW9uTGluZVN0eWxlOiBjb25uZWN0aW9uTGluZVN0eWxlLCBjb25uZWN0aW9uTGluZUNvbXBvbmVudDogY29ubmVjdGlvbkxpbmVDb21wb25lbnQsIGNvbm5lY3Rpb25MaW5lQ29udGFpbmVyU3R5bGU6IGNvbm5lY3Rpb25MaW5lQ29udGFpbmVyU3R5bGUsIHNlbGVjdGlvbktleUNvZGU6IHNlbGVjdGlvbktleUNvZGUsIHNlbGVjdGlvbk9uRHJhZzogc2VsZWN0aW9uT25EcmFnLCBzZWxlY3Rpb25Nb2RlOiBzZWxlY3Rpb25Nb2RlLCBkZWxldGVLZXlDb2RlOiBkZWxldGVLZXlDb2RlLCBtdWx0aVNlbGVjdGlvbktleUNvZGU6IG11bHRpU2VsZWN0aW9uS2V5Q29kZSwgcGFuQWN0aXZhdGlvbktleUNvZGU6IHBhbkFjdGl2YXRpb25LZXlDb2RlLCB6b29tQWN0aXZhdGlvbktleUNvZGU6IHpvb21BY3RpdmF0aW9uS2V5Q29kZSwgb25seVJlbmRlclZpc2libGVFbGVtZW50czogb25seVJlbmRlclZpc2libGVFbGVtZW50cywgc2VsZWN0Tm9kZXNPbkRyYWc6IHNlbGVjdE5vZGVzT25EcmFnLCBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCwgdHJhbnNsYXRlRXh0ZW50OiB0cmFuc2xhdGVFeHRlbnQsIG1pblpvb206IG1pblpvb20sIG1heFpvb206IG1heFpvb20sIHByZXZlbnRTY3JvbGxpbmc6IHByZXZlbnRTY3JvbGxpbmcsIHpvb21PblNjcm9sbDogem9vbU9uU2Nyb2xsLCB6b29tT25QaW5jaDogem9vbU9uUGluY2gsIHpvb21PbkRvdWJsZUNsaWNrOiB6b29tT25Eb3VibGVDbGljaywgcGFuT25TY3JvbGw6IHBhbk9uU2Nyb2xsLCBwYW5PblNjcm9sbFNwZWVkOiBwYW5PblNjcm9sbFNwZWVkLCBwYW5PblNjcm9sbE1vZGU6IHBhbk9uU2Nyb2xsTW9kZSwgcGFuT25EcmFnOiBwYW5PbkRyYWcsIG9uUGFuZUNsaWNrOiBvblBhbmVDbGljaywgb25QYW5lTW91c2VFbnRlcjogb25QYW5lTW91c2VFbnRlciwgb25QYW5lTW91c2VNb3ZlOiBvblBhbmVNb3VzZU1vdmUsIG9uUGFuZU1vdXNlTGVhdmU6IG9uUGFuZU1vdXNlTGVhdmUsIG9uUGFuZVNjcm9sbDogb25QYW5lU2Nyb2xsLCBvblBhbmVDb250ZXh0TWVudTogb25QYW5lQ29udGV4dE1lbnUsIG9uU2VsZWN0aW9uQ29udGV4dE1lbnU6IG9uU2VsZWN0aW9uQ29udGV4dE1lbnUsIG9uU2VsZWN0aW9uU3RhcnQ6IG9uU2VsZWN0aW9uU3RhcnQsIG9uU2VsZWN0aW9uRW5kOiBvblNlbGVjdGlvbkVuZCwgb25FZGdlQ29udGV4dE1lbnU6IG9uRWRnZUNvbnRleHRNZW51LCBvbkVkZ2VEb3VibGVDbGljazogb25FZGdlRG91YmxlQ2xpY2ssIG9uRWRnZU1vdXNlRW50ZXI6IG9uRWRnZU1vdXNlRW50ZXIsIG9uRWRnZU1vdXNlTW92ZTogb25FZGdlTW91c2VNb3ZlLCBvbkVkZ2VNb3VzZUxlYXZlOiBvbkVkZ2VNb3VzZUxlYXZlLCBvblJlY29ubmVjdDogb25SZWNvbm5lY3QgPz8gb25FZGdlVXBkYXRlLCBvblJlY29ubmVjdFN0YXJ0OiBvblJlY29ubmVjdFN0YXJ0ID8/IG9uRWRnZVVwZGF0ZVN0YXJ0LCBvblJlY29ubmVjdEVuZDogb25SZWNvbm5lY3RFbmQgPz8gb25FZGdlVXBkYXRlRW5kLCByZWNvbm5lY3RSYWRpdXM6IHJlY29ubmVjdFJhZGl1cyA/PyBlZGdlVXBkYXRlclJhZGl1cywgZGVmYXVsdE1hcmtlckNvbG9yOiBkZWZhdWx0TWFya2VyQ29sb3IsIG5vRHJhZ0NsYXNzTmFtZTogbm9EcmFnQ2xhc3NOYW1lLCBub1doZWVsQ2xhc3NOYW1lOiBub1doZWVsQ2xhc3NOYW1lLCBub1BhbkNsYXNzTmFtZTogbm9QYW5DbGFzc05hbWUsIGVsZXZhdGVFZGdlc09uU2VsZWN0OiBlbGV2YXRlRWRnZXNPblNlbGVjdCwgcmZJZDogcmZJZCwgZGlzYWJsZUtleWJvYXJkQTExeTogZGlzYWJsZUtleWJvYXJkQTExeSwgbm9kZU9yaWdpbjogbm9kZU9yaWdpbiwgbm9kZUV4dGVudDogbm9kZUV4dGVudCB9KSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3RvcmVVcGRhdGVyLCB7IG5vZGVzOiBub2RlcywgZWRnZXM6IGVkZ2VzLCBkZWZhdWx0Tm9kZXM6IGRlZmF1bHROb2RlcywgZGVmYXVsdEVkZ2VzOiBkZWZhdWx0RWRnZXMsIG9uQ29ubmVjdDogb25Db25uZWN0LCBvbkNvbm5lY3RTdGFydDogb25Db25uZWN0U3RhcnQsIG9uQ29ubmVjdEVuZDogb25Db25uZWN0RW5kLCBvbkNsaWNrQ29ubmVjdFN0YXJ0OiBvbkNsaWNrQ29ubmVjdFN0YXJ0LCBvbkNsaWNrQ29ubmVjdEVuZDogb25DbGlja0Nvbm5lY3RFbmQsIG5vZGVzRHJhZ2dhYmxlOiBub2Rlc0RyYWdnYWJsZSwgbm9kZXNDb25uZWN0YWJsZTogbm9kZXNDb25uZWN0YWJsZSwgbm9kZXNGb2N1c2FibGU6IG5vZGVzRm9jdXNhYmxlLCBlZGdlc0ZvY3VzYWJsZTogZWRnZXNGb2N1c2FibGUsIGVkZ2VzVXBkYXRhYmxlOiBlZGdlc1VwZGF0YWJsZSwgZWxlbWVudHNTZWxlY3RhYmxlOiBlbGVtZW50c1NlbGVjdGFibGUsIGVsZXZhdGVOb2Rlc09uU2VsZWN0OiBlbGV2YXRlTm9kZXNPblNlbGVjdCwgbWluWm9vbTogbWluWm9vbSwgbWF4Wm9vbTogbWF4Wm9vbSwgbm9kZUV4dGVudDogbm9kZUV4dGVudCwgb25Ob2Rlc0NoYW5nZTogb25Ob2Rlc0NoYW5nZSwgb25FZGdlc0NoYW5nZTogb25FZGdlc0NoYW5nZSwgc25hcFRvR3JpZDogc25hcFRvR3JpZCwgc25hcEdyaWQ6IHNuYXBHcmlkLCBjb25uZWN0aW9uTW9kZTogY29ubmVjdGlvbk1vZGUsIHRyYW5zbGF0ZUV4dGVudDogdHJhbnNsYXRlRXh0ZW50LCBjb25uZWN0T25DbGljazogY29ubmVjdE9uQ2xpY2ssIGRlZmF1bHRFZGdlT3B0aW9uczogZGVmYXVsdEVkZ2VPcHRpb25zLCBmaXRWaWV3OiBmaXRWaWV3LCBmaXRWaWV3T3B0aW9uczogZml0Vmlld09wdGlvbnMsIG9uTm9kZXNEZWxldGU6IG9uTm9kZXNEZWxldGUsIG9uRWRnZXNEZWxldGU6IG9uRWRnZXNEZWxldGUsIG9uTm9kZURyYWdTdGFydDogb25Ob2RlRHJhZ1N0YXJ0LCBvbk5vZGVEcmFnOiBvbk5vZGVEcmFnLCBvbk5vZGVEcmFnU3RvcDogb25Ob2RlRHJhZ1N0b3AsIG9uU2VsZWN0aW9uRHJhZzogb25TZWxlY3Rpb25EcmFnLCBvblNlbGVjdGlvbkRyYWdTdGFydDogb25TZWxlY3Rpb25EcmFnU3RhcnQsIG9uU2VsZWN0aW9uRHJhZ1N0b3A6IG9uU2VsZWN0aW9uRHJhZ1N0b3AsIG5vUGFuQ2xhc3NOYW1lOiBub1BhbkNsYXNzTmFtZSwgbm9kZU9yaWdpbjogbm9kZU9yaWdpbiwgcmZJZDogcmZJZCwgYXV0b1Bhbk9uQ29ubmVjdDogYXV0b1Bhbk9uQ29ubmVjdCwgYXV0b1Bhbk9uTm9kZURyYWc6IGF1dG9QYW5Pbk5vZGVEcmFnLCBvbkVycm9yOiBvbkVycm9yLCBjb25uZWN0aW9uUmFkaXVzOiBjb25uZWN0aW9uUmFkaXVzLCBpc1ZhbGlkQ29ubmVjdGlvbjogaXNWYWxpZENvbm5lY3Rpb24sIG5vZGVEcmFnVGhyZXNob2xkOiBub2RlRHJhZ1RocmVzaG9sZCB9KSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlciQxLCB7IG9uU2VsZWN0aW9uQ2hhbmdlOiBvblNlbGVjdGlvbkNoYW5nZSB9KSxcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChBdHRyaWJ1dGlvbiwgeyBwcm9PcHRpb25zOiBwcm9PcHRpb25zLCBwb3NpdGlvbjogYXR0cmlidXRpb25Qb3NpdGlvbiB9KSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQTExeURlc2NyaXB0aW9ucywgeyByZklkOiByZklkLCBkaXNhYmxlS2V5Ym9hcmRBMTF5OiBkaXNhYmxlS2V5Ym9hcmRBMTF5IH0pKSkpO1xufSk7XG5SZWFjdEZsb3cuZGlzcGxheU5hbWUgPSAnUmVhY3RGbG93JztcblxuY29uc3Qgc2VsZWN0b3IkMSA9IChzKSA9PiBzLmRvbU5vZGU/LnF1ZXJ5U2VsZWN0b3IoJy5yZWFjdC1mbG93X19lZGdlbGFiZWwtcmVuZGVyZXInKTtcbmZ1bmN0aW9uIEVkZ2VMYWJlbFJlbmRlcmVyKHsgY2hpbGRyZW4gfSkge1xuICAgIGNvbnN0IGVkZ2VMYWJlbFJlbmRlcmVyID0gdXNlU3RvcmUoc2VsZWN0b3IkMSk7XG4gICAgaWYgKCFlZGdlTGFiZWxSZW5kZXJlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgZWRnZUxhYmVsUmVuZGVyZXIpO1xufVxuXG5mdW5jdGlvbiB1c2VVcGRhdGVOb2RlSW50ZXJuYWxzKCkge1xuICAgIGNvbnN0IHN0b3JlID0gdXNlU3RvcmVBcGkoKTtcbiAgICByZXR1cm4gdXNlQ2FsbGJhY2soKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZG9tTm9kZSwgdXBkYXRlTm9kZURpbWVuc2lvbnMgfSA9IHN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xuICAgICAgICBjb25zdCB1cGRhdGVzID0gdXBkYXRlSWRzLnJlZHVjZSgocmVzLCB1cGRhdGVJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUVsZW1lbnQgPSBkb21Ob2RlPy5xdWVyeVNlbGVjdG9yKGAucmVhY3QtZmxvd19fbm9kZVtkYXRhLWlkPVwiJHt1cGRhdGVJZH1cIl1gKTtcbiAgICAgICAgICAgIGlmIChub2RlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKHsgaWQ6IHVwZGF0ZUlkLCBub2RlRWxlbWVudCwgZm9yY2VVcGRhdGU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB1cGRhdGVOb2RlRGltZW5zaW9ucyh1cGRhdGVzKSk7XG4gICAgfSwgW10pO1xufVxuXG5jb25zdCBub2Rlc1NlbGVjdG9yID0gKHN0YXRlKSA9PiBzdGF0ZS5nZXROb2RlcygpO1xuZnVuY3Rpb24gdXNlTm9kZXMoKSB7XG4gICAgY29uc3Qgbm9kZXMgPSB1c2VTdG9yZShub2Rlc1NlbGVjdG9yLCBzaGFsbG93KTtcbiAgICByZXR1cm4gbm9kZXM7XG59XG5cbmNvbnN0IGVkZ2VzU2VsZWN0b3IgPSAoc3RhdGUpID0+IHN0YXRlLmVkZ2VzO1xuZnVuY3Rpb24gdXNlRWRnZXMoKSB7XG4gICAgY29uc3QgZWRnZXMgPSB1c2VTdG9yZShlZGdlc1NlbGVjdG9yLCBzaGFsbG93KTtcbiAgICByZXR1cm4gZWRnZXM7XG59XG5cbmNvbnN0IHZpZXdwb3J0U2VsZWN0b3IgPSAoc3RhdGUpID0+ICh7XG4gICAgeDogc3RhdGUudHJhbnNmb3JtWzBdLFxuICAgIHk6IHN0YXRlLnRyYW5zZm9ybVsxXSxcbiAgICB6b29tOiBzdGF0ZS50cmFuc2Zvcm1bMl0sXG59KTtcbmZ1bmN0aW9uIHVzZVZpZXdwb3J0KCkge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gdXNlU3RvcmUodmlld3BvcnRTZWxlY3Rvciwgc2hhbGxvdyk7XG4gICAgcmV0dXJuIHZpZXdwb3J0O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5mdW5jdGlvbiBjcmVhdGVVc2VJdGVtc1N0YXRlKGFwcGx5Q2hhbmdlcykge1xuICAgIHJldHVybiAoaW5pdGlhbEl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IFtpdGVtcywgc2V0SXRlbXNdID0gdXNlU3RhdGUoaW5pdGlhbEl0ZW1zKTtcbiAgICAgICAgY29uc3Qgb25JdGVtc0NoYW5nZSA9IHVzZUNhbGxiYWNrKChjaGFuZ2VzKSA9PiBzZXRJdGVtcygoaXRlbXMpID0+IGFwcGx5Q2hhbmdlcyhjaGFuZ2VzLCBpdGVtcykpLCBbXSk7XG4gICAgICAgIHJldHVybiBbaXRlbXMsIHNldEl0ZW1zLCBvbkl0ZW1zQ2hhbmdlXTtcbiAgICB9O1xufVxuY29uc3QgdXNlTm9kZXNTdGF0ZSA9IGNyZWF0ZVVzZUl0ZW1zU3RhdGUoYXBwbHlOb2RlQ2hhbmdlcyk7XG5jb25zdCB1c2VFZGdlc1N0YXRlID0gY3JlYXRlVXNlSXRlbXNTdGF0ZShhcHBseUVkZ2VDaGFuZ2VzKTtcblxuZnVuY3Rpb24gdXNlT25WaWV3cG9ydENoYW5nZSh7IG9uU3RhcnQsIG9uQ2hhbmdlLCBvbkVuZCB9KSB7XG4gICAgY29uc3Qgc3RvcmUgPSB1c2VTdG9yZUFwaSgpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHN0b3JlLnNldFN0YXRlKHsgb25WaWV3cG9ydENoYW5nZVN0YXJ0OiBvblN0YXJ0IH0pO1xuICAgIH0sIFtvblN0YXJ0XSk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBvblZpZXdwb3J0Q2hhbmdlOiBvbkNoYW5nZSB9KTtcbiAgICB9LCBbb25DaGFuZ2VdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdG9yZS5zZXRTdGF0ZSh7IG9uVmlld3BvcnRDaGFuZ2VFbmQ6IG9uRW5kIH0pO1xuICAgIH0sIFtvbkVuZF0pO1xufVxuXG5mdW5jdGlvbiB1c2VPblNlbGVjdGlvbkNoYW5nZSh7IG9uQ2hhbmdlIH0pIHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFNlbGVjdGlvbkNoYW5nZUhhbmRsZXJzID0gWy4uLnN0b3JlLmdldFN0YXRlKCkub25TZWxlY3Rpb25DaGFuZ2UsIG9uQ2hhbmdlXTtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBvblNlbGVjdGlvbkNoYW5nZTogbmV4dFNlbGVjdGlvbkNoYW5nZUhhbmRsZXJzIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV4dEhhbmRsZXJzID0gc3RvcmUuZ2V0U3RhdGUoKS5vblNlbGVjdGlvbkNoYW5nZS5maWx0ZXIoKGZuKSA9PiBmbiAhPT0gb25DaGFuZ2UpO1xuICAgICAgICAgICAgc3RvcmUuc2V0U3RhdGUoeyBvblNlbGVjdGlvbkNoYW5nZTogbmV4dEhhbmRsZXJzIH0pO1xuICAgICAgICB9O1xuICAgIH0sIFtvbkNoYW5nZV0pO1xufVxuXG5jb25zdCBzZWxlY3RvciA9IChvcHRpb25zKSA9PiAocykgPT4ge1xuICAgIGlmIChzLm5vZGVJbnRlcm5hbHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBzXG4gICAgICAgIC5nZXROb2RlcygpXG4gICAgICAgIC5maWx0ZXIoKG4pID0+IChvcHRpb25zLmluY2x1ZGVIaWRkZW5Ob2RlcyA/IHRydWUgOiAhbi5oaWRkZW4pKVxuICAgICAgICAuZXZlcnkoKG4pID0+IG5baW50ZXJuYWxzU3ltYm9sXT8uaGFuZGxlQm91bmRzICE9PSB1bmRlZmluZWQpO1xufTtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGluY2x1ZGVIaWRkZW5Ob2RlczogZmFsc2UsXG59O1xuZnVuY3Rpb24gdXNlTm9kZXNJbml0aWFsaXplZChvcHRpb25zID0gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICBjb25zdCBpbml0aWFsaXplZCA9IHVzZVN0b3JlKHNlbGVjdG9yKG9wdGlvbnMpKTtcbiAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7XG59XG5cbmV4cG9ydCB7IEJhc2VFZGdlLCBCZXppZXJFZGdlLCBDb25uZWN0aW9uTGluZVR5cGUsIENvbm5lY3Rpb25Nb2RlLCBFZGdlTGFiZWxSZW5kZXJlciwgRWRnZVRleHQkMSBhcyBFZGdlVGV4dCwgSGFuZGxlJDEgYXMgSGFuZGxlLCBNYXJrZXJUeXBlLCBQYW5PblNjcm9sbE1vZGUsIFBhbmVsLCBQb3NpdGlvbiwgUmVhY3RGbG93LCBSZWFjdEZsb3dQcm92aWRlciwgU2VsZWN0aW9uTW9kZSwgU2ltcGxlQmV6aWVyRWRnZSwgU21vb3RoU3RlcEVkZ2UsIFN0ZXBFZGdlLCBTdHJhaWdodEVkZ2UsIGFkZEVkZ2UsIGFwcGx5RWRnZUNoYW5nZXMsIGFwcGx5Tm9kZUNoYW5nZXMsIGJveFRvUmVjdCwgY2xhbXAsIGdldEJlemllclBhdGgsIGdldEJvdW5kc09mUmVjdHMsIGdldENvbm5lY3RlZEVkZ2VzLCBnZXRJbmNvbWVycywgZ2V0TWFya2VyRW5kLCBnZXROb2RlUG9zaXRpb25XaXRoT3JpZ2luLCBnZXROb2Rlc0JvdW5kcywgZ2V0T3V0Z29lcnMsIGdldFJlY3RPZk5vZGVzLCBnZXRTaW1wbGVCZXppZXJQYXRoLCBnZXRTbW9vdGhTdGVwUGF0aCwgZ2V0U3RyYWlnaHRQYXRoLCBnZXRUcmFuc2Zvcm1Gb3JCb3VuZHMsIGdldFZpZXdwb3J0Rm9yQm91bmRzLCBoYW5kbGVQYXJlbnRFeHBhbmQsIGludGVybmFsc1N5bWJvbCwgaXNFZGdlLCBpc05vZGUsIHJlY29ubmVjdEVkZ2UsIHJlY3RUb0JveCwgdXBkYXRlRWRnZSwgdXNlRWRnZXMsIHVzZUVkZ2VzU3RhdGUsIHVzZUdldFBvaW50ZXJQb3NpdGlvbiwgdXNlS2V5UHJlc3MsIHVzZU5vZGVJZCwgdXNlTm9kZXMsIHVzZU5vZGVzSW5pdGlhbGl6ZWQsIHVzZU5vZGVzU3RhdGUsIHVzZU9uU2VsZWN0aW9uQ2hhbmdlLCB1c2VPblZpZXdwb3J0Q2hhbmdlLCB1c2VSZWFjdEZsb3csIHVzZVN0b3JlLCB1c2VTdG9yZUFwaSwgdXNlVXBkYXRlTm9kZUludGVybmFscywgdXNlVmlld3BvcnQgfTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYyhuYW1lcykge1xuICBpZiAodHlwZW9mIG5hbWVzID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBuYW1lcyA9PT0gXCJudW1iZXJcIikgcmV0dXJuIFwiXCIgKyBuYW1lc1xuXG4gIGxldCBvdXQgPSBcIlwiXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXMpKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHRtcDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKHRtcCA9IGNjKG5hbWVzW2ldKSkgIT09IFwiXCIpIHtcbiAgICAgICAgb3V0ICs9IChvdXQgJiYgXCIgXCIpICsgdG1wXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGsgaW4gbmFtZXMpIHtcbiAgICAgIGlmIChuYW1lc1trXSkgb3V0ICs9IChvdXQgJiYgXCIgXCIpICsga1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiIsICJpbXBvcnQgUmVhY3RFeHBvcnRzIGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VTeW5jRXh0ZXJuYWxTdG9yZUV4cG9ydHMgZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAnenVzdGFuZC92YW5pbGxhJztcblxuY29uc3QgeyB1c2VEZWJ1Z1ZhbHVlIH0gPSBSZWFjdEV4cG9ydHM7XG5jb25zdCB7IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yIH0gPSB1c2VTeW5jRXh0ZXJuYWxTdG9yZUV4cG9ydHM7XG5jb25zdCBpZGVudGl0eSA9IChhcmcpID0+IGFyZztcbmZ1bmN0aW9uIHVzZVN0b3JlV2l0aEVxdWFsaXR5Rm4oYXBpLCBzZWxlY3RvciA9IGlkZW50aXR5LCBlcXVhbGl0eUZuKSB7XG4gIGNvbnN0IHNsaWNlID0gdXNlU3luY0V4dGVybmFsU3RvcmVXaXRoU2VsZWN0b3IoXG4gICAgYXBpLnN1YnNjcmliZSxcbiAgICBhcGkuZ2V0U3RhdGUsXG4gICAgYXBpLmdldFNlcnZlclN0YXRlIHx8IGFwaS5nZXRJbml0aWFsU3RhdGUsXG4gICAgc2VsZWN0b3IsXG4gICAgZXF1YWxpdHlGblxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHNsaWNlKTtcbiAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgY3JlYXRlV2l0aEVxdWFsaXR5Rm5JbXBsID0gKGNyZWF0ZVN0YXRlLCBkZWZhdWx0RXF1YWxpdHlGbikgPT4ge1xuICBjb25zdCBhcGkgPSBjcmVhdGVTdG9yZShjcmVhdGVTdGF0ZSk7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmVXaXRoRXF1YWxpdHlGbiA9IChzZWxlY3RvciwgZXF1YWxpdHlGbiA9IGRlZmF1bHRFcXVhbGl0eUZuKSA9PiB1c2VTdG9yZVdpdGhFcXVhbGl0eUZuKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmVXaXRoRXF1YWxpdHlGbiwgYXBpKTtcbiAgcmV0dXJuIHVzZUJvdW5kU3RvcmVXaXRoRXF1YWxpdHlGbjtcbn07XG5jb25zdCBjcmVhdGVXaXRoRXF1YWxpdHlGbiA9IChjcmVhdGVTdGF0ZSwgZGVmYXVsdEVxdWFsaXR5Rm4pID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlV2l0aEVxdWFsaXR5Rm5JbXBsKGNyZWF0ZVN0YXRlLCBkZWZhdWx0RXF1YWxpdHlGbikgOiBjcmVhdGVXaXRoRXF1YWxpdHlGbkltcGw7XG5cbmV4cG9ydCB7IGNyZWF0ZVdpdGhFcXVhbGl0eUZuLCB1c2VTdG9yZVdpdGhFcXVhbGl0eUZuIH07XG4iLCAiY29uc3QgY3JlYXRlU3RvcmVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgc2V0U3RhdGUgPSAocGFydGlhbCwgcmVwbGFjZSkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHR5cGVvZiBwYXJ0aWFsID09PSBcImZ1bmN0aW9uXCIgPyBwYXJ0aWFsKHN0YXRlKSA6IHBhcnRpYWw7XG4gICAgaWYgKCFPYmplY3QuaXMobmV4dFN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHN0YXRlID0gKHJlcGxhY2UgIT0gbnVsbCA/IHJlcGxhY2UgOiB0eXBlb2YgbmV4dFN0YXRlICE9PSBcIm9iamVjdFwiIHx8IG5leHRTdGF0ZSA9PT0gbnVsbCkgPyBuZXh0U3RhdGUgOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoc3RhdGUsIHByZXZpb3VzU3RhdGUpKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldFN0YXRlID0gKCkgPT4gc3RhdGU7XG4gIGNvbnN0IGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGluaXRpYWxTdGF0ZTtcbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltERVBSRUNBVEVEXSBUaGUgYGRlc3Ryb3lgIG1ldGhvZCB3aWxsIGJlIHVuc3VwcG9ydGVkIGluIGEgZnV0dXJlIHZlcnNpb24uIEluc3RlYWQgdXNlIHVuc3Vic2NyaWJlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IHN1YnNjcmliZS4gRXZlcnl0aGluZyB3aWxsIGJlIGdhcmJhZ2UtY29sbGVjdGVkIGlmIHN0b3JlIGlzIGdhcmJhZ2UtY29sbGVjdGVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfTtcbiAgY29uc3QgYXBpID0geyBzZXRTdGF0ZSwgZ2V0U3RhdGUsIGdldEluaXRpYWxTdGF0ZSwgc3Vic2NyaWJlLCBkZXN0cm95IH07XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHN0YXRlID0gY3JlYXRlU3RhdGUoc2V0U3RhdGUsIGdldFN0YXRlLCBhcGkpO1xuICByZXR1cm4gYXBpO1xufTtcbmNvbnN0IGNyZWF0ZVN0b3JlID0gKGNyZWF0ZVN0YXRlKSA9PiBjcmVhdGVTdGF0ZSA/IGNyZWF0ZVN0b3JlSW1wbChjcmVhdGVTdGF0ZSkgOiBjcmVhdGVTdG9yZUltcGw7XG52YXIgdmFuaWxsYSA9IChjcmVhdGVTdGF0ZSkgPT4ge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltERVBSRUNBVEVEXSBEZWZhdWx0IGV4cG9ydCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYScuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVTdG9yZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgdmFuaWxsYSBhcyBkZWZhdWx0IH07XG4iLCAiZnVuY3Rpb24gc2hhbGxvdyQxKG9iakEsIG9iakIpIHtcbiAgaWYgKE9iamVjdC5pcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSBcIm9iamVjdFwiIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG9iakEgaW5zdGFuY2VvZiBNYXAgJiYgb2JqQiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGlmIChvYmpBLnNpemUgIT09IG9iakIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iakEpIHtcbiAgICAgIGlmICghT2JqZWN0LmlzKHZhbHVlLCBvYmpCLmdldChrZXkpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChvYmpBIGluc3RhbmNlb2YgU2V0ICYmIG9iakIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBpZiAob2JqQS5zaXplICE9PSBvYmpCLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iakEpIHtcbiAgICAgIGlmICghb2JqQi5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob2JqQikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3Qga2V5QSBvZiBrZXlzQSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleUEpIHx8ICFPYmplY3QuaXMob2JqQVtrZXlBXSwgb2JqQltrZXlBXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBzaGFsbG93ID0gKG9iakEsIG9iakIpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gRGVmYXVsdCBleHBvcnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCB1c2UgYGltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICd6dXN0YW5kL3NoYWxsb3cnYC5cIlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHNoYWxsb3ckMShvYmpBLCBvYmpCKTtcbn07XG5cbmV4cG9ydCB7IHNoYWxsb3cgYXMgZGVmYXVsdCwgc2hhbGxvdyQxIGFzIHNoYWxsb3cgfTtcbiIsICJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsICJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCAiaW1wb3J0IG5hbWVzcGFjZXMgZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBwcmVmaXggPSBuYW1lICs9IFwiXCIsIGkgPSBwcmVmaXguaW5kZXhPZihcIjpcIik7XG4gIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICIvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW5cbi8vIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYXJyYXktbGlrZSBvYmplY3RzIHBhc3NlZCB0byBkMy5zZWxlY3RBbGxcbi8vIG9yIHNlbGVjdGlvbi5zZWxlY3RBbGwgYXJlIGNvbnZlcnRlZCBpbnRvIHByb3BlciBhcnJheXMgd2hlbiBjcmVhdGluZyBhXG4vLyBzZWxlY3Rpb247IHdlIGRvblx1MjAxOXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlXG4vLyBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdC4gSG93ZXZlciwgbm90ZSB0aGF0IHNlbGVjdGlvbi5zZWxlY3RBbGwgd2lsbCB1c2UgYVxuLy8gc3RhdGljIE5vZGVMaXN0IGFzIGEgZ3JvdXAsIHNpbmNlIGl0IHNhZmVseSBkZXJpdmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFycmF5KHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh4KSA/IHggOiBBcnJheS5mcm9tKHgpO1xufVxuIiwgImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBhcnJheSBmcm9tIFwiLi4vYXJyYXkuanNcIjtcbmltcG9ydCBzZWxlY3RvckFsbCBmcm9tIFwiLi4vc2VsZWN0b3JBbGwuanNcIjtcblxuZnVuY3Rpb24gYXJyYXlBbGwoc2VsZWN0KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYXJyYXkoc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgaWYgKHR5cGVvZiBzZWxlY3QgPT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gYXJyYXlBbGwoc2VsZWN0KTtcbiAgZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHBhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuXG5mdW5jdGlvbiBjaGlsZHJlbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbik7XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuRmlsdGVyKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmlsdGVyLmNhbGwodGhpcy5jaGlsZHJlbiwgbWF0Y2gpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuXG4gICAgICA6IGNoaWxkcmVuRmlsdGVyKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCAiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsICJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHtcbiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTtcbiAgdGhpcy5fbmV4dCA9IG51bGw7XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtO1xufVxuXG5FbnRlck5vZGUucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LFxuICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSxcbiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSxcbiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxufTtcbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb25cdTIwMTl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzblx1MjAxOXQgd29ycmllZCBhYm91dCBcdTIwMUNsaXZlXHUyMDFEIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvblx1MjAxOXQ7IHdlXHUyMDE5ZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCAiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZW50ZXIgPSBvbmVudGVyKGVudGVyKTtcbiAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgZW50ZXIgPSBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICB9XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgICBpZiAodXBkYXRlKSB1cGRhdGUgPSB1cGRhdGUuc2VsZWN0aW9uKCk7XG4gIH1cbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsICJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgIG5leHQgPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMubm9kZSgpO1xufVxuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlKSB7XG4gIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGVcbiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3dcbiAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudFxufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCAiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCAiZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XFxzKy8pO1xufVxuXG5mdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkge1xuICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHtcbiAgdGhpcy5fbm9kZSA9IG5vZGU7XG4gIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheShub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpO1xufVxuXG5DbGFzc0xpc3QucHJvdG90eXBlID0ge1xuICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpO1xuICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB0aGlzLl9uYW1lcy5qb2luKFwiIFwiKSk7XG4gICAgfVxuICB9LFxuICBjb250YWluczogZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkVHJ1ZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZEFkZCh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbihuYW1lcywgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCA6IGNsYXNzZWRSZW1vdmUpKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIG5hbWVzID0gY2xhc3NBcnJheShuYW1lICsgXCJcIik7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlXG4gICAgICA/IGNsYXNzZWRUcnVlXG4gICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsICJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsICJmdW5jdGlvbiByYWlzZSgpIHtcbiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmFpc2UpO1xufVxuIiwgImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCAiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yIGZyb20gXCIuLi9zZWxlY3Rvci5qc1wiO1xuXG5mdW5jdGlvbiBjb25zdGFudE51bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSxcbiAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gXCJmdW5jdGlvblwiID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwgImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKVxuICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXztcbn1cbiIsICJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwgImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiooKSB7XG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB5aWVsZCBub2RlO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwgImltcG9ydCB7U2VsZWN0aW9uLCByb290fSBmcm9tIFwiLi9zZWxlY3Rpb24vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pXG4gICAgICA6IG5ldyBTZWxlY3Rpb24oW1tzZWxlY3Rvcl1dLCByb290KTtcbn1cbiIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihldmVudCkge1xuICBsZXQgc291cmNlRXZlbnQ7XG4gIHdoaWxlIChzb3VyY2VFdmVudCA9IGV2ZW50LnNvdXJjZUV2ZW50KSBldmVudCA9IHNvdXJjZUV2ZW50O1xuICByZXR1cm4gZXZlbnQ7XG59XG4iLCAiaW1wb3J0IHNvdXJjZUV2ZW50IGZyb20gXCIuL3NvdXJjZUV2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50LCBub2RlKSB7XG4gIGV2ZW50ID0gc291cmNlRXZlbnQoZXZlbnQpO1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSBub2RlID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTtcbiAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7XG4gICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTtcbiAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07XG4gICAgfVxuICAgIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbZXZlbnQucGFnZVgsIGV2ZW50LnBhZ2VZXTtcbn1cbiIsICIvLyBUaGVzZSBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBub2V2ZW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhblxuLy8gcHJldmVudERlZmF1bHQgb24gdGhlIGV2ZW50LlxuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmUgPSB7cGFzc2l2ZTogZmFsc2V9O1xuZXhwb3J0IGNvbnN0IG5vbnBhc3NpdmVjYXB0dXJlID0ge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwgImltcG9ydCB7c2VsZWN0fSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgbm9ldmVudCwge25vbnBhc3NpdmVjYXB0dXJlfSBmcm9tIFwiLi9ub2V2ZW50LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZpZXcpIHtcbiAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCh2aWV3KS5vbihcImRyYWdzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG5vZXZlbnQsIG5vbnBhc3NpdmVjYXB0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7XG4gICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gXCJub25lXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHllc2RyYWcodmlldywgbm9jbGljaykge1xuICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKFwiZHJhZ3N0YXJ0LmRyYWdcIiwgbnVsbCk7XG4gIGlmIChub2NsaWNrKSB7XG4gICAgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBub2V2ZW50LCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKFwiY2xpY2suZHJhZ1wiLCBudWxsKTsgfSwgMCk7XG4gIH1cbiAgaWYgKFwib25zZWxlY3RzdGFydFwiIGluIHJvb3QpIHtcbiAgICBzZWxlY3Rpb24ub24oXCJzZWxlY3RzdGFydC5kcmFnXCIsIG51bGwpO1xuICB9IGVsc2Uge1xuICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDtcbiAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0O1xuICB9XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERyYWdFdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICBzdWJqZWN0LFxuICB0YXJnZXQsXG4gIGlkZW50aWZpZXIsXG4gIGFjdGl2ZSxcbiAgeCwgeSwgZHgsIGR5LFxuICBkaXNwYXRjaFxufSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgdHlwZToge3ZhbHVlOiB0eXBlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHNvdXJjZUV2ZW50OiB7dmFsdWU6IHNvdXJjZUV2ZW50LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHN1YmplY3Q6IHt2YWx1ZTogc3ViamVjdCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIGlkZW50aWZpZXI6IHt2YWx1ZTogaWRlbnRpZmllciwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBhY3RpdmU6IHt2YWx1ZTogYWN0aXZlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHg6IHt2YWx1ZTogeCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB5OiB7dmFsdWU6IHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHg6IHt2YWx1ZTogZHgsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgZHk6IHt2YWx1ZTogZHksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG5cbkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5fLm9uLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7XG59O1xuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtzZWxlY3QsIHBvaW50ZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBub2RyYWcsIHt5ZXNkcmFnfSBmcm9tIFwiLi9ub2RyYWcuanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9ucGFzc2l2ZSwgbm9ucGFzc2l2ZWNhcHR1cmUsIG5vcHJvcGFnYXRpb259IGZyb20gXCIuL25vZXZlbnQuanNcIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IERyYWdFdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICFldmVudC5jdHJsS2V5ICYmICFldmVudC5idXR0b247XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGV2ZW50LCBkKSB7XG4gIHJldHVybiBkID09IG51bGwgPyB7eDogZXZlbnQueCwgeTogZXZlbnQueX0gOiBkO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsXG4gICAgICBjb250YWluZXIgPSBkZWZhdWx0Q29udGFpbmVyLFxuICAgICAgc3ViamVjdCA9IGRlZmF1bHRTdWJqZWN0LFxuICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSxcbiAgICAgIGdlc3R1cmVzID0ge30sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZHJhZ1wiLCBcImVuZFwiKSxcbiAgICAgIGFjdGl2ZSA9IDAsXG4gICAgICBtb3VzZWRvd254LFxuICAgICAgbW91c2Vkb3dueSxcbiAgICAgIG1vdXNlbW92aW5nLFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7XG5cbiAgZnVuY3Rpb24gZHJhZyhzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLm9uKFwibW91c2Vkb3duLmRyYWdcIiwgbW91c2Vkb3duZWQpXG4gICAgICAuZmlsdGVyKHRvdWNoYWJsZSlcbiAgICAgICAgLm9uKFwidG91Y2hzdGFydC5kcmFnXCIsIHRvdWNoc3RhcnRlZClcbiAgICAgICAgLm9uKFwidG91Y2htb3ZlLmRyYWdcIiwgdG91Y2htb3ZlZCwgbm9ucGFzc2l2ZSlcbiAgICAgICAgLm9uKFwidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnXCIsIHRvdWNoZW5kZWQpXG4gICAgICAgIC5zdHlsZShcInRvdWNoLWFjdGlvblwiLCBcIm5vbmVcIilcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGNvbnRhaW5lci5jYWxsKHRoaXMsIGV2ZW50LCBkKSwgZXZlbnQsIGQsIFwibW91c2VcIik7XG4gICAgaWYgKCFnZXN0dXJlKSByZXR1cm47XG4gICAgc2VsZWN0KGV2ZW50LnZpZXcpXG4gICAgICAub24oXCJtb3VzZW1vdmUuZHJhZ1wiLCBtb3VzZW1vdmVkLCBub25wYXNzaXZlY2FwdHVyZSlcbiAgICAgIC5vbihcIm1vdXNldXAuZHJhZ1wiLCBtb3VzZXVwcGVkLCBub25wYXNzaXZlY2FwdHVyZSk7XG4gICAgbm9kcmFnKGV2ZW50LnZpZXcpO1xuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIG1vdXNlbW92aW5nID0gZmFsc2U7XG4gICAgbW91c2Vkb3dueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgbW91c2Vkb3dueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgZ2VzdHVyZShcInN0YXJ0XCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICBub2V2ZW50KGV2ZW50KTtcbiAgICBpZiAoIW1vdXNlbW92aW5nKSB7XG4gICAgICB2YXIgZHggPSBldmVudC5jbGllbnRYIC0gbW91c2Vkb3dueCwgZHkgPSBldmVudC5jbGllbnRZIC0gbW91c2Vkb3dueTtcbiAgICAgIG1vdXNlbW92aW5nID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjtcbiAgICB9XG4gICAgZ2VzdHVyZXMubW91c2UoXCJkcmFnXCIsIGV2ZW50KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICBzZWxlY3QoZXZlbnQudmlldykub24oXCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWdcIiwgbnVsbCk7XG4gICAgeWVzZHJhZyhldmVudC52aWV3LCBtb3VzZW1vdmluZyk7XG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZ2VzdHVyZXMubW91c2UoXCJlbmRcIiwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCBkKSB7XG4gICAgaWYgKCFmaWx0ZXIuY2FsbCh0aGlzLCBldmVudCwgZCkpIHJldHVybjtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBjID0gY29udGFpbmVyLmNhbGwodGhpcywgZXZlbnQsIGQpLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRoaXMsIGMsIGV2ZW50LCBkLCB0b3VjaGVzW2ldLmlkZW50aWZpZXIsIHRvdWNoZXNbaV0pKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwic3RhcnRcIiwgZXZlbnQsIHRvdWNoZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNobW92ZWQoZXZlbnQpIHtcbiAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHtcbiAgICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICAgIGdlc3R1cmUoXCJkcmFnXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaGVuZGVkKGV2ZW50KSB7XG4gICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlO1xuXG4gICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpO1xuICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhXG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7XG4gICAgICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgICAgICBnZXN0dXJlKFwiZW5kXCIsIGV2ZW50LCB0b3VjaGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBiZWZvcmVzdGFydCh0aGF0LCBjb250YWluZXIsIGV2ZW50LCBkLCBpZGVudGlmaWVyLCB0b3VjaCkge1xuICAgIHZhciBkaXNwYXRjaCA9IGxpc3RlbmVycy5jb3B5KCksXG4gICAgICAgIHAgPSBwb2ludGVyKHRvdWNoIHx8IGV2ZW50LCBjb250YWluZXIpLCBkeCwgZHksXG4gICAgICAgIHM7XG5cbiAgICBpZiAoKHMgPSBzdWJqZWN0LmNhbGwodGhhdCwgbmV3IERyYWdFdmVudChcImJlZm9yZXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICB0YXJnZXQ6IGRyYWcsXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2ZSxcbiAgICAgICAgeDogcFswXSxcbiAgICAgICAgeTogcFsxXSxcbiAgICAgICAgZHg6IDAsXG4gICAgICAgIGR5OiAwLFxuICAgICAgICBkaXNwYXRjaFxuICAgICAgfSksIGQpKSA9PSBudWxsKSByZXR1cm47XG5cbiAgICBkeCA9IHMueCAtIHBbMF0gfHwgMDtcbiAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUsIGV2ZW50LCB0b3VjaCkge1xuICAgICAgdmFyIHAwID0gcCwgbjtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwic3RhcnRcIjogZ2VzdHVyZXNbaWRlbnRpZmllcl0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6IGRlbGV0ZSBnZXN0dXJlc1tpZGVudGlmaWVyXSwgLS1hY3RpdmU7IC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgY2FzZSBcImRyYWdcIjogcCA9IHBvaW50ZXIodG91Y2ggfHwgZXZlbnQsIGNvbnRhaW5lciksIG4gPSBhY3RpdmU7IGJyZWFrO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2guY2FsbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdGhhdCxcbiAgICAgICAgbmV3IERyYWdFdmVudCh0eXBlLCB7XG4gICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgIHN1YmplY3Q6IHMsXG4gICAgICAgICAgdGFyZ2V0OiBkcmFnLFxuICAgICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgICAgYWN0aXZlOiBuLFxuICAgICAgICAgIHg6IHBbMF0gKyBkeCxcbiAgICAgICAgICB5OiBwWzFdICsgZHksXG4gICAgICAgICAgZHg6IHBbMF0gLSBwMFswXSxcbiAgICAgICAgICBkeTogcFsxXSAtIHAwWzFdLFxuICAgICAgICAgIGRpc3BhdGNoXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCEhXyksIGRyYWcpIDogZmlsdGVyO1xuICB9O1xuXG4gIGRyYWcuY29udGFpbmVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRhaW5lciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoXyksIGRyYWcpIDogY29udGFpbmVyO1xuICB9O1xuXG4gIGRyYWcuc3ViamVjdCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudChfKSwgZHJhZykgOiBzdWJqZWN0O1xuICB9O1xuXG4gIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgZHJhZykgOiB0b3VjaGFibGU7XG4gIH07XG5cbiAgZHJhZy5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7XG4gIH07XG5cbiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCBkcmFnKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgcmV0dXJuIGRyYWc7XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCAiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2Mykge1xuICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7XG4gIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MFxuICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MVxuICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MlxuICAgICAgKyB0MyAqIHYzKSAvIDY7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlcykge1xuICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksXG4gICAgICAgIHYxID0gdmFsdWVzW2ldLFxuICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sXG4gICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsXG4gICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxO1xuICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTtcbiAgfTtcbn1cbiIsICJpbXBvcnQge2Jhc2lzfSBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSxcbiAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSxcbiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLFxuICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sXG4gICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTtcbiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7XG4gIH07XG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwgImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gIH07XG59XG4iLCAiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsICJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsICJpbXBvcnQgZGVjb21wb3NlLCB7aWRlbnRpdHl9IGZyb20gXCIuL2RlY29tcG9zZS5qc1wiO1xuXG52YXIgc3ZnTm9kZTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkge1xuICBjb25zdCBtID0gbmV3ICh0eXBlb2YgRE9NTWF0cml4ID09PSBcImZ1bmN0aW9uXCIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgXCJcIik7XG4gIHJldHVybiBtLmlzSWRlbnRpdHkgPyBpZGVudGl0eSA6IGRlY29tcG9zZShtLmEsIG0uYiwgbS5jLCBtLmQsIG0uZSwgbS5mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwiZ1wiKTtcbiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdmFsdWUpO1xuICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eTtcbiAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7XG4gIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7XG59XG4iLCAiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsICJ2YXIgZXBzaWxvbjIgPSAxZS0xMjtcblxuZnVuY3Rpb24gY29zaCh4KSB7XG4gIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyO1xufVxuXG5mdW5jdGlvbiBzaW5oKHgpIHtcbiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG59XG5cbmZ1bmN0aW9uIHRhbmgoeCkge1xuICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIHpvb21SaG8ocmhvLCByaG8yLCByaG80KSB7XG5cbiAgLy8gcDAgPSBbdXgwLCB1eTAsIHcwXVxuICAvLyBwMSA9IFt1eDEsIHV5MSwgdzFdXG4gIGZ1bmN0aW9uIHpvb20ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSxcbiAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLFxuICAgICAgICBkeCA9IHV4MSAtIHV4MCxcbiAgICAgICAgZHkgPSB1eTEgLSB1eTAsXG4gICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksXG4gICAgICAgIGksXG4gICAgICAgIFM7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIFx1MjI0NSB1MS5cbiAgICBpZiAoZDIgPCBlcHNpbG9uMikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB0ICogZHgsXG4gICAgICAgICAgdXkwICsgdCAqIGR5LFxuICAgICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhbCBjYXNlLlxuICAgIGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSxcbiAgICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSxcbiAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSxcbiAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksXG4gICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIHJobztcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHZhciBzID0gdCAqIFMsXG4gICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSxcbiAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEpICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB1eDAgKyB1ICogZHgsXG4gICAgICAgICAgdXkwICsgdSAqIGR5LFxuICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwICogcmhvIC8gTWF0aC5TUVJUMjtcblxuICAgIHJldHVybiBpO1xuICB9XG5cbiAgem9vbS5yaG8gPSBmdW5jdGlvbihfKSB7XG4gICAgdmFyIF8xID0gTWF0aC5tYXgoMWUtMywgK18pLCBfMiA9IF8xICogXzEsIF80ID0gXzIgKiBfMjtcbiAgICByZXR1cm4gem9vbVJobyhfMSwgXzIsIF80KTtcbiAgfTtcblxuICByZXR1cm4gem9vbTtcbn0pKE1hdGguU1FSVDIsIDIsIDQpO1xuIiwgInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZVx1MjAxOXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW5cdTIwMTl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCAiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsICJpbXBvcnQge2Rpc3BhdGNofSBmcm9tIFwiZDMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7dGltZXIsIHRpbWVvdXR9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZW1wdHlPbiA9IGRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJjYW5jZWxcIiwgXCJpbnRlcnJ1cHRcIik7XG52YXIgZW1wdHlUd2VlbiA9IFtdO1xuXG5leHBvcnQgdmFyIENSRUFURUQgPSAwO1xuZXhwb3J0IHZhciBTQ0hFRFVMRUQgPSAxO1xuZXhwb3J0IHZhciBTVEFSVElORyA9IDI7XG5leHBvcnQgdmFyIFNUQVJURUQgPSAzO1xuZXhwb3J0IHZhciBSVU5OSU5HID0gNDtcbmV4cG9ydCB2YXIgRU5ESU5HID0gNTtcbmV4cG9ydCB2YXIgRU5ERUQgPSA2O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTtcbiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47XG4gIGNyZWF0ZShub2RlLCBpZCwge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suXG4gICAgb246IGVtcHR5T24sXG4gICAgdHdlZW46IGVtcHR5VHdlZW4sXG4gICAgdGltZTogdGltaW5nLnRpbWUsXG4gICAgZGVsYXk6IHRpbWluZy5kZWxheSxcbiAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLFxuICAgIGVhc2U6IHRpbWluZy5lYXNlLFxuICAgIHRpbWVyOiBudWxsLFxuICAgIHN0YXRlOiBDUkVBVEVEXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBnZXQobm9kZSwgaWQpO1xuICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcihcInRyYW5zaXRpb24gbm90IGZvdW5kXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZShub2RlLCBpZCwgc2VsZikge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sXG4gICAgICB0d2VlbjtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC5cbiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shXG4gIHNjaGVkdWxlc1tpZF0gPSBzZWxmO1xuICBzZWxmLnRpbWVyID0gdGltZXIoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7XG4gICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuXG4gICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuXG4gICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkge1xuICAgIHZhciBpLCBqLCBuLCBvO1xuXG4gICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LlxuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7XG5cbiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgICBvID0gc2NoZWR1bGVzW2ldO1xuICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgLy8gV2hpbGUgdGhpcyBlbGVtZW50IGFscmVhZHkgaGFzIGEgc3RhcnRpbmcgdHJhbnNpdGlvbiBkdXJpbmcgdGhpcyBmcmFtZSxcbiAgICAgIC8vIGRlZmVyIHN0YXJ0aW5nIGFuIGludGVycnVwdGluZyB0cmFuc2l0aW9uIHVudGlsIHRoYXQgdHJhbnNpdGlvbiBoYXMgYVxuICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCFcbiAgICAgIGlmIChvLnN0YXRlID09PSBTVEFSVEVEKSByZXR1cm4gdGltZW91dChzdGFydCk7XG5cbiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS5cbiAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImludGVycnVwdFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLlxuICAgICAgZWxzZSBpZiAoK2kgPCBpZCkge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni5cbiAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIVxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiFcbiAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suXG4gICAgdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7XG4gICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HO1xuICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcbiAgICAgICAgdGljayhlbGFwc2VkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC5cbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLlxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORztcbiAgICBzZWxmLm9uLmNhbGwoXCJzdGFydFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkcpIHJldHVybjsgLy8gaW50ZXJydXB0ZWRcbiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLlxuICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkge1xuICAgICAgICB0d2VlblsrK2pdID0gbztcbiAgICAgIH1cbiAgICB9XG4gICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7XG4gIH1cblxuICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHtcbiAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpO1xuICAgIH1cblxuICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykge1xuICAgICAgc2VsZi5vbi5jYWxsKFwiZW5kXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgICAgc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgc2VsZi5zdGF0ZSA9IEVOREVEO1xuICAgIHNlbGYudGltZXIuc3RvcCgpO1xuICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdO1xuICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCAiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwgImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZVx1MjAxOXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTtcbiAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0d2VlbjAsIHR3ZWVuMTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpO1xuICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xW2ldID0gdDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICBuYW1lICs9IFwiXCI7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDtcblxuICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTtcbiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07XG4gIH07XG59XG4iLCAiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCAiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsICJpbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJhdHRyLlwiICsgbmFtZTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsICJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkpXG4gICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmVhc2U7XG59XG4iLCAiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCAiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG4gIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHtcbiAgICAgICAgbWVyZ2VbaV0gPSBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBqIDwgbTA7ICsraikge1xuICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCAiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwgImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsICJpbXBvcnQge3NlbGVjdG9yfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZCA9IHRoaXMuX2lkO1xuXG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwgImltcG9ydCB7aW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgYXMgaW50ZXJwb2xhdGVUcmFuc2Zvcm19IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuaW1wb3J0IHtzdHlsZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgc3RyaW5nMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKSxcbiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksXG4gICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZSh0aGlzLCBuYW1lKSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7XG4gIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSBcInN0eWxlLlwiICsgbmFtZSwgZXZlbnQgPSBcImVuZC5cIiArIGtleSwgcmVtb3ZlO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbixcbiAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlKG5hbWUpKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2VcdTIwMTlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCB8fCBsaXN0ZW5lcjAgIT09IGxpc3RlbmVyKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKGV2ZW50LCBsaXN0ZW5lcjAgPSBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBpID0gKG5hbWUgKz0gXCJcIikgPT09IFwidHJhbnNmb3JtXCIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybSA6IGludGVycG9sYXRlO1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUpKVxuICAgIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlKSkpXG4gICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlKHRoaXMuX2lkLCBuYW1lKSlcbiAgICA6IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSlcbiAgICAgIC5vbihcImVuZC5zdHlsZS5cIiArIG5hbWUsIG51bGwpO1xufVxuIiwgImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsICJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCAiZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUoaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcInRleHRcIjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpO1xufVxuIiwgImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwgImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdlXHUyMDE5cmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwgImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHJUd2VlbiBmcm9tIFwiLi9hdHRyVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2RlbGF5IGZyb20gXCIuL2RlbGF5LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kdXJhdGlvbiBmcm9tIFwiLi9kdXJhdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZSBmcm9tIFwiLi9lYXNlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlVmFyeWluZyBmcm9tIFwiLi9lYXNlVmFyeWluZy5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZmlsdGVyIGZyb20gXCIuL2ZpbHRlci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3QgZnJvbSBcIi4vc2VsZWN0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zZWxlY3Rpb24gZnJvbSBcIi4vc2VsZWN0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZSBmcm9tIFwiLi9zdHlsZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGVUd2VlbiBmcm9tIFwiLi9zdHlsZVR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHRUd2VlbiBmcm9tIFwiLi90ZXh0VHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHdlZW4gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2VuZCBmcm9tIFwiLi9lbmQuanNcIjtcblxudmFyIGlkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xuICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgdGhpcy5faWQgPSBpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBzZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3SWQoKSB7XG4gIHJldHVybiArK2lkO1xufVxuXG52YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGU7XG5cblRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2l0aW9uLFxuICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LFxuICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sXG4gIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsXG4gIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLFxuICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sXG4gIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsXG4gIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSxcbiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLFxuICBvbjogdHJhbnNpdGlvbl9vbixcbiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLFxuICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLFxuICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSxcbiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLFxuICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsXG4gIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sXG4gIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsXG4gIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLFxuICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSxcbiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sXG4gIGVhc2U6IHRyYW5zaXRpb25fZWFzZSxcbiAgZWFzZVZhcnlpbmc6IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcsXG4gIGVuZDogdHJhbnNpdGlvbl9lbmQsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25fcHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl1cbn07XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCAiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCAiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCBzZWxlY3Rpb25faW50ZXJydXB0IGZyb20gXCIuL2ludGVycnVwdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcblxuc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0O1xuc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247XG4iLCAiZXhwb3J0IGRlZmF1bHQgeCA9PiAoKSA9PiB4O1xuIiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFpvb21FdmVudCh0eXBlLCB7XG4gIHNvdXJjZUV2ZW50LFxuICB0YXJnZXQsXG4gIHRyYW5zZm9ybSxcbiAgZGlzcGF0Y2hcbn0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgIHR5cGU6IHt2YWx1ZTogdHlwZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICBzb3VyY2VFdmVudDoge3ZhbHVlOiBzb3VyY2VFdmVudCwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlfSxcbiAgICB0YXJnZXQ6IHt2YWx1ZTogdGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9LFxuICAgIHRyYW5zZm9ybToge3ZhbHVlOiB0cmFuc2Zvcm0sIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG4gICAgXzoge3ZhbHVlOiBkaXNwYXRjaH1cbiAgfSk7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24oZXZlbnQpIHtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xufVxuIiwgImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHtkcmFnRGlzYWJsZSwgZHJhZ0VuYWJsZX0gZnJvbSBcImQzLWRyYWdcIjtcbmltcG9ydCB7aW50ZXJwb2xhdGVab29tfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c2VsZWN0LCBwb2ludGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge2ludGVycnVwdH0gZnJvbSBcImQzLXRyYW5zaXRpb25cIjtcbmltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuaW1wb3J0IFpvb21FdmVudCBmcm9tIFwiLi9ldmVudC5qc1wiO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIGlkZW50aXR5fSBmcm9tIFwiLi90cmFuc2Zvcm0uanNcIjtcbmltcG9ydCBub2V2ZW50LCB7bm9wcm9wYWdhdGlvbn0gZnJvbSBcIi4vbm9ldmVudC5qc1wiO1xuXG4vLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS5cbi8vIGV4Y2VwdCBmb3IgcGluY2gtdG8tem9vbSwgd2hpY2ggaXMgc2VudCBhcyBhIHdoZWVsK2N0cmxLZXkgZXZlbnRcbmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoZXZlbnQpIHtcbiAgcmV0dXJuICghZXZlbnQuY3RybEtleSB8fCBldmVudC50eXBlID09PSAnd2hlZWwnKSAmJiAhZXZlbnQuYnV0dG9uO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkge1xuICB2YXIgZSA9IHRoaXM7XG4gIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIGUgPSBlLm93bmVyU1ZHRWxlbWVudCB8fCBlO1xuICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikpIHtcbiAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDtcbiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07XG4gICAgfVxuICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07XG4gIH1cbiAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VHJhbnNmb3JtKCkge1xuICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKGV2ZW50KSB7XG4gIHJldHVybiAtZXZlbnQuZGVsdGFZICogKGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDAuMDUgOiBldmVudC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpICogKGV2ZW50LmN0cmxLZXkgPyAxMCA6IDEpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkge1xuICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IChcIm9udG91Y2hzdGFydFwiIGluIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluKHRyYW5zZm9ybSwgZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpIHtcbiAgdmFyIGR4MCA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFswXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMF1bMF0sXG4gICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLFxuICAgICAgZHkwID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzBdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVsxXSxcbiAgICAgIGR5MSA9IHRyYW5zZm9ybS5pbnZlcnRZKGV4dGVudFsxXVsxXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMV07XG4gIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKFxuICAgIGR4MSA+IGR4MCA/IChkeDAgKyBkeDEpIC8gMiA6IE1hdGgubWluKDAsIGR4MCkgfHwgTWF0aC5tYXgoMCwgZHgxKSxcbiAgICBkeTEgPiBkeTAgPyAoZHkwICsgZHkxKSAvIDIgOiBNYXRoLm1pbigwLCBkeTApIHx8IE1hdGgubWF4KDAsIGR5MSlcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyLFxuICAgICAgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCxcbiAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sXG4gICAgICB3aGVlbERlbHRhID0gZGVmYXVsdFdoZWVsRGVsdGEsXG4gICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLFxuICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLFxuICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSxcbiAgICAgIGR1cmF0aW9uID0gMjUwLFxuICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sXG4gICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiem9vbVwiLCBcImVuZFwiKSxcbiAgICAgIHRvdWNoc3RhcnRpbmcsXG4gICAgICB0b3VjaGZpcnN0LFxuICAgICAgdG91Y2hlbmRpbmcsXG4gICAgICB0b3VjaERlbGF5ID0gNTAwLFxuICAgICAgd2hlZWxEZWxheSA9IDE1MCxcbiAgICAgIGNsaWNrRGlzdGFuY2UyID0gMCxcbiAgICAgIHRhcERpc3RhbmNlID0gMTA7XG5cbiAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb25cbiAgICAgICAgLnByb3BlcnR5KFwiX196b29tXCIsIGRlZmF1bHRUcmFuc2Zvcm0pXG4gICAgICAgIC5vbihcIndoZWVsLnpvb21cIiwgd2hlZWxlZCwge3Bhc3NpdmU6IGZhbHNlfSlcbiAgICAgICAgLm9uKFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vkb3duZWQpXG4gICAgICAgIC5vbihcImRibGNsaWNrLnpvb21cIiwgZGJsY2xpY2tlZClcbiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKVxuICAgICAgICAub24oXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2hzdGFydGVkKVxuICAgICAgICAub24oXCJ0b3VjaG1vdmUuem9vbVwiLCB0b3VjaG1vdmVkKVxuICAgICAgICAub24oXCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb21cIiwgdG91Y2hlbmRlZClcbiAgICAgICAgLnN0eWxlKFwiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yXCIsIFwicmdiYSgwLDAsMCwwKVwiKTtcbiAgfVxuXG4gIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB2YXIgc2VsZWN0aW9uID0gY29sbGVjdGlvbi5zZWxlY3Rpb24gPyBjb2xsZWN0aW9uLnNlbGVjdGlvbigpIDogY29sbGVjdGlvbjtcbiAgICBzZWxlY3Rpb24ucHJvcGVydHkoXCJfX3pvb21cIiwgZGVmYXVsdFRyYW5zZm9ybSk7XG4gICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikge1xuICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgICAgLmV2ZW50KGV2ZW50KVxuICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gXCJmdW5jdGlvblwiID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pXG4gICAgICAgICAgLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHpvb20uc2NhbGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCwgZXZlbnQpIHtcbiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssXG4gICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gXCJmdW5jdGlvblwiID8gay5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogaztcbiAgICAgIHJldHVybiBrMCAqIGsxO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHAsIGV2ZW50KSB7XG4gICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlID0gZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgdDAgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09IFwiZnVuY3Rpb25cIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHAsXG4gICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09IFwiZnVuY3Rpb25cIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpO1xuICAgIH0sIHAsIGV2ZW50KTtcbiAgfTtcblxuICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCB4LCB5LCBldmVudCkge1xuICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsXG4gICAgICAgIHR5cGVvZiB5ID09PSBcImZ1bmN0aW9uXCIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5XG4gICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBudWxsLCBldmVudCk7XG4gIH07XG5cbiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCwgZXZlbnQpIHtcbiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSxcbiAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sXG4gICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSBcImZ1bmN0aW9uXCIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwO1xuICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZShcbiAgICAgICAgdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCxcbiAgICAgICAgdHlwZW9mIHkgPT09IFwiZnVuY3Rpb25cIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteVxuICAgICAgKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTtcbiAgICB9LCBwLCBldmVudCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7XG4gICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpO1xuICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0oaywgdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh0cmFuc2Zvcm0sIHAwLCBwMSkge1xuICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAqIHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rO1xuICAgIHJldHVybiB4ID09PSB0cmFuc2Zvcm0ueCAmJiB5ID09PSB0cmFuc2Zvcm0ueSA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0odHJhbnNmb3JtLmssIHgsIHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7XG4gICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdO1xuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGUodHJhbnNpdGlvbiwgdHJhbnNmb3JtLCBwb2ludCwgZXZlbnQpIHtcbiAgICB0cmFuc2l0aW9uXG4gICAgICAgIC5vbihcInN0YXJ0Lnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuc3RhcnQoKTsgfSlcbiAgICAgICAgLm9uKFwiaW50ZXJydXB0Lnpvb20gZW5kLnpvb21cIiwgZnVuY3Rpb24oKSB7IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKS5ldmVudChldmVudCkuZW5kKCk7IH0pXG4gICAgICAgIC50d2VlbihcInpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0LCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgICAgICAgIGUgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyksXG4gICAgICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IHBvaW50LmFwcGx5KHRoYXQsIGFyZ3MpIDogcG9pbnQsXG4gICAgICAgICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0pLFxuICAgICAgICAgICAgICBhID0gdGhhdC5fX3pvb20sXG4gICAgICAgICAgICAgIGIgPSB0eXBlb2YgdHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLlxuICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH1cbiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncywgY2xlYW4pIHtcbiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhhdCwgYXJncyk7XG4gIH1cblxuICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHtcbiAgICB0aGlzLnRoYXQgPSB0aGF0O1xuICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgdGhpcy5hY3RpdmUgPSAwO1xuICAgIHRoaXMuc291cmNlRXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgIHRoaXMudGFwcyA9IDA7XG4gIH1cblxuICBHZXN0dXJlLnByb3RvdHlwZSA9IHtcbiAgICBldmVudDogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCkgdGhpcy5zb3VyY2VFdmVudCA9IGV2ZW50O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkge1xuICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0KFwic3RhcnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7XG4gICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09IFwibW91c2VcIikgdGhpcy5tb3VzZVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDAgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7XG4gICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSBcInRvdWNoXCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7XG4gICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtO1xuICAgICAgdGhpcy5lbWl0KFwiem9vbVwiKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICgtLXRoaXMuYWN0aXZlID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nO1xuICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHZhciBkID0gc2VsZWN0KHRoaXMudGhhdCkuZGF0dW0oKTtcbiAgICAgIGxpc3RlbmVycy5jYWxsKFxuICAgICAgICB0eXBlLFxuICAgICAgICB0aGlzLnRoYXQsXG4gICAgICAgIG5ldyBab29tRXZlbnQodHlwZSwge1xuICAgICAgICAgIHNvdXJjZUV2ZW50OiB0aGlzLnNvdXJjZUV2ZW50LFxuICAgICAgICAgIHRhcmdldDogem9vbSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHRyYW5zZm9ybTogdGhpcy50aGF0Ll9fem9vbSxcbiAgICAgICAgICBkaXNwYXRjaDogbGlzdGVuZXJzXG4gICAgICAgIH0pLFxuICAgICAgICBkXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiB3aGVlbGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHQgPSB0aGlzLl9fem9vbSxcbiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgdC5rICogTWF0aC5wb3coMiwgd2hlZWxEZWx0YS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkpLFxuICAgICAgICBwID0gcG9pbnRlcihldmVudCk7XG5cbiAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuXG4gICAgaWYgKGcud2hlZWwpIHtcbiAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHtcbiAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvblx1MjAxOXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC5cbiAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjtcblxuICAgIC8vIE90aGVyd2lzZSwgY2FwdHVyZSB0aGUgbW91c2UgcG9pbnQgYW5kIGxvY2F0aW9uIGF0IHRoZSBzdGFydC5cbiAgICBlbHNlIHtcbiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldO1xuICAgICAgaW50ZXJydXB0KHRoaXMpO1xuICAgICAgZy5zdGFydCgpO1xuICAgIH1cblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpO1xuICAgIGcuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7XG5cbiAgICBmdW5jdGlvbiB3aGVlbGlkbGVkKCkge1xuICAgICAgZy53aGVlbCA9IG51bGw7XG4gICAgICBnLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdXNlZG93bmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJncywgdHJ1ZSkuZXZlbnQoZXZlbnQpLFxuICAgICAgICB2ID0gc2VsZWN0KGV2ZW50LnZpZXcpLm9uKFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oXCJtb3VzZXVwLnpvb21cIiwgbW91c2V1cHBlZCwgdHJ1ZSksXG4gICAgICAgIHAgPSBwb2ludGVyKGV2ZW50LCBjdXJyZW50VGFyZ2V0KSxcbiAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLFxuICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTtcbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBnLm1vdXNlID0gW3AsIHRoaXMuX196b29tLmludmVydChwKV07XG4gICAgaW50ZXJydXB0KHRoaXMpO1xuICAgIGcuc3RhcnQoKTtcblxuICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoZXZlbnQpIHtcbiAgICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgICAgaWYgKCFnLm1vdmVkKSB7XG4gICAgICAgIHZhciBkeCA9IGV2ZW50LmNsaWVudFggLSB4MCwgZHkgPSBldmVudC5jbGllbnRZIC0geTA7XG4gICAgICAgIGcubW92ZWQgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyO1xuICAgICAgfVxuICAgICAgZy5ldmVudChldmVudClcbiAgICAgICAuem9vbShcIm1vdXNlXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IHBvaW50ZXIoZXZlbnQsIGN1cnJlbnRUYXJnZXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoZXZlbnQpIHtcbiAgICAgIHYub24oXCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb21cIiwgbnVsbCk7XG4gICAgICBkcmFnRW5hYmxlKGV2ZW50LnZpZXcsIGcubW92ZWQpO1xuICAgICAgbm9ldmVudChldmVudCk7XG4gICAgICBnLmV2ZW50KGV2ZW50KS5lbmQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkYmxjbGlja2VkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0MCA9IHRoaXMuX196b29tLFxuICAgICAgICBwMCA9IHBvaW50ZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXMgPyBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50LCB0aGlzKSxcbiAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLFxuICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSxcbiAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmdzKSwgdHJhbnNsYXRlRXh0ZW50KTtcblxuICAgIG5vZXZlbnQoZXZlbnQpO1xuICAgIGlmIChkdXJhdGlvbiA+IDApIHNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pLmNhbGwoc2NoZWR1bGUsIHQxLCBwMCwgZXZlbnQpO1xuICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxLCBwMCwgZXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuO1xuICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLFxuICAgICAgICBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgc3RhcnRlZCwgaSwgdCwgcDtcblxuICAgIG5vcHJvcGFnYXRpb24oZXZlbnQpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gcG9pbnRlcih0LCB0aGlzKTtcbiAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdO1xuICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZSwgZy50YXBzID0gMSArICEhdG91Y2hzdGFydGluZztcbiAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBnLnRhcHMgPSAwO1xuICAgIH1cblxuICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpO1xuXG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGlmIChnLnRhcHMgPCAyKSB0b3VjaGZpcnN0ID0gcFswXSwgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTtcbiAgICAgIGludGVycnVwdCh0aGlzKTtcbiAgICAgIGcuc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0b3VjaG1vdmVkKGV2ZW50LCAuLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLl9fem9vbWluZykgcmV0dXJuO1xuICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmdzKS5ldmVudChldmVudCksXG4gICAgICAgIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwLCBsO1xuXG4gICAgbm9ldmVudChldmVudCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSBwb2ludGVyKHQsIHRoaXMpO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDtcbiAgICB9XG4gICAgdCA9IGcudGhhdC5fX3pvb207XG4gICAgaWYgKGcudG91Y2gxKSB7XG4gICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSxcbiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLFxuICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsXG4gICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDtcbiAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpO1xuICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTtcbiAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07XG4gICAgfVxuICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTtcbiAgICBlbHNlIHJldHVybjtcblxuICAgIGcuem9vbShcInRvdWNoXCIsIGNvbnN0cmFpbih0cmFuc2xhdGUodCwgcCwgbCksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kZWQoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47XG4gICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3MpLmV2ZW50KGV2ZW50KSxcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7XG5cbiAgICBub3Byb3BhZ2F0aW9uKGV2ZW50KTtcbiAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7XG4gICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIHQgPSB0b3VjaGVzW2ldO1xuICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMDtcbiAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRlbGV0ZSBnLnRvdWNoMTtcbiAgICB9XG4gICAgaWYgKGcudG91Y2gxICYmICFnLnRvdWNoMCkgZy50b3VjaDAgPSBnLnRvdWNoMSwgZGVsZXRlIGcudG91Y2gxO1xuICAgIGlmIChnLnRvdWNoMCkgZy50b3VjaDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pO1xuICAgIGVsc2Uge1xuICAgICAgZy5lbmQoKTtcbiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAob3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci5cbiAgICAgIGlmIChnLnRhcHMgPT09IDIpIHtcbiAgICAgICAgdCA9IHBvaW50ZXIodCwgdGhpcyk7XG4gICAgICAgIGlmIChNYXRoLmh5cG90KHRvdWNoZmlyc3RbMF0gLSB0WzBdLCB0b3VjaGZpcnN0WzFdIC0gdFsxXSkgPCB0YXBEaXN0YW5jZSkge1xuICAgICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKFwiZGJsY2xpY2suem9vbVwiKTtcbiAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KCtfKSwgem9vbSkgOiB3aGVlbERlbHRhO1xuICB9O1xuXG4gIHpvb20uZmlsdGVyID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogY29uc3RhbnQoISFfKSwgem9vbSkgOiBmaWx0ZXI7XG4gIH07XG5cbiAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IF8gOiBjb25zdGFudCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTtcbiAgfTtcblxuICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IGNvbnN0YW50KFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7XG4gIH07XG5cbiAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZUV4dGVudFswXSA9ICtfWzBdLCBzY2FsZUV4dGVudFsxXSA9ICtfWzFdLCB6b29tKSA6IFtzY2FsZUV4dGVudFswXSwgc2NhbGVFeHRlbnRbMV1dO1xuICB9O1xuXG4gIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTtcbiAgfTtcblxuICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjtcbiAgfTtcblxuICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR1cmF0aW9uID0gK18sIHpvb20pIDogZHVyYXRpb247XG4gIH07XG5cbiAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7XG4gIH07XG5cbiAgem9vbS5vbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7XG4gIH07XG5cbiAgem9vbS5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7XG4gIH07XG5cbiAgem9vbS50YXBEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXBEaXN0YW5jZSA9ICtfLCB6b29tKSA6IHRhcERpc3RhbmNlO1xuICB9O1xuXG4gIHJldHVybiB6b29tO1xufVxuIiwgImltcG9ydCBSZWFjdCwgeyBtZW1vLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNjIGZyb20gJ2NsYXNzY2F0JztcbmltcG9ydCB7IHNoYWxsb3cgfSBmcm9tICd6dXN0YW5kL3NoYWxsb3cnO1xuaW1wb3J0IHsgdXNlU3RvcmVBcGksIHVzZVN0b3JlLCB1c2VSZWFjdEZsb3csIFBhbmVsIH0gZnJvbSAnQHJlYWN0Zmxvdy9jb3JlJztcblxuZnVuY3Rpb24gUGx1c0ljb24oKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMzIgMzJcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTMyIDE4LjEzM0gxOC4xMzNWMzJoLTQuMjY2VjE4LjEzM0gwdi00LjI2NmgxMy44NjdWMGg0LjI2NnYxMy44NjdIMzJ6XCIgfSkpKTtcbn1cblxuZnVuY3Rpb24gTWludXNJY29uKCkge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDMyIDVcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTAgMGgzMnY0LjJIMHpcIiB9KSkpO1xufVxuXG5mdW5jdGlvbiBGaXRWaWV3SWNvbigpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAzMiAzMFwiIH0sXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNMy42OTIgNC42M2MwLS41My40LS45MzguOTM5LS45MzhoNS4yMTVWMEg0LjcwOEMyLjEzIDAgMCAyLjA1NCAwIDQuNjN2NS4yMTZoMy42OTJWNC42MzF6TTI3LjM1NCAwaC01LjJ2My42OTJoNS4xN2MuNTMgMCAuOTg0LjQuOTg0LjkzOXY1LjIxNUgzMlY0LjYzMUE0LjYyNCA0LjYyNCAwIDAwMjcuMzU0IDB6bS45NTQgMjQuODNjMCAuNTMyLS40Ljk0LS45MzkuOTRoLTUuMjE1djMuNzY4aDUuMjE1YzIuNTc3IDAgNC42MzEtMi4xMyA0LjYzMS00LjcwN3YtNS4xMzloLTMuNjkydjUuMTM5em0tMjMuNjc3Ljk0Yy0uNTMxIDAtLjkzOS0uNC0uOTM5LS45NHYtNS4xMzhIMHY1LjEzOWMwIDIuNTc3IDIuMTMgNC43MDcgNC43MDggNC43MDdoNS4xMzhWMjUuNzdINC42MzF6XCIgfSkpKTtcbn1cblxuZnVuY3Rpb24gTG9ja0ljb24oKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMjUgMzJcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTIxLjMzMyAxMC42NjdIMTkuODFWNy42MTlDMTkuODEgMy40MjkgMTYuMzggMCAxMi4xOSAwIDggMCA0LjU3MSAzLjQyOSA0LjU3MSA3LjYxOXYzLjA0OEgzLjA0OEEzLjA1NiAzLjA1NiAwIDAwMCAxMy43MTR2MTUuMjM4QTMuMDU2IDMuMDU2IDAgMDAzLjA0OCAzMmgxOC4yODVhMy4wNTYgMy4wNTYgMCAwMDMuMDQ4LTMuMDQ4VjEzLjcxNGEzLjA1NiAzLjA1NiAwIDAwLTMuMDQ4LTMuMDQ3ek0xMi4xOSAyNC41MzNhMy4wNTYgMy4wNTYgMCAwMS0zLjA0Ny0zLjA0NyAzLjA1NiAzLjA1NiAwIDAxMy4wNDctMy4wNDggMy4wNTYgMy4wNTYgMCAwMTMuMDQ4IDMuMDQ4IDMuMDU2IDMuMDU2IDAgMDEtMy4wNDggMy4wNDd6bTQuNzI0LTEzLjg2Nkg3LjQ2N1Y3LjYxOWMwLTIuNTkgMi4xMzMtNC43MjQgNC43MjMtNC43MjQgMi41OTEgMCA0LjcyNCAyLjEzMyA0LjcyNCA0LjcyNHYzLjA0OHpcIiB9KSkpO1xufVxuXG5mdW5jdGlvbiBVbmxvY2tJY29uKCkge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDI1IDMyXCIgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk0yMS4zMzMgMTAuNjY3SDE5LjgxVjcuNjE5QzE5LjgxIDMuNDI5IDE2LjM4IDAgMTIuMTkgMGMtNC4xMTQgMS44MjgtMS4zNyAyLjEzMy4zMDUgMi40MzggMS42NzYuMzA1IDQuNDIgMi41OSA0LjQyIDUuMTgxdjMuMDQ4SDMuMDQ3QTMuMDU2IDMuMDU2IDAgMDAwIDEzLjcxNHYxNS4yMzhBMy4wNTYgMy4wNTYgMCAwMDMuMDQ4IDMyaDE4LjI4NWEzLjA1NiAzLjA1NiAwIDAwMy4wNDgtMy4wNDhWMTMuNzE0YTMuMDU2IDMuMDU2IDAgMDAtMy4wNDgtMy4wNDd6TTEyLjE5IDI0LjUzM2EzLjA1NiAzLjA1NiAwIDAxLTMuMDQ3LTMuMDQ3IDMuMDU2IDMuMDU2IDAgMDEzLjA0Ny0zLjA0OCAzLjA1NiAzLjA1NiAwIDAxMy4wNDggMy4wNDggMy4wNTYgMy4wNTYgMCAwMS0zLjA0OCAzLjA0N3pcIiB9KSkpO1xufVxuXG5jb25zdCBDb250cm9sQnV0dG9uID0gKHsgY2hpbGRyZW4sIGNsYXNzTmFtZSwgLi4ucmVzdCB9KSA9PiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7IHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogY2MoWydyZWFjdC1mbG93X19jb250cm9scy1idXR0b24nLCBjbGFzc05hbWVdKSwgLi4ucmVzdCB9LCBjaGlsZHJlbikpO1xuQ29udHJvbEJ1dHRvbi5kaXNwbGF5TmFtZSA9ICdDb250cm9sQnV0dG9uJztcblxuY29uc3Qgc2VsZWN0b3IgPSAocykgPT4gKHtcbiAgICBpc0ludGVyYWN0aXZlOiBzLm5vZGVzRHJhZ2dhYmxlIHx8IHMubm9kZXNDb25uZWN0YWJsZSB8fCBzLmVsZW1lbnRzU2VsZWN0YWJsZSxcbiAgICBtaW5ab29tUmVhY2hlZDogcy50cmFuc2Zvcm1bMl0gPD0gcy5taW5ab29tLFxuICAgIG1heFpvb21SZWFjaGVkOiBzLnRyYW5zZm9ybVsyXSA+PSBzLm1heFpvb20sXG59KTtcbmNvbnN0IENvbnRyb2xzID0gKHsgc3R5bGUsIHNob3dab29tID0gdHJ1ZSwgc2hvd0ZpdFZpZXcgPSB0cnVlLCBzaG93SW50ZXJhY3RpdmUgPSB0cnVlLCBmaXRWaWV3T3B0aW9ucywgb25ab29tSW4sIG9uWm9vbU91dCwgb25GaXRWaWV3LCBvbkludGVyYWN0aXZlQ2hhbmdlLCBjbGFzc05hbWUsIGNoaWxkcmVuLCBwb3NpdGlvbiA9ICdib3R0b20tbGVmdCcsIH0pID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHVzZVN0b3JlQXBpKCk7XG4gICAgY29uc3QgW2lzVmlzaWJsZSwgc2V0SXNWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCB7IGlzSW50ZXJhY3RpdmUsIG1pblpvb21SZWFjaGVkLCBtYXhab29tUmVhY2hlZCB9ID0gdXNlU3RvcmUoc2VsZWN0b3IsIHNoYWxsb3cpO1xuICAgIGNvbnN0IHsgem9vbUluLCB6b29tT3V0LCBmaXRWaWV3IH0gPSB1c2VSZWFjdEZsb3coKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBzZXRJc1Zpc2libGUodHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIGlmICghaXNWaXNpYmxlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBvblpvb21JbkhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHpvb21JbigpO1xuICAgICAgICBvblpvb21Jbj8uKCk7XG4gICAgfTtcbiAgICBjb25zdCBvblpvb21PdXRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB6b29tT3V0KCk7XG4gICAgICAgIG9uWm9vbU91dD8uKCk7XG4gICAgfTtcbiAgICBjb25zdCBvbkZpdFZpZXdIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBmaXRWaWV3KGZpdFZpZXdPcHRpb25zKTtcbiAgICAgICAgb25GaXRWaWV3Py4oKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uVG9nZ2xlSW50ZXJhY3Rpdml0eSA9ICgpID0+IHtcbiAgICAgICAgc3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbm9kZXNEcmFnZ2FibGU6ICFpc0ludGVyYWN0aXZlLFxuICAgICAgICAgICAgbm9kZXNDb25uZWN0YWJsZTogIWlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBlbGVtZW50c1NlbGVjdGFibGU6ICFpc0ludGVyYWN0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgb25JbnRlcmFjdGl2ZUNoYW5nZT8uKCFpc0ludGVyYWN0aXZlKTtcbiAgICB9O1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChQYW5lbCwgeyBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fY29udHJvbHMnLCBjbGFzc05hbWVdKSwgcG9zaXRpb246IHBvc2l0aW9uLCBzdHlsZTogc3R5bGUsIFwiZGF0YS10ZXN0aWRcIjogXCJyZl9fY29udHJvbHNcIiB9LFxuICAgICAgICBzaG93Wm9vbSAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbEJ1dHRvbiwgeyBvbkNsaWNrOiBvblpvb21JbkhhbmRsZXIsIGNsYXNzTmFtZTogXCJyZWFjdC1mbG93X19jb250cm9scy16b29taW5cIiwgdGl0bGU6IFwiem9vbSBpblwiLCBcImFyaWEtbGFiZWxcIjogXCJ6b29tIGluXCIsIGRpc2FibGVkOiBtYXhab29tUmVhY2hlZCB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUGx1c0ljb24sIG51bGwpKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udHJvbEJ1dHRvbiwgeyBvbkNsaWNrOiBvblpvb21PdXRIYW5kbGVyLCBjbGFzc05hbWU6IFwicmVhY3QtZmxvd19fY29udHJvbHMtem9vbW91dFwiLCB0aXRsZTogXCJ6b29tIG91dFwiLCBcImFyaWEtbGFiZWxcIjogXCJ6b29tIG91dFwiLCBkaXNhYmxlZDogbWluWm9vbVJlYWNoZWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KE1pbnVzSWNvbiwgbnVsbCkpKSksXG4gICAgICAgIHNob3dGaXRWaWV3ICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xCdXR0b24sIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2NvbnRyb2xzLWZpdHZpZXdcIiwgb25DbGljazogb25GaXRWaWV3SGFuZGxlciwgdGl0bGU6IFwiZml0IHZpZXdcIiwgXCJhcmlhLWxhYmVsXCI6IFwiZml0IHZpZXdcIiB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChGaXRWaWV3SWNvbiwgbnVsbCkpKSxcbiAgICAgICAgc2hvd0ludGVyYWN0aXZlICYmIChSZWFjdC5jcmVhdGVFbGVtZW50KENvbnRyb2xCdXR0b24sIHsgY2xhc3NOYW1lOiBcInJlYWN0LWZsb3dfX2NvbnRyb2xzLWludGVyYWN0aXZlXCIsIG9uQ2xpY2s6IG9uVG9nZ2xlSW50ZXJhY3Rpdml0eSwgdGl0bGU6IFwidG9nZ2xlIGludGVyYWN0aXZpdHlcIiwgXCJhcmlhLWxhYmVsXCI6IFwidG9nZ2xlIGludGVyYWN0aXZpdHlcIiB9LCBpc0ludGVyYWN0aXZlID8gUmVhY3QuY3JlYXRlRWxlbWVudChVbmxvY2tJY29uLCBudWxsKSA6IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9ja0ljb24sIG51bGwpKSksXG4gICAgICAgIGNoaWxkcmVuKSk7XG59O1xuQ29udHJvbHMuZGlzcGxheU5hbWUgPSAnQ29udHJvbHMnO1xudmFyIENvbnRyb2xzJDEgPSBtZW1vKENvbnRyb2xzKTtcblxuZXhwb3J0IHsgQ29udHJvbEJ1dHRvbiwgQ29udHJvbHMkMSBhcyBDb250cm9scyB9O1xuIiwgImltcG9ydCBSZWFjdCwgeyBtZW1vLCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2MgZnJvbSAnY2xhc3NjYXQnO1xuaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICdAcmVhY3RmbG93L2NvcmUnO1xuaW1wb3J0IHsgc2hhbGxvdyB9IGZyb20gJ3p1c3RhbmQvc2hhbGxvdyc7XG5cbnZhciBCYWNrZ3JvdW5kVmFyaWFudDtcbihmdW5jdGlvbiAoQmFja2dyb3VuZFZhcmlhbnQpIHtcbiAgICBCYWNrZ3JvdW5kVmFyaWFudFtcIkxpbmVzXCJdID0gXCJsaW5lc1wiO1xuICAgIEJhY2tncm91bmRWYXJpYW50W1wiRG90c1wiXSA9IFwiZG90c1wiO1xuICAgIEJhY2tncm91bmRWYXJpYW50W1wiQ3Jvc3NcIl0gPSBcImNyb3NzXCI7XG59KShCYWNrZ3JvdW5kVmFyaWFudCB8fCAoQmFja2dyb3VuZFZhcmlhbnQgPSB7fSkpO1xuXG5mdW5jdGlvbiBMaW5lUGF0dGVybih7IGNvbG9yLCBkaW1lbnNpb25zLCBsaW5lV2lkdGggfSkge1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBzdHJva2U6IGNvbG9yLCBzdHJva2VXaWR0aDogbGluZVdpZHRoLCBkOiBgTSR7ZGltZW5zaW9uc1swXSAvIDJ9IDAgViR7ZGltZW5zaW9uc1sxXX0gTTAgJHtkaW1lbnNpb25zWzFdIC8gMn0gSCR7ZGltZW5zaW9uc1swXX1gIH0pKTtcbn1cbmZ1bmN0aW9uIERvdFBhdHRlcm4oeyBjb2xvciwgcmFkaXVzIH0pIHtcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7IGN4OiByYWRpdXMsIGN5OiByYWRpdXMsIHI6IHJhZGl1cywgZmlsbDogY29sb3IgfSk7XG59XG5cbmNvbnN0IGRlZmF1bHRDb2xvciA9IHtcbiAgICBbQmFja2dyb3VuZFZhcmlhbnQuRG90c106ICcjOTE5MTlhJyxcbiAgICBbQmFja2dyb3VuZFZhcmlhbnQuTGluZXNdOiAnI2VlZScsXG4gICAgW0JhY2tncm91bmRWYXJpYW50LkNyb3NzXTogJyNlMmUyZTInLFxufTtcbmNvbnN0IGRlZmF1bHRTaXplID0ge1xuICAgIFtCYWNrZ3JvdW5kVmFyaWFudC5Eb3RzXTogMSxcbiAgICBbQmFja2dyb3VuZFZhcmlhbnQuTGluZXNdOiAxLFxuICAgIFtCYWNrZ3JvdW5kVmFyaWFudC5Dcm9zc106IDYsXG59O1xuY29uc3Qgc2VsZWN0b3IgPSAocykgPT4gKHsgdHJhbnNmb3JtOiBzLnRyYW5zZm9ybSwgcGF0dGVybklkOiBgcGF0dGVybi0ke3MucmZJZH1gIH0pO1xuZnVuY3Rpb24gQmFja2dyb3VuZCh7IGlkLCB2YXJpYW50ID0gQmFja2dyb3VuZFZhcmlhbnQuRG90cywgXG4vLyBvbmx5IHVzZWQgZm9yIGRvdHMgYW5kIGNyb3NzXG5nYXAgPSAyMCwgXG4vLyBvbmx5IHVzZWQgZm9yIGxpbmVzIGFuZCBjcm9zc1xuc2l6ZSwgbGluZVdpZHRoID0gMSwgb2Zmc2V0ID0gMiwgY29sb3IsIHN0eWxlLCBjbGFzc05hbWUsIH0pIHtcbiAgICBjb25zdCByZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgeyB0cmFuc2Zvcm0sIHBhdHRlcm5JZCB9ID0gdXNlU3RvcmUoc2VsZWN0b3IsIHNoYWxsb3cpO1xuICAgIGNvbnN0IHBhdHRlcm5Db2xvciA9IGNvbG9yIHx8IGRlZmF1bHRDb2xvclt2YXJpYW50XTtcbiAgICBjb25zdCBwYXR0ZXJuU2l6ZSA9IHNpemUgfHwgZGVmYXVsdFNpemVbdmFyaWFudF07XG4gICAgY29uc3QgaXNEb3RzID0gdmFyaWFudCA9PT0gQmFja2dyb3VuZFZhcmlhbnQuRG90cztcbiAgICBjb25zdCBpc0Nyb3NzID0gdmFyaWFudCA9PT0gQmFja2dyb3VuZFZhcmlhbnQuQ3Jvc3M7XG4gICAgY29uc3QgZ2FwWFkgPSBBcnJheS5pc0FycmF5KGdhcCkgPyBnYXAgOiBbZ2FwLCBnYXBdO1xuICAgIGNvbnN0IHNjYWxlZEdhcCA9IFtnYXBYWVswXSAqIHRyYW5zZm9ybVsyXSB8fCAxLCBnYXBYWVsxXSAqIHRyYW5zZm9ybVsyXSB8fCAxXTtcbiAgICBjb25zdCBzY2FsZWRTaXplID0gcGF0dGVyblNpemUgKiB0cmFuc2Zvcm1bMl07XG4gICAgY29uc3QgcGF0dGVybkRpbWVuc2lvbnMgPSBpc0Nyb3NzID8gW3NjYWxlZFNpemUsIHNjYWxlZFNpemVdIDogc2NhbGVkR2FwO1xuICAgIGNvbnN0IHBhdHRlcm5PZmZzZXQgPSBpc0RvdHNcbiAgICAgICAgPyBbc2NhbGVkU2l6ZSAvIG9mZnNldCwgc2NhbGVkU2l6ZSAvIG9mZnNldF1cbiAgICAgICAgOiBbcGF0dGVybkRpbWVuc2lvbnNbMF0gLyBvZmZzZXQsIHBhdHRlcm5EaW1lbnNpb25zWzFdIC8gb2Zmc2V0XTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyBjbGFzc05hbWU6IGNjKFsncmVhY3QtZmxvd19fYmFja2dyb3VuZCcsIGNsYXNzTmFtZV0pLCBzdHlsZToge1xuICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIH0sIHJlZjogcmVmLCBcImRhdGEtdGVzdGlkXCI6IFwicmZfX2JhY2tncm91bmRcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0dGVyblwiLCB7IGlkOiBwYXR0ZXJuSWQgKyBpZCwgeDogdHJhbnNmb3JtWzBdICUgc2NhbGVkR2FwWzBdLCB5OiB0cmFuc2Zvcm1bMV0gJSBzY2FsZWRHYXBbMV0sIHdpZHRoOiBzY2FsZWRHYXBbMF0sIGhlaWdodDogc2NhbGVkR2FwWzFdLCBwYXR0ZXJuVW5pdHM6IFwidXNlclNwYWNlT25Vc2VcIiwgcGF0dGVyblRyYW5zZm9ybTogYHRyYW5zbGF0ZSgtJHtwYXR0ZXJuT2Zmc2V0WzBdfSwtJHtwYXR0ZXJuT2Zmc2V0WzFdfSlgIH0sIGlzRG90cyA/IChSZWFjdC5jcmVhdGVFbGVtZW50KERvdFBhdHRlcm4sIHsgY29sb3I6IHBhdHRlcm5Db2xvciwgcmFkaXVzOiBzY2FsZWRTaXplIC8gb2Zmc2V0IH0pKSA6IChSZWFjdC5jcmVhdGVFbGVtZW50KExpbmVQYXR0ZXJuLCB7IGRpbWVuc2lvbnM6IHBhdHRlcm5EaW1lbnNpb25zLCBjb2xvcjogcGF0dGVybkNvbG9yLCBsaW5lV2lkdGg6IGxpbmVXaWR0aCB9KSkpLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7IHg6IFwiMFwiLCB5OiBcIjBcIiwgd2lkdGg6IFwiMTAwJVwiLCBoZWlnaHQ6IFwiMTAwJVwiLCBmaWxsOiBgdXJsKCMke3BhdHRlcm5JZCArIGlkfSlgIH0pKSk7XG59XG5CYWNrZ3JvdW5kLmRpc3BsYXlOYW1lID0gJ0JhY2tncm91bmQnO1xudmFyIEJhY2tncm91bmQkMSA9IG1lbW8oQmFja2dyb3VuZCk7XG5cbmV4cG9ydCB7IEJhY2tncm91bmQkMSBhcyBCYWNrZ3JvdW5kLCBCYWNrZ3JvdW5kVmFyaWFudCB9O1xuIiwgImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVN0b3JlLCB1c2VOb2RlSWQsIGdldE5vZGVzQm91bmRzLCBpbnRlcm5hbHNTeW1ib2wsIFBvc2l0aW9uIH0gZnJvbSAnQHJlYWN0Zmxvdy9jb3JlJztcbmltcG9ydCBjYyBmcm9tICdjbGFzc2NhdCc7XG5pbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnenVzdGFuZC9zaGFsbG93JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbmNvbnN0IHNlbGVjdG9yID0gKHN0YXRlKSA9PiBzdGF0ZS5kb21Ob2RlPy5xdWVyeVNlbGVjdG9yKCcucmVhY3QtZmxvd19fcmVuZGVyZXInKTtcbmZ1bmN0aW9uIE5vZGVUb29sYmFyUG9ydGFsKHsgY2hpbGRyZW4gfSkge1xuICAgIGNvbnN0IHdyYXBwZXJSZWYgPSB1c2VTdG9yZShzZWxlY3Rvcik7XG4gICAgaWYgKCF3cmFwcGVyUmVmKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCB3cmFwcGVyUmVmKTtcbn1cblxuY29uc3Qgbm9kZUVxdWFsaXR5Rm4gPSAoYSwgYikgPT4gYT8ucG9zaXRpb25BYnNvbHV0ZT8ueCA9PT0gYj8ucG9zaXRpb25BYnNvbHV0ZT8ueCAmJlxuICAgIGE/LnBvc2l0aW9uQWJzb2x1dGU/LnkgPT09IGI/LnBvc2l0aW9uQWJzb2x1dGU/LnkgJiZcbiAgICBhPy53aWR0aCA9PT0gYj8ud2lkdGggJiZcbiAgICBhPy5oZWlnaHQgPT09IGI/LmhlaWdodCAmJlxuICAgIGE/LnNlbGVjdGVkID09PSBiPy5zZWxlY3RlZCAmJlxuICAgIGE/LltpbnRlcm5hbHNTeW1ib2xdPy56ID09PSBiPy5baW50ZXJuYWxzU3ltYm9sXT8uejtcbmNvbnN0IG5vZGVzRXF1YWxpdHlGbiA9IChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChub2RlLCBpKSA9PiBub2RlRXF1YWxpdHlGbihub2RlLCBiW2ldKSk7XG59O1xuY29uc3Qgc3RvcmVTZWxlY3RvciA9IChzdGF0ZSkgPT4gKHtcbiAgICB0cmFuc2Zvcm06IHN0YXRlLnRyYW5zZm9ybSxcbiAgICBub2RlT3JpZ2luOiBzdGF0ZS5ub2RlT3JpZ2luLFxuICAgIHNlbGVjdGVkTm9kZXNDb3VudDogc3RhdGUuZ2V0Tm9kZXMoKS5maWx0ZXIoKG5vZGUpID0+IG5vZGUuc2VsZWN0ZWQpLmxlbmd0aCxcbn0pO1xuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtKG5vZGVSZWN0LCB0cmFuc2Zvcm0sIHBvc2l0aW9uLCBvZmZzZXQsIGFsaWduKSB7XG4gICAgbGV0IGFsaWdubWVudE9mZnNldCA9IDAuNTtcbiAgICBpZiAoYWxpZ24gPT09ICdzdGFydCcpIHtcbiAgICAgICAgYWxpZ25tZW50T2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWxpZ24gPT09ICdlbmQnKSB7XG4gICAgICAgIGFsaWdubWVudE9mZnNldCA9IDE7XG4gICAgfVxuICAgIC8vIHBvc2l0aW9uID09PSBQb3NpdGlvbi5Ub3BcbiAgICAvLyB3ZSBzZXQgdGhlIHggYW55IHkgcG9zaXRpb24gb2YgdGhlIHRvb2xiYXIgYmFzZWQgb24gdGhlIG5vZGVzIHBvc2l0aW9uXG4gICAgbGV0IHBvcyA9IFtcbiAgICAgICAgKG5vZGVSZWN0LnggKyBub2RlUmVjdC53aWR0aCAqIGFsaWdubWVudE9mZnNldCkgKiB0cmFuc2Zvcm1bMl0gKyB0cmFuc2Zvcm1bMF0sXG4gICAgICAgIG5vZGVSZWN0LnkgKiB0cmFuc2Zvcm1bMl0gKyB0cmFuc2Zvcm1bMV0gLSBvZmZzZXQsXG4gICAgXTtcbiAgICAvLyBhbmQgdGhhbiBzaGlmdCBpdCBiYXNlZCBvbiB0aGUgYWxpZ25tZW50LiBUaGUgc2hpZnQgdmFsdWVzIGFyZSBpbiAlLlxuICAgIGxldCBzaGlmdCA9IFstMTAwICogYWxpZ25tZW50T2Zmc2V0LCAtMTAwXTtcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgUG9zaXRpb24uUmlnaHQ6XG4gICAgICAgICAgICBwb3MgPSBbXG4gICAgICAgICAgICAgICAgKG5vZGVSZWN0LnggKyBub2RlUmVjdC53aWR0aCkgKiB0cmFuc2Zvcm1bMl0gKyB0cmFuc2Zvcm1bMF0gKyBvZmZzZXQsXG4gICAgICAgICAgICAgICAgKG5vZGVSZWN0LnkgKyBub2RlUmVjdC5oZWlnaHQgKiBhbGlnbm1lbnRPZmZzZXQpICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzFdLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHNoaWZ0ID0gWzAsIC0xMDAgKiBhbGlnbm1lbnRPZmZzZXRdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9zaXRpb24uQm90dG9tOlxuICAgICAgICAgICAgcG9zWzFdID0gKG5vZGVSZWN0LnkgKyBub2RlUmVjdC5oZWlnaHQpICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzFdICsgb2Zmc2V0O1xuICAgICAgICAgICAgc2hpZnRbMV0gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUG9zaXRpb24uTGVmdDpcbiAgICAgICAgICAgIHBvcyA9IFtcbiAgICAgICAgICAgICAgICBub2RlUmVjdC54ICogdHJhbnNmb3JtWzJdICsgdHJhbnNmb3JtWzBdIC0gb2Zmc2V0LFxuICAgICAgICAgICAgICAgIChub2RlUmVjdC55ICsgbm9kZVJlY3QuaGVpZ2h0ICogYWxpZ25tZW50T2Zmc2V0KSAqIHRyYW5zZm9ybVsyXSArIHRyYW5zZm9ybVsxXSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBzaGlmdCA9IFstMTAwLCAtMTAwICogYWxpZ25tZW50T2Zmc2V0XTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3Bvc1swXX1weCwgJHtwb3NbMV19cHgpIHRyYW5zbGF0ZSgke3NoaWZ0WzBdfSUsICR7c2hpZnRbMV19JSlgO1xufVxuZnVuY3Rpb24gTm9kZVRvb2xiYXIoeyBub2RlSWQsIGNoaWxkcmVuLCBjbGFzc05hbWUsIHN0eWxlLCBpc1Zpc2libGUsIHBvc2l0aW9uID0gUG9zaXRpb24uVG9wLCBvZmZzZXQgPSAxMCwgYWxpZ24gPSAnY2VudGVyJywgLi4ucmVzdCB9KSB7XG4gICAgY29uc3QgY29udGV4dE5vZGVJZCA9IHVzZU5vZGVJZCgpO1xuICAgIGNvbnN0IG5vZGVzU2VsZWN0b3IgPSB1c2VDYWxsYmFjaygoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZUlkcyA9IEFycmF5LmlzQXJyYXkobm9kZUlkKSA/IG5vZGVJZCA6IFtub2RlSWQgfHwgY29udGV4dE5vZGVJZCB8fCAnJ107XG4gICAgICAgIHJldHVybiBub2RlSWRzLnJlZHVjZSgoYWNjLCBpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHN0YXRlLm5vZGVJbnRlcm5hbHMuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgYWNjLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSk7XG4gICAgfSwgW25vZGVJZCwgY29udGV4dE5vZGVJZF0pO1xuICAgIGNvbnN0IG5vZGVzID0gdXNlU3RvcmUobm9kZXNTZWxlY3Rvciwgbm9kZXNFcXVhbGl0eUZuKTtcbiAgICBjb25zdCB7IHRyYW5zZm9ybSwgbm9kZU9yaWdpbiwgc2VsZWN0ZWROb2Rlc0NvdW50IH0gPSB1c2VTdG9yZShzdG9yZVNlbGVjdG9yLCBzaGFsbG93KTtcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHR5cGVvZiBpc1Zpc2libGUgPT09ICdib29sZWFuJyA/IGlzVmlzaWJsZSA6IG5vZGVzLmxlbmd0aCA9PT0gMSAmJiBub2Rlc1swXS5zZWxlY3RlZCAmJiBzZWxlY3RlZE5vZGVzQ291bnQgPT09IDE7XG4gICAgaWYgKCFpc0FjdGl2ZSB8fCAhbm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBub2RlUmVjdCA9IGdldE5vZGVzQm91bmRzKG5vZGVzLCBub2RlT3JpZ2luKTtcbiAgICBjb25zdCB6SW5kZXggPSBNYXRoLm1heCguLi5ub2Rlcy5tYXAoKG5vZGUpID0+IChub2RlW2ludGVybmFsc1N5bWJvbF0/LnogfHwgMSkgKyAxKSk7XG4gICAgY29uc3Qgd3JhcHBlclN0eWxlID0ge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0obm9kZVJlY3QsIHRyYW5zZm9ybSwgcG9zaXRpb24sIG9mZnNldCwgYWxpZ24pLFxuICAgICAgICB6SW5kZXgsXG4gICAgICAgIC4uLnN0eWxlLFxuICAgIH07XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE5vZGVUb29sYmFyUG9ydGFsLCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgc3R5bGU6IHdyYXBwZXJTdHlsZSwgY2xhc3NOYW1lOiBjYyhbJ3JlYWN0LWZsb3dfX25vZGUtdG9vbGJhcicsIGNsYXNzTmFtZV0pLCAuLi5yZXN0IH0sIGNoaWxkcmVuKSkpO1xufVxuXG5leHBvcnQgeyBOb2RlVG9vbGJhciB9O1xuIiwgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9ic2lkaWFuIEltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5pbXBvcnQgeyBBcHAsIE1vZGFsLCBTZXR0aW5nIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJmYWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDEgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQzMlx1MDQzRVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMiwgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDRCXHUwNDQ1IFx1MDQzMiBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDNFXHUwNDNBXHUwNDNEXHUwNDNFIEdyYXBoU2V0dGluZ3NNb2RhbC5cclxuICovXHJcbmludGVyZmFjZSBHcmFwaFNldHRpbmdzTW9kYWxQcm9wcyB7XHJcbiAgICBhcHA6IEFwcDtcclxuICAgIGdyYXBoSWQ6IHN0cmluZztcclxuICAgIGdyYXBoVGl0bGU6IHN0cmluZztcclxuICAgIGluaXRpYWxDdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGw7XHJcbiAgICBvblNhdmU6IChncmFwaElkOiBzdHJpbmcsIGN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbCkgPT4gUHJvbWlzZTx2b2lkPjtcclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR3JhcGhTZXR0aW5nc01vZGFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8qKlxyXG4gKiBcdTA0MUNcdTA0M0VcdTA0MzRcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDNFXHUwNDNBXHUwNDNEXHUwNDNFIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQ2XHUwNDM4XHUwNDQ0XHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MFx1MDQzNVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzAuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JhcGhTZXR0aW5nc01vZGFsIGV4dGVuZHMgTW9kYWwge1xyXG4gICAgcHJpdmF0ZSBncmFwaElkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGdyYXBoVGl0bGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgY3VzdG9tU3lzdGVtUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBpbml0aWFsQ3VzdG9tU3lzdGVtUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBvblNhdmU6IChncmFwaElkOiBzdHJpbmcsIGN1c3RvbVN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbCkgPT4gUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcHJvcHM6IEdyYXBoU2V0dGluZ3NNb2RhbFByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwKTtcclxuICAgICAgICB0aGlzLmdyYXBoSWQgPSBwcm9wcy5ncmFwaElkO1xyXG4gICAgICAgIHRoaXMuZ3JhcGhUaXRsZSA9IHByb3BzLmdyYXBoVGl0bGU7XHJcbiAgICAgICAgdGhpcy5jdXN0b21TeXN0ZW1Qcm9tcHQgPSBwcm9wcy5pbml0aWFsQ3VzdG9tU3lzdGVtUHJvbXB0O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbEN1c3RvbVN5c3RlbVByb21wdCA9IHByb3BzLmluaXRpYWxDdXN0b21TeXN0ZW1Qcm9tcHQ7XHJcbiAgICAgICAgdGhpcy5vblNhdmUgPSBwcm9wcy5vblNhdmU7XHJcblxyXG4gICAgICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KGBcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwOiAke3RoaXMuZ3JhcGhUaXRsZX1gKTtcclxuICAgICAgICB0aGlzLm1vZGFsRWwuYWRkQ2xhc3MoJ2xsbS1hZ2VudC1ncmFwaC1zZXR0aW5ncy1tb2RhbCcpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT3BlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcclxuXHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3lzdGVtIFByb21wdCBTZXR0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcclxuICAgICAgICAgICAgLnNldE5hbWUoJ1x1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyJylcclxuICAgICAgICAgICAgLnNldERlc2MoJ1x1MDQyRFx1MDQ0Mlx1MDQzRVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0Q1x1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0UgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAuIFx1MDQxRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQ0Q1x1MDQ0Mlx1MDQzNSBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NEJcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mi4nKVxyXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEodGV4dEFyZWEgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGV4dEFyZWFcclxuICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoJ1x1MDQxMlx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC4uLicpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMuY3VzdG9tU3lzdGVtUHJvbXB0IHx8ICcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tU3lzdGVtUHJvbXB0ID0gdmFsdWUudHJpbSgpID09PSAnJyA/IG51bGwgOiB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0QXJlYS5pbnB1dEVsLnJvd3MgPSA2O1xyXG4gICAgICAgICAgICAgICAgdGV4dEFyZWEuaW5wdXRFbC5zdHlsZS5taW5XaWR0aCA9ICc0MDBweCc7XHJcbiAgICAgICAgICAgICAgICB0ZXh0QXJlYS5pbnB1dEVsLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWN0aW9uIEJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcclxuICAgICAgICAgICAgLmFkZEJ1dHRvbihidXR0b24gPT4ge1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoJ1x1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQ0QycpXHJcbiAgICAgICAgICAgICAgICAgICAgLnNldEN0YSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uU2F2ZSh0aGlzLmdyYXBoSWQsIHRoaXMuY3VzdG9tU3lzdGVtUHJvbXB0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuYWRkQnV0dG9uKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAuc2V0QnV0dG9uVGV4dCgnXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzMCBcdTA0MzNcdTA0M0JcdTA0M0VcdTA0MzFcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzknKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRDbGFzcygnbW9kLXdhcm5pbmcnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vblNhdmUodGhpcy5ncmFwaElkLCBudWxsKTsgLy8gXHUwNDFFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIG51bGwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQzMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5hZGRCdXR0b24oYnV0dG9uID0+IHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KCdcdTA0MUVcdTA0NDJcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzAnKVxyXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xyXG4gICAgICAgIGNvbnRlbnRFbC5lbXB0eSgpO1xyXG4gICAgfVxyXG59IiwgIi8qXHJcbiAqIENoYXRWaWV3IFx1MDQ0M1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0MgXHUwNDM4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDNFXHUwNDNDIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMCwgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzksXHJcbiAqIFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzdcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NEIgTExNLVx1MDQzMFx1MDQzM1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0MyBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0QiwgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDRGIFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJdGVtVmlldywgTm90aWNlLCBXb3Jrc3BhY2VMZWFmIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBDaGF0UGFuZWwgfSBmcm9tICcuLi9jb21wb25lbnRzL0NoYXRQYW5lbCc7XHJcbmltcG9ydCBMTE1BZ2VudFBsdWdpbiBmcm9tICdtYWluJztcclxuaW1wb3J0IHsgQXR0YWNobWVudCB9IGZyb20gJ3NyYy9jb21wb25lbnRzL21vZGVscy9DaGF0SGlzdG9yeUl0ZW0nO1xyXG5cclxuZXhwb3J0IGNvbnN0IENIQVRfVklFV19UWVBFID0gJ2xsbS1hZ2VudC1jaGF0LXZpZXcnO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hhdCBWaWV3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIENoYXRWaWV3IGV4dGVuZHMgSXRlbVZpZXcge1xyXG5cdHBsdWdpbjogTExNQWdlbnRQbHVnaW47XHJcblx0Y2hhdEhpc3Rvcnk6IGFueVtdO1xyXG5cdHNlbGVjdGVkR3JhcGhJZDogc3RyaW5nIHwgbnVsbDtcclxuXHRjdXJyZW50Tm9kZTogc3RyaW5nIHwgbnVsbDtcclxuXHRjaGF0Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRjaGF0UGFuZWw6IENoYXRQYW5lbCB8IG51bGw7XHJcblx0YXZhaWxhYmxlTW9kZWxzOiBzdHJpbmdbXTtcclxuXHRjdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGw7XHJcblx0Y3VycmVudFN0cmVhbWluZ05vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdGNvbnN0cnVjdG9yKGxlYWY6IFdvcmtzcGFjZUxlYWYsIHBsdWdpbjogTExNQWdlbnRQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGxlYWYpO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0XHR0aGlzLmNoYXRIaXN0b3J5ID0gW107XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhJZCA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcclxuXHRcdHRoaXMuY2hhdFBhbmVsID0gbnVsbDtcclxuXHRcdHRoaXMuYXZhaWxhYmxlTW9kZWxzID0gW107XHJcblx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCA9IG51bGw7XHJcblx0fVxyXG5cclxuXHRnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIENIQVRfVklFV19UWVBFO1xyXG5cdH1cclxuXHJcblx0Z2V0RGlzcGxheVRleHQoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAnTExNIEFnZW50IENoYXQnO1xyXG5cdH1cclxuXHJcblx0Z2V0SWNvbigpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuICdtZXNzYWdlLWNpcmNsZSc7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbk9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzFdIGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0Y29udGFpbmVyLmVtcHR5KCk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0MzlcdTA0M0RcdTA0MzVcdTA0NDAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMCAoXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOClcclxuXHRcdHRoaXMuY2hhdENvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVEaXYoKSBhcyBIVE1MRGl2RWxlbWVudDtcclxuXHRcdHRoaXMuY2hhdENvbnRhaW5lci5hZGRDbGFzcygnbGxtLWFnZW50LWNoYXQtY29udGFpbmVyJyk7XHJcblxyXG5cdFx0Ly8gXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzhcclxuXHRcdGF3YWl0IHRoaXMuZmV0Y2hBdmFpbGFibGVNb2RlbHMoKTtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0N1x1MDQzMFx1MDQ0MiBcdTA0M0ZcdTA0MzBcdTA0M0RcdTA0MzVcdTA0M0JcdTA0NEMgXHUwNDQxIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQ0N1x1MDQzNVx1MDQzOSBwbHVnaW5cclxuXHRcdHRoaXMuY2hhdFBhbmVsID0gbmV3IENoYXRQYW5lbCh0aGlzLmNoYXRDb250YWluZXIsIHtcclxuXHRcdFx0Y2hhdEhpc3Rvcnk6IHRoaXMuY2hhdEhpc3RvcnksXHJcblx0XHRcdG9uU2VuZE1lc3NhZ2U6IHRoaXMuaGFuZGxlU2VuZE1lc3NhZ2UuYmluZCh0aGlzKSxcclxuXHRcdFx0YXZhaWxhYmxlTW9kZWxzOiB0aGlzLmF2YWlsYWJsZU1vZGVscyxcclxuXHRcdFx0c2VsZWN0ZWRNb2RlbDogdGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVmYXVsdE1vZGVsIHx8ICdnZW1pbmktMi41LWZsYXNoJyxcclxuXHRcdFx0cGx1Z2luOiB0aGlzLnBsdWdpbixcclxuXHRcdFx0Y3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0OiB0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ25vZGUtc2VsZWN0ZWQnLCB0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCduZXctY2hhdCcsIHRoaXMuaGFuZGxlTmV3Q2hhdC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdncmFwaC1zZWxlY3RlZCcsIHRoaXMuaGFuZGxlR3JhcGhTZWxlY3RlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdyZWdlbmVyYXRlLW1lc3NhZ2UnLCB0aGlzLmhhbmRsZVJlZ2VuZXJhdGVNZXNzYWdlLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3dzLW5vZGUtdHlwZS1jaGFuZ2VkJywgdGhpcy5oYW5kbGVOb2RlVHlwZUNoYW5nZWQuYmluZCh0aGlzKSk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vbignc3RhcnQtbmV3LWluZGVwZW5kZW50LWNoYXQnLCB0aGlzLmhhbmRsZVN0YXJ0TmV3SW5kZXBlbmRlbnRDaGF0LmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ2dyYXBoLWN1c3RvbS1wcm9tcHQtdXBkYXRlZCcsIHRoaXMuaGFuZGxlR3JhcGhDdXN0b21Qcm9tcHRVcGRhdGVkLmJpbmQodGhpcykpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3N0b3Atc3RyZWFtLXJlcXVlc3QnLCB0aGlzLmhhbmRsZVN0b3BTdHJlYW1SZXF1ZXN0LmJpbmQodGhpcykpOyAvLyBcdTA0MURcdTA0MUVcdTA0MTJcdTA0MUVcdTA0MTVcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZC5iaW5kKHRoaXMpKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9uKCdzdHJlYW0tZW5kZWQnLCB0aGlzLmhhbmRsZVN0cmVhbUVuZGVkLmJpbmQodGhpcykpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25DbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC5kZXN0cm95KCk7XHJcblx0XHRcdHRoaXMuY2hhdFBhbmVsID0gbnVsbDtcclxuXHRcdH1cclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignbm9kZS1zZWxlY3RlZCcsIHRoaXMuaGFuZGxlTm9kZVNlbGVjdGVkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignbmV3LWNoYXQnLCB0aGlzLmhhbmRsZU5ld0NoYXQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdncmFwaC1zZWxlY3RlZCcsIHRoaXMuaGFuZGxlR3JhcGhTZWxlY3RlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3JlZ2VuZXJhdGUtbWVzc2FnZScsIHRoaXMuaGFuZGxlUmVnZW5lcmF0ZU1lc3NhZ2UpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCd3cy1ub2RlLXR5cGUtY2hhbmdlZCcsIHRoaXMuaGFuZGxlTm9kZVR5cGVDaGFuZ2VkKTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignc3RhcnQtbmV3LWluZGVwZW5kZW50LWNoYXQnLCB0aGlzLmhhbmRsZVN0YXJ0TmV3SW5kZXBlbmRlbnRDaGF0KTtcclxuXHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLm9mZignZ3JhcGgtY3VzdG9tLXByb21wdC11cGRhdGVkJywgdGhpcy5oYW5kbGVHcmFwaEN1c3RvbVByb21wdFVwZGF0ZWQpO1xyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdzdG9wLXN0cmVhbS1yZXF1ZXN0JywgdGhpcy5oYW5kbGVTdG9wU3RyZWFtUmVxdWVzdCk7IC8vIFx1MDQxRFx1MDQxRVx1MDQxMlx1MDQxRVx1MDQxNVxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub2ZmKCdzdHJlYW0tc3RhcnRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtU3RhcnRlZCk7XHJcblx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5vZmYoJ3N0cmVhbS1lbmRlZCcsIHRoaXMuaGFuZGxlU3RyZWFtRW5kZWQpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8vIFRPRE86IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzNSBcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0VcclxuXHQvKipcclxuXHQgKiBcdTA0MTdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0M0VcdTA0NDIgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDNEXHUwNDRGIFx1MDQzNFx1MDQzRSBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMC5cclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgYGNoYXRIaXN0b3J5YCBcdTA0MzggXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzMiBgY2hhdFBhbmVsYC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUlkIC0gSUQgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ3XHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyBmZXRjaE1lc3NhZ2VzRnJvbVJvb3RUb05vZGUobm9kZUlkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBzZWxlY3RlZEdyYXBoSWQgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHJcblx0XHRcdGlmICghdGhpcy5zZWxlY3RlZEdyYXBoSWQpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oJ3NlbGVjdGVkR3JhcGhJZCBcdTA0M0RcdTA0MzUgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNELiBcdTA0MURcdTA0MzVcdTA0MzJcdTA0M0VcdTA0MzdcdTA0M0NcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri4nKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IHVybCA9IG5vZGVJZFxyXG5cdFx0XHRcdD8gYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vbWVzc2FnZXMvJHt0aGlzLnNlbGVjdGVkR3JhcGhJZH0vJHtub2RlSWR9YFxyXG5cdFx0XHRcdDogYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vbWVzc2FnZXMvJHt0aGlzLnNlbGVjdGVkR3JhcGhJZH0vbGFzdGA7XHJcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcclxuXHJcblx0XHRcdGlmICghcmVzcG9uc2Uub2spIHtcclxuXHRcdFx0XHRjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOTogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtlcnJvclRleHR9YCk7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcblx0XHRcdHRoaXMuY2hhdEhpc3RvcnkgPVxyXG5cdFx0XHRcdGRhdGEubWFwKChtc2c6IGFueSkgPT4gKHtcclxuXHRcdFx0XHRcdC4uLm1zZyxcclxuXHRcdFx0XHRcdHR5cGU6IG1zZy50eXBlIHx8IG1zZy5yb2xlIC8vIFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyB0eXBlLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDLCBcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzUgcm9sZSBcdTA0M0FcdTA0MzBcdTA0M0EgZmFsbGJhY2tcclxuXHRcdFx0XHR9KSkgfHwgW107XHJcblxyXG5cdFx0XHQvLyBcdTA0MjNcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0M0NcdTA0NEIgXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM4IFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQ0QiBcdTA0NDEgXHUwNDNEXHUwNDM1LVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQ0Qlx1MDQzQyBcdTA0NDBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0NcclxuXHRcdFx0aWYgKHRoaXMuY2hhdEhpc3RvcnkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdC8vIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBjdXJyZW50Tm9kZSBcdTA0M0RcdTA0MzAgSUQgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOFxyXG5cdFx0XHRcdHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV0ubm9kZV9pZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnROb2RlID0gbnVsbDsgLy8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzAsIGN1cnJlbnRfbm9kZV9pZCBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgbnVsbFxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOTonLCBlcnJvcik7XHJcblx0XHRcdC8vIE9wdGlvbmFsbHk6IHNob3cgYSBub3RpY2UgdG8gdGhlIHVzZXJcclxuXHRcdFx0Ly8gbmV3IE5vdGljZShgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0Mzk6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuXHJcblx0XHRcdC8qIFx1MDQyMVx1MDQzRlx1MDQzRVx1MDQ0MFx1MDQzRFx1MDQzRSwgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzOFx1MDQzQjogdGhpcy5jaGF0SGlzdG9yeSA9IFtdOyAvLyBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzVcclxuXHRcdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7IC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBjdXJyZW50Tm9kZSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDM1XHJcblx0XHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUhpc3RvcnkodGhpcy5jaGF0SGlzdG9yeSk7XHJcblx0XHRcdH0qL1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNDXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDM5IFx1MDQ0MSBcdTA0MzFcdTA0NERcdTA0M0FcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzAuXHJcblx0ICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XHJcblx0ICovXHJcblx0YXN5bmMgZmV0Y2hBdmFpbGFibGVNb2RlbHMoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMucGx1Z2luLnNldHRpbmdzLmFwaUJhc2VVcmx9L21vZGVsc2ApO1xyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzOTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5hdmFpbGFibGVNb2RlbHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0Mzk6JywgZXJyb3IpO1xyXG5cdFx0XHQvLyBGYWxsYmFjayBcdTA0M0EgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDRCXHUwNDNDIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzQ1xyXG5cdFx0XHR0aGlzLmF2YWlsYWJsZU1vZGVscyA9IFsnZ2VtaW5pLTIuNS1mbGFzaCcsICdncHQtNG8tbWluaScsICdjbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMiddO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnQgSGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdGFzeW5jIGhhbmRsZVNlbmRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgc2VsZWN0ZWRNb2RlbD86IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmICghdGhpcy5zZWxlY3RlZEdyYXBoSWQpIHtcclxuXHRcdFx0XHRuZXcgTm90aWNlKCdcdTA0MTNcdTA0NDBcdTA0MzBcdTA0NDQgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRCBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDNEXHUwNDM1IFx1MDQzOFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRC4gXHUwNDFGXHUwNDNFXHUwNDM2XHUwNDMwXHUwNDNCXHUwNDQzXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMwLCBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0M0RcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQ0N1x1MDQzMFx1MDQ0MiBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOS4nLCAzMDAwKTtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oJ3NlbGVjdGVkR3JhcGhJZCBpcyBudWxsIGluIGhhbmRsZVNlbmRNZXNzYWdlLiBDdXJyZW50IHN0YXRlOicsIHtcclxuXHRcdFx0XHRcdHNlbGVjdGVkR3JhcGhJZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsXHJcblx0XHRcdFx0XHRjdXJyZW50Tm9kZTogdGhpcy5jdXJyZW50Tm9kZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGVGb2xkZXIgPSB0aGlzLmdldENhY2hlRm9sZGVyUGF0aCgpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDI4XHUwNDMwXHUwNDMzIDE6IFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ1MVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRGIFx1MDQ0MSBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcdTA0M0NcdTA0MzhcclxuXHRcdFx0Y29uc3Qgc2VuZFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXBpQmFzZVVybH0vY2hhdC9zZW5kYCwge1xyXG5cdFx0XHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0XHRcdGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxyXG5cdFx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2UsXHJcblx0XHRcdFx0XHRncmFwaF9pZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQsXHJcblx0XHRcdFx0XHRwYXJlbnRfbm9kZV9pZDogdGhpcy5jdXJyZW50Tm9kZSxcclxuXHRcdFx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyB8fCBbXSxcclxuXHRcdFx0XHRcdGNhY2hlX2ZvbGRlcjogY2FjaGVGb2xkZXJcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmICghc2VuZFJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEY6ICR7c2VuZFJlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3Qgc2VuZFJlc3VsdCA9IGF3YWl0IHNlbmRSZXNwb25zZS5qc29uKCk7XHJcblx0XHRcdGNvbnN0IHVzZXJOb2RlSWQgPSBzZW5kUmVzdWx0Lm5vZGVfaWQ7XHJcblxyXG5cdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1zZWxlY3RlZCcsIHtcclxuXHRcdFx0XHRncmFwaElkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCxcclxuXHRcdFx0XHRjdXJyZW50Tm9kZTogdXNlck5vZGVJZFxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIFx1MDQyOFx1MDQzMFx1MDQzMyAyOiBcdTA0MTdcdTA0MzBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM4XHUwNDNEXHUwNDMzIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQzMFxyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQpIHtcclxuXHRcdFx0XHRjb25zdCBzeXN0ZW1Qcm9tcHRUb1VzZSA9XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCAhPT0gbnVsbCA/IHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0IDogdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3lzdGVtUHJvbXB0O1xyXG5cclxuXHRcdFx0XHRhd2FpdCB0aGlzLnN0cmVhbUxMTVJlc3BvbnNlKHRoaXMuc2VsZWN0ZWRHcmFwaElkLCB1c2VyTm9kZUlkLCBzZWxlY3RlZE1vZGVsLCBudWxsLCBzeXN0ZW1Qcm9tcHRUb1VzZSwgY2FjaGVGb2xkZXIpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignR3JhcGggSUQgXHUwNDNEXHUwNDM1IFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ1MVx1MDQzRCBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RicpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzggXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGOicsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwOiAke2Vycm9yPy5tZXNzYWdlIHx8IGVycm9yfWAsIDUwMDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzNS4gXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDM0XHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzBcclxuXHQgKiBcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzAuXHJcblx0ICogQHBhcmFtIHt7IG5vZGVJZDogc3RyaW5nIH19IGRhdGEgLSBcdTA0MUVcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIsIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzMFx1MDQ0OVx1MDQzOFx1MDQzOSBJRCBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwLlxyXG5cdCAqL1xyXG5cdGhhbmRsZU5vZGVTZWxlY3RlZChkYXRhOiB7IG5vZGVJZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBkYXRhLm5vZGVJZDtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkR3JhcGhJZCkge1xyXG5cdFx0XHR0aGlzLmZldGNoTWVzc2FnZXNGcm9tUm9vdFRvTm9kZShkYXRhLm5vZGVJZCkudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0Ly8gXHUwNDFGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzN1x1MDQzQVx1MDQzOCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzkgXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDNBXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDIFx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzhcdTA0M0RcdTA0MzMgXHUwNDMyIFx1MDQzRFx1MDQzNVx1MDQzOVxyXG5cdFx0XHRcdGlmICh0aGlzLmN1cnJlbnRTdHJlYW1pbmdOb2RlSWQpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGlzSW5OZXdCcmFuY2ggPSB0aGlzLmNoYXRIaXN0b3J5LnNvbWUoKG1zZykgPT4gbXNnLm5vZGVfaWQgPT09IHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlU3RvcEJ1dHRvblZpc2liaWxpdHkoaXNJbk5ld0JyYW5jaCwgaXNJbk5ld0JyYW5jaCA/IHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCA6IG51bGwpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzMCBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLiBcdTA0MjFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzBcclxuXHQgKiBcdTA0MzggXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzguXHJcblx0ICovXHJcblx0YXN5bmMgaGFuZGxlTmV3Q2hhdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRoaXMuY2hhdEhpc3RvcnkgPSBbXTtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBudWxsO1xyXG5cdFx0Ly90aGlzLnNlbGVjdGVkR3JhcGhJZCA9IG51bGw7XHJcblx0XHQvL3RoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gbnVsbDtcclxuXHRcdHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gbnVsbDtcclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVDdXN0b21TeXN0ZW1Qcm9tcHRTdGF0dXMobnVsbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzMCBcdTA0MzhcdTA0MzcgYEdyYXBoVmlld2AuIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0IFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcclxuXHQgKi9cclxuXHRhc3luYyBoYW5kbGVHcmFwaFNlbGVjdGVkKGRhdGE6IHsgZ3JhcGhJZDogc3RyaW5nOyBjdXJyZW50Tm9kZTogc3RyaW5nIHwgbnVsbCB9KTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLnNlbGVjdGVkR3JhcGhJZCA9IGRhdGEuZ3JhcGhJZDtcclxuXHRcdHRoaXMuY3VycmVudE5vZGUgPSBkYXRhLmN1cnJlbnROb2RlO1xyXG5cdFx0Ly8gXHUwNDEyXHUwNDMwXHUwNDM2XHUwNDNEXHUwNDNFOiBjdXN0b21fc3lzdGVtX3Byb21wdCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEIFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNyAnZ3JhcGgtY3VzdG9tLXByb21wdC11cGRhdGVkJyBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUsXHJcblx0XHQvLyBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0MzUgXHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzMiBHcmFwaFZpZXcgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IGZldGNoR3JhcGhEYXRhLlxyXG5cdFx0Ly8gXHUwNDE3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzQ1x1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDNEXHUwNDM1IFx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzMFx1MDQzNVx1MDQzQyB0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCBcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0NEZcdTA0M0NcdTA0NDNcdTA0NEUsXHJcblx0XHQvLyBcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDM2XHUwNDM4XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDLCBcdTA0NDdcdTA0NDJcdTA0M0UgR3JhcGhWaWV3IFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDIuXHJcblx0XHRhd2FpdCB0aGlzLmZldGNoTWVzc2FnZXNGcm9tUm9vdFRvTm9kZShkYXRhLmN1cnJlbnROb2RlKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzOFx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDIgTExNLlxyXG5cdCAqL1xyXG5cdGFzeW5jIHN0cmVhbUxMTVJlc3BvbnNlKFxyXG5cdFx0Z3JhcGhJZDogc3RyaW5nLFxyXG5cdFx0dXNlck5vZGVJZDogc3RyaW5nLFxyXG5cdFx0c2VsZWN0ZWRNb2RlbD86IHN0cmluZyxcclxuXHRcdGV4aXN0aW5nQXNzaXN0YW50Tm9kZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcclxuXHRcdHN5c3RlbVByb21wdDogc3RyaW5nIHwgbnVsbCA9IG51bGwsXHJcblx0XHRjYWNoZUZvbGRlcj86IHN0cmluZ1xyXG5cdCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgYm9keSA9IHtcclxuXHRcdFx0Z3JhcGhfaWQ6IGdyYXBoSWQsXHJcblx0XHRcdHVzZXJfbm9kZV9pZDogdXNlck5vZGVJZCxcclxuXHRcdFx0c3lzdGVtX3Byb21wdDogc3lzdGVtUHJvbXB0LFxyXG5cdFx0XHRtb2RlbDogc2VsZWN0ZWRNb2RlbCB8fCB0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWZhdWx0TW9kZWwsXHJcblx0XHRcdGNhY2hlX2ZvbGRlcjogY2FjaGVGb2xkZXJcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKGV4aXN0aW5nQXNzaXN0YW50Tm9kZUlkKSB7XHJcblx0XHRcdE9iamVjdC5hc3NpZ24oYm9keSwgeyBleGlzdGluZ19hc3Npc3RhbnRfbm9kZV9pZDogZXhpc3RpbmdBc3Npc3RhbnROb2RlSWQgfSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG5cdFx0bGV0IGFzc2lzdGFudE5vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0bGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9jaGF0L3N0cmVhbWAsIHtcclxuXHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcclxuXHRcdFx0XHRoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcclxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcclxuXHRcdFx0XHRzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIXJlc3BvbnNlLm9rKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCFyZXNwb25zZS5ib2R5KSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIG51bGwnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xyXG5cclxuXHRcdFx0Y29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xyXG5cdFx0XHRsZXQgYWNjdW11bGF0ZWRDb250ZW50ID0gJyc7XHJcblxyXG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xyXG5cdFx0XHRcdGlmIChhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcclxuXHRcdFx0XHRpZiAoZG9uZSkgYnJlYWs7XHJcblxyXG5cdFx0XHRcdGNvbnN0IGNodW5rID0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pO1xyXG5cdFx0XHRcdGNvbnN0IGxpbmVzID0gY2h1bmsuc3BsaXQoJ1xcbicpO1xyXG5cclxuXHRcdFx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuXHRcdFx0XHRcdGlmIChsaW5lLnN0YXJ0c1dpdGgoJ2RhdGE6ICcpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGxpbmUuc2xpY2UoNikpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKGRhdGEudHlwZSA9PT0gJ25vZGVfY3JlYXRlZCcpIHtcclxuXHRcdFx0XHRcdFx0XHRhc3Npc3RhbnROb2RlSWQgPSBkYXRhLm5vZGVfaWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3N0cmVhbS1zdGFydGVkJywge1xyXG5cdFx0XHRcdFx0XHRcdFx0bm9kZUlkOiBhc3Npc3RhbnROb2RlSWQsXHJcblx0XHRcdFx0XHRcdFx0XHRjb250cm9sbGVyOiBhYm9ydENvbnRyb2xsZXJcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEucmV1c2VkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNsZWFyU3RyZWFtaW5nTWVzc2FnZShhc3Npc3RhbnROb2RlSWQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdncmFwaC1zZWxlY3RlZCcsIHtcclxuXHRcdFx0XHRcdFx0XHRcdGdyYXBoSWQ6IGdyYXBoSWQsXHJcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50Tm9kZTogYXNzaXN0YW50Tm9kZUlkXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnY2h1bmsnICYmIGFzc2lzdGFudE5vZGVJZCkge1xyXG5cdFx0XHRcdFx0XHRcdGFjY3VtdWxhdGVkQ29udGVudCArPSBkYXRhLmNvbnRlbnQ7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy51cGRhdGVTdHJlYW1pbmdNZXNzYWdlKGFzc2lzdGFudE5vZGVJZCwgYWNjdW11bGF0ZWRDb250ZW50KTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdlcnJvcicpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzA6JywgZGF0YS5lcnJvcik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGFzc2lzdGFudE5vZGVJZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5tYXJrTm9kZUFzRXJyb3IoYXNzaXN0YW50Tm9kZUlkLCBkYXRhLmVycm9yKTtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ2dyYXBoLXNlbGVjdGVkJywge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRncmFwaElkOiBncmFwaElkLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50Tm9kZTogYXNzaXN0YW50Tm9kZUlkXHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdHJlYW0tZW5kZWQnLCB7IG5vZGVJZDogYXNzaXN0YW50Tm9kZUlkIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdkb25lJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuY3VycmVudE5vZGUgPSBhc3Npc3RhbnROb2RlSWQ7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMuZW1pdCgnZ3JhcGgtc2VsZWN0ZWQnLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRncmFwaElkOiBncmFwaElkLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudE5vZGU6IGFzc2lzdGFudE5vZGVJZFxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoYXNzaXN0YW50Tm9kZUlkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdHJlYW0tZW5kZWQnLCB7IG5vZGVJZDogYXNzaXN0YW50Tm9kZUlkIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG5cdFx0XHRpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ1x1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzQyBcdTA0MzFcdTA0NEJcdTA0M0IgXHUwNDNFXHUwNDQyXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzQycpO1xyXG5cdFx0XHRcdGlmIChhc3Npc3RhbnROb2RlSWQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3N0cmVhbS1lbmRlZCcsIHsgbm9kZUlkOiBhc3Npc3RhbnROb2RlSWQgfSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRocm93IGVycm9yOyAvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDM1IFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzOFxyXG5cdFx0XHR9XHJcblx0XHR9IGZpbmFsbHkge1xyXG5cdFx0XHRyZWFkZXI/LnJlbGVhc2VMb2NrKCk7XHJcblx0XHRcdGlmIChhc3Npc3RhbnROb2RlSWQpIHtcclxuXHRcdFx0XHR0aGlzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdHJlYW0tZW5kZWQnLCB7IG5vZGVJZDogYXNzaXN0YW50Tm9kZUlkIH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMCwgXHUwNDNGXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDQ3XHUwNDMwXHUwNDRGIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDNBXHUwNDQzLlxyXG5cdCAqIFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDMzXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQzQSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzguXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5vZGVJZCAtIElEIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCwgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDRDLlxyXG5cdCAqL1xyXG5cdGNsZWFyU3RyZWFtaW5nTWVzc2FnZShub2RlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc3QgbWVzc2FnZUluZGV4ID0gdGhpcy5jaGF0SGlzdG9yeS5maW5kSW5kZXgoKG1zZykgPT4gbXNnLm5vZGVfaWQgPT09IG5vZGVJZCk7XHJcblx0XHRpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHR0aGlzLmNoYXRIaXN0b3J5W21lc3NhZ2VJbmRleF0uY29udGVudCA9ICdcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDMwLi4uJztcclxuXHRcdFx0dGhpcy5jaGF0SGlzdG9yeVttZXNzYWdlSW5kZXhdLnR5cGUgPSAnbGxtJzsgLy8gXHUwNDIzXHUwNDMxXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNDXHUwNDQxXHUwNDRGLCBcdTA0NDdcdTA0NDJcdTA0M0UgXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMCBMTE1cclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSwgXHUwNDQxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDRDXHUwNDQyXHUwNDM1IFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzNSBcdTA0NDRcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzhcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlSGlzdG9yeSh0aGlzLmNoYXRIaXN0b3J5KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZVN0cmVhbWluZ01lc3NhZ2Uobm9kZUlkOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0Y29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLmNoYXRIaXN0b3J5W3RoaXMuY2hhdEhpc3RvcnkubGVuZ3RoIC0gMV07XHJcblx0XHRpZiAobGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2Uubm9kZV9pZCA9PT0gbm9kZUlkKSB7XHJcblx0XHRcdGxhc3RNZXNzYWdlLmNvbnRlbnQgPSBjb250ZW50O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jaGF0SGlzdG9yeS5wdXNoKHtcclxuXHRcdFx0XHRyb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRjb250ZW50OiBjb250ZW50LFxyXG5cdFx0XHRcdG5vZGVfaWQ6IG5vZGVJZCxcclxuXHRcdFx0XHRncmFwaF9pZDogdGhpcy5zZWxlY3RlZEdyYXBoSWQgfHwgJydcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUhpc3RvcnkodGhpcy5jaGF0SGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRtYXJrTm9kZUFzRXJyb3Iobm9kZUlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zdCBsYXN0TWVzc2FnZSA9IHRoaXMuY2hhdEhpc3RvcnlbdGhpcy5jaGF0SGlzdG9yeS5sZW5ndGggLSAxXTtcclxuXHRcdGlmIChsYXN0TWVzc2FnZSAmJiBsYXN0TWVzc2FnZS5ub2RlX2lkID09PSBub2RlSWQpIHtcclxuXHRcdFx0bGFzdE1lc3NhZ2UudHlwZSA9ICdlcnJvcic7XHJcblx0XHRcdGxhc3RNZXNzYWdlLmNvbnRlbnQgPSBlcnJvck1lc3NhZ2U7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzhcdTA0MzksIFx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQ0M1x1MDQzOVx1MDQ0Mlx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NENcclxuXHRcdFx0Y29uc3QgbWVzc2FnZUluZGV4ID0gdGhpcy5jaGF0SGlzdG9yeS5maW5kSW5kZXgoKG1zZykgPT4gbXNnLm5vZGVfaWQgPT09IG5vZGVJZCk7XHJcblx0XHRcdGlmIChtZXNzYWdlSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dGhpcy5jaGF0SGlzdG9yeVttZXNzYWdlSW5kZXhdLnR5cGUgPSAnZXJyb3InO1xyXG5cdFx0XHRcdHRoaXMuY2hhdEhpc3RvcnlbbWVzc2FnZUluZGV4XS5jb250ZW50ID0gZXJyb3JNZXNzYWdlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCwgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDRDXHUwNDQyXHUwNDM1IFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNFXHUwNDMxIFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzNVxyXG5cdFx0XHRcdHRoaXMuY2hhdEhpc3RvcnkucHVzaCh7XHJcblx0XHRcdFx0XHRyb2xlOiAnYXNzaXN0YW50JyxcclxuXHRcdFx0XHRcdGNvbnRlbnQ6IGVycm9yTWVzc2FnZSxcclxuXHRcdFx0XHRcdG5vZGVfaWQ6IG5vZGVJZCxcclxuXHRcdFx0XHRcdGdyYXBoX2lkOiB0aGlzLnNlbGVjdGVkR3JhcGhJZCB8fCAnJyxcclxuXHRcdFx0XHRcdHR5cGU6ICdlcnJvcidcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgaGFuZGxlUmVnZW5lcmF0ZU1lc3NhZ2UoZGF0YTogeyBncmFwaElkOiBzdHJpbmc7IG5vZGVJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0MzhcdTA0NDFcdTA0NDJcdTA0MzVcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0FcdTA0Mzg6IFx1MDQzQVx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDLCBcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzUgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5XHJcblx0XHRcdGNvbnN0IHN5c3RlbVByb21wdFRvVXNlID1cclxuXHRcdFx0XHR0aGlzLmN1cnJlbnRHcmFwaEN1c3RvbVN5c3RlbVByb21wdCAhPT0gbnVsbCA/IHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0IDogdGhpcy5wbHVnaW4uc2V0dGluZ3Muc3lzdGVtUHJvbXB0O1xyXG5cclxuXHRcdFx0Y29uc3QgY2FjaGVGb2xkZXIgPSB0aGlzLmdldENhY2hlRm9sZGVyUGF0aCgpO1xyXG5cclxuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlCYXNlVXJsfS9jaGF0L3JlZ2VuZXJhdGVgLCB7XHJcblx0XHRcdFx0bWV0aG9kOiAnUE9TVCcsXHJcblx0XHRcdFx0aGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG5cdFx0XHRcdFx0Z3JhcGhfaWQ6IGRhdGEuZ3JhcGhJZCxcclxuXHRcdFx0XHRcdG5vZGVfaWQ6IGRhdGEubm9kZUlkLFxyXG5cdFx0XHRcdFx0bW9kZWw6IGRhdGEubW9kZWwsXHJcblx0XHRcdFx0XHRzeXN0ZW1fcHJvbXB0OiBzeXN0ZW1Qcm9tcHRUb1VzZSxcclxuXHRcdFx0XHRcdGNhY2hlX2ZvbGRlcjogY2FjaGVGb2xkZXJcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmICghcmVzcG9uc2Uub2spIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzBcdTA0NDZcdTA0MzhcdTA0Mzg6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblx0XHRcdGNvbnN0IGV4aXN0aW5nQXNzaXN0YW50Tm9kZUlkID0gcmVzdWx0LmV4aXN0aW5nX2Fzc2lzdGFudF9ub2RlX2lkO1xyXG5cdFx0XHRjb25zdCB1c2VyTm9kZUlkID0gcmVzdWx0LnVzZXJfbm9kZV9pZDtcclxuXHRcdFx0Y29uc3QgbW9kZWxUb1VzZSA9IHJlc3VsdC5tb2RlbDtcclxuXHRcdFx0Y29uc3Qgc3lzdGVtUHJvbXB0RnJvbUJhY2tlbmQgPSByZXN1bHQuc3lzdGVtX3Byb21wdDtcclxuXHJcblx0XHRcdGlmIChkYXRhLmdyYXBoSWQpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLnN0cmVhbUxMTVJlc3BvbnNlKGRhdGEuZ3JhcGhJZCwgdXNlck5vZGVJZCwgbW9kZWxUb1VzZSwgZXhpc3RpbmdBc3Npc3RhbnROb2RlSWQsIHN5c3RlbVByb21wdEZyb21CYWNrZW5kKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4OicsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShgXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzODogJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gLCA1MDAwKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDMwIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0RcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLlxyXG5cdCAqIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IENoYXRWaWV3LCBcdTA0M0RcdTA0M0UgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0RcdTA0MzAgR3JhcGhWaWV3LlxyXG5cdCAqL1xyXG5cdGFzeW5jIGhhbmRsZVN0YXJ0TmV3SW5kZXBlbmRlbnRDaGF0KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0dGhpcy5jaGF0SGlzdG9yeSA9IFtdO1xyXG5cdFx0dGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XHJcblx0XHQvLyBcdTA0MUVcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgdGhpcy5zZWxlY3RlZEdyYXBoSWQgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVxyXG5cdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdGF3YWl0IHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUhpc3RvcnkodGhpcy5jaGF0SGlzdG9yeSk7XHJcblx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZUN1c3RvbVN5c3RlbVByb21wdFN0YXR1cyhudWxsKTtcclxuXHRcdH1cclxuXHRcdC8vIFx1MDQxRVx1MDQzRlx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRTogXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQ0M1x1MDQzMlx1MDQzNVx1MDQzNFx1MDQzRVx1MDQzQ1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NEYgXHUwNDNFIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzNSBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwXHJcblx0XHRuZXcgTm90aWNlKCdcdTA0MURcdTA0MzBcdTA0NDdcdTA0MzBcdTA0NDIgXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQ0N1x1MDQzMFx1MDQ0Mi4gXHUwNDIyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0M0RcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNELicsIDIwMDApO1xyXG5cdH1cclxuXHJcblx0aGFuZGxlU3RvcFN0cmVhbVJlcXVlc3QoZGF0YTogeyBub2RlSWQ6IHN0cmluZyB9KTogdm9pZCB7XHJcblx0XHRjb25zdCBjb250cm9sbGVyID0gKHRoaXMucGx1Z2luIGFzIGFueSkuYWN0aXZlU3RyZWFtQ29udHJvbGxlcnM/LmdldChkYXRhLm5vZGVJZCk7XHJcblx0XHRpZiAoY29udHJvbGxlcikge1xyXG5cdFx0XHRjb250cm9sbGVyLmFib3J0KCk7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNDLicsIDIwMDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aGFuZGxlU3RyZWFtU3RhcnRlZChkYXRhOiB7IG5vZGVJZDogc3RyaW5nOyBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgfSk6IHZvaWQge1xyXG5cdFx0dGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkID0gZGF0YS5ub2RlSWQ7XHJcblx0XHQvLyBUT0RPOiBcdTA0MTJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0UgXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQzRVx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRCBcdTA0MzIgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4LFxyXG5cdFx0Ly8gXHUwNDQyLlx1MDQzQS4gXHUwNDQzIFx1MDQzRFx1MDQzMFx1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDNBIFx1MDQzQ1x1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0MyBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzAgJ3N0cmVhbS1zdGFydGVkJyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM1XHUwNDQ5XHUwNDUxIFx1MDQzRFx1MDQzNSBcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0VcclxuXHRcdC8vIGNvbnN0IGlzSW5DdXJyZW50QnJhbmNoID0gdGhpcy5jaGF0SGlzdG9yeS5zb21lKChtc2cpID0+IG1zZy5ub2RlX2lkID09PSBkYXRhLm5vZGVJZCk7XHJcblx0XHQvLyBpZiAodGhpcy5jaGF0UGFuZWwgJiYgaXNJbkN1cnJlbnRCcmFuY2gpIHtcclxuXHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVTdG9wQnV0dG9uVmlzaWJpbGl0eSh0cnVlLCBkYXRhLm5vZGVJZCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRoYW5kbGVTdHJlYW1FbmRlZChkYXRhOiB7IG5vZGVJZDogc3RyaW5nIH0pOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmN1cnJlbnRTdHJlYW1pbmdOb2RlSWQgPT09IGRhdGEubm9kZUlkKSB7XHJcblx0XHRcdHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCA9IG51bGw7XHJcblx0XHRcdGlmICh0aGlzLmNoYXRQYW5lbCkge1xyXG5cdFx0XHRcdHRoaXMuY2hhdFBhbmVsLnVwZGF0ZVN0b3BCdXR0b25WaXNpYmlsaXR5KGZhbHNlLCBudWxsKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2ViU29ja2V0IEV2ZW50IEhhbmRsZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHRoYW5kbGVOb2RlVHlwZUNoYW5nZWQoZGF0YTogeyBncmFwaElkOiBzdHJpbmc7IG5vZGVJZDogc3RyaW5nOyBub2RlVHlwZTogc3RyaW5nIH0pOiB2b2lkIHtcclxuXHRcdC8vIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0MzhcdTA0M0YgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzMiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwXHJcblx0XHRjb25zdCBtZXNzYWdlSW5kZXggPSB0aGlzLmNoYXRIaXN0b3J5LmZpbmRJbmRleCgobXNnKSA9PiBtc2cubm9kZV9pZCA9PT0gZGF0YS5ub2RlSWQpO1xyXG5cdFx0aWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0dGhpcy5jaGF0SGlzdG9yeVttZXNzYWdlSW5kZXhdLnR5cGUgPSBkYXRhLm5vZGVUeXBlO1xyXG5cdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVIaXN0b3J5KHRoaXMuY2hhdEhpc3RvcnkpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRoYW5kbGVHcmFwaEN1c3RvbVByb21wdFVwZGF0ZWQoZGF0YTogeyBncmFwaF9pZDogc3RyaW5nOyBjdXN0b21fc3lzdGVtX3Byb21wdDogc3RyaW5nIHwgbnVsbCB9KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEdyYXBoSWQgPT09IGRhdGEuZ3JhcGhfaWQpIHtcclxuXHRcdFx0dGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQgPSBkYXRhLmN1c3RvbV9zeXN0ZW1fcHJvbXB0O1xyXG5cdFx0XHRpZiAodGhpcy5jaGF0UGFuZWwpIHtcclxuXHRcdFx0XHR0aGlzLmNoYXRQYW5lbC51cGRhdGVDdXN0b21TeXN0ZW1Qcm9tcHRTdGF0dXModGhpcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRHcmFwaElkID09PSBudWxsICYmIGRhdGEuZ3JhcGhfaWQgPT09IG51bGwpIHtcclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NCBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHJcblx0XHRcdHRoaXMuY3VycmVudEdyYXBoQ3VzdG9tU3lzdGVtUHJvbXB0ID0gbnVsbDtcclxuXHRcdFx0aWYgKHRoaXMuY2hhdFBhbmVsKSB7XHJcblx0XHRcdFx0dGhpcy5jaGF0UGFuZWwudXBkYXRlQ3VzdG9tU3lzdGVtUHJvbXB0U3RhdHVzKG51bGwpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMwXHUwNDMxXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRFXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZ2V0Q2FjaGVGb2xkZXJQYXRoKCk6IHN0cmluZyB7XHJcblx0XHQvLyBUT0RPOiBcdTA0MURcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzOSwgXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwIGNhY2hlRm9sZGVyIFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzOVxyXG5cdFx0cmV0dXJuIHRoaXMuY2hhdFBhbmVsPy5jYWNoZU1hbmFnZXI/LmdldENhY2hlRm9sZGVyUGF0aCgpID8/ICcnO1xyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQyM1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0RcdTA0MzAgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDRCIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0NEIuXHJcbiAqIFx1MDQxRVx1MDQzMVx1MDQzNVx1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0NDFcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzMiBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0M0JcdTA0MzhcdTA0NDlcdTA0MzUgXHUwNDM4IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0NDNcdTA0M0JcdTA0NENcdTA0NDJcdTA0MzBcdTA0NDJcdTA0M0VcdTA0MzIuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgTm90aWNlLCBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJmYWNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXV0b2NvbXBsZXRlSXRlbSB7XHJcblx0bmFtZTogc3RyaW5nO1xyXG5cdHBhdGg6IHN0cmluZztcclxuXHR0eXBlOiAnZmlsZScgfCAncHJvbXB0JztcclxuXHRpY29uOiBzdHJpbmc7IC8vIE9ic2lkaWFuIGljb24gbmFtZVxyXG5cdGZpbGU/OiBURmlsZTsgLy8gXHUwNDIxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgT2JzaWRpYW5cclxufVxyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXV0b2NvbXBsZXRlIE1hbmFnZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlTWFuYWdlciB7XHJcblx0cHJpdmF0ZSBwbHVnaW46IExMTUFnZW50UGx1Z2luO1xyXG5cdHByaXZhdGUgZmlsZUNhY2hlOiBNYXA8c3RyaW5nLCBBdXRvY29tcGxldGVJdGVtW10+ID0gbmV3IE1hcCgpO1xyXG5cdHByaXZhdGUgcHJvbXB0Q2FjaGU6IE1hcDxzdHJpbmcsIEF1dG9jb21wbGV0ZUl0ZW1bXT4gPSBuZXcgTWFwKCk7XHJcblx0cHJpdmF0ZSBsYXN0Q2FjaGVVcGRhdGUgPSAwO1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgQ0FDSEVfVFRMID0gMzAwMDA7IC8vIDMwIFx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFxyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gTUFYX1RPVEFMX0lURU1TIFx1MDQxQ1x1MDQzMFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0M0JcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0M0UgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzAgXHUwNDM4IFx1MDQzQVx1MDQ0RFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKi9cclxuXHRzdGF0aWMgTUFYX1RPVEFMX0lURU1TID0gMjA7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHBsdWdpbjogTExNQWdlbnRQbHVnaW4pIHtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdFx0dGhpcy5zZXR1cEZpbGVXYXRjaGVyKCk7XHJcblx0XHQvLyBcdTA0MjFcdTA0M0JcdTA0NDNcdTA0NDhcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNBXHUwNDM4IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG5cdFx0dGhpcy5wbHVnaW4uZXZlbnRCdXMub24oJ3NldHRpbmdzLWNoYW5nZWQnLCB0aGlzLmNsZWFyQ2FjaGUuYmluZCh0aGlzKSk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEBwYXJhbSBxdWVyeSAtIFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcclxuXHQgKiBAcmV0dXJucyBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzBcclxuXHQgKi9cclxuXHRhc3luYyBnZXRGaWxlT3B0aW9ucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxBdXRvY29tcGxldGVJdGVtW10+IHtcclxuXHRcdGlmICghdGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5hYmxlRmlsZVJlZmVyZW5jZXMpIHtcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGF3YWl0IHRoaXMudXBkYXRlQ2FjaGVJZk5lZWRlZCgpO1xyXG5cclxuXHRcdGNvbnN0IGFsbEZpbGVzID0gdGhpcy5maWxlQ2FjaGUuZ2V0KCdhbGwnKSB8fCBbXTtcclxuXHJcblx0XHRpZiAoIXF1ZXJ5LnRyaW0oKSkge1xyXG5cdFx0XHRyZXR1cm4gYWxsRmlsZXMuc2xpY2UoMCwgQXV0b2NvbXBsZXRlTWFuYWdlci5NQVhfVE9UQUxfSVRFTVMpOyAvLyBcdTA0MUZcdTA0M0VcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDRCXHUwNDM1IDEwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMlxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGxvd2VyY2FzZVF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcclxuXHRcdHJldHVybiBhbGxGaWxlc1xyXG5cdFx0XHQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcmNhc2VRdWVyeSkgfHwgaXRlbS5wYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJjYXNlUXVlcnkpKVxyXG5cdFx0XHQuc2xpY2UoMCwgQXV0b2NvbXBsZXRlTWFuYWdlci5NQVhfVE9UQUxfSVRFTVMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEBwYXJhbSBxdWVyeSAtIFx1MDQzRlx1MDQzRVx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcclxuXHQgKiBAcmV0dXJucyBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzBcclxuXHQgKi9cclxuXHRhc3luYyBnZXRQcm9tcHRPcHRpb25zKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPEF1dG9jb21wbGV0ZUl0ZW1bXT4ge1xyXG5cdFx0aWYgKCF0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbmFibGVQcm9tcHRSZWZlcmVuY2VzKSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHJcblx0XHRhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlSWZOZWVkZWQoKTtcclxuXHJcblx0XHRjb25zdCBhbGxQcm9tcHRzID0gdGhpcy5wcm9tcHRDYWNoZS5nZXQoJ2FsbCcpIHx8IFtdO1xyXG5cclxuXHRcdGlmICghcXVlcnkudHJpbSgpKSB7XHJcblx0XHRcdHJldHVybiBhbGxQcm9tcHRzLnNsaWNlKDAsIEF1dG9jb21wbGV0ZU1hbmFnZXIuTUFYX1RPVEFMX0lURU1TKTtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBsb3dlcmNhc2VRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRyZXR1cm4gYWxsUHJvbXB0c1xyXG5cdFx0XHQuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcmNhc2VRdWVyeSkgfHwgaXRlbS5wYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJjYXNlUXVlcnkpKVxyXG5cdFx0XHQuc2xpY2UoMCwgQXV0b2NvbXBsZXRlTWFuYWdlci5NQVhfVE9UQUxfSVRFTVMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzNVx1MDQ0OCAoXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNBKVxyXG5cdCAqL1xyXG5cdGNsZWFyQ2FjaGUoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZpbGVDYWNoZS5jbGVhcigpO1xyXG5cdFx0dGhpcy5wcm9tcHRDYWNoZS5jbGVhcigpO1xyXG5cdFx0dGhpcy5sYXN0Q2FjaGVVcGRhdGUgPSAwO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDM1XHUwNDQ4LCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDNEIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzNVx1MDQzQlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlQ2FjaGVJZk5lZWRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XHJcblx0XHRpZiAobm93IC0gdGhpcy5sYXN0Q2FjaGVVcGRhdGUgPiB0aGlzLkNBQ0hFX1RUTCkge1xyXG5cdFx0XHRhd2FpdCB0aGlzLnVwZGF0ZUNhY2hlKCk7XHJcblx0XHRcdHRoaXMubGFzdENhY2hlVXBkYXRlID0gbm93O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzNVx1MDQ0OCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgdXBkYXRlQ2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHRjb25zdCBmaWxlcyA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRjb25zdCBmaWxlSXRlbXM6IEF1dG9jb21wbGV0ZUl0ZW1bXSA9IFtdO1xyXG5cdFx0Y29uc3QgcHJvbXB0SXRlbXM6IEF1dG9jb21wbGV0ZUl0ZW1bXSA9IFtdO1xyXG5cclxuXHRcdC8vIFx1MDQxRFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzRVx1MDQzQVxyXG5cdFx0Y29uc3Qgbm9ybWFsaXplZEV4Y2x1ZGVkRm9sZGVycyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLmV4Y2x1ZGVkRm9sZGVyc1xyXG5cdFx0XHQuZmlsdGVyKChmb2xkZXIpID0+IGZvbGRlci50cmltKCkgIT09ICcnKVxyXG5cdFx0XHQubWFwKChmb2xkZXIpID0+IChmb2xkZXIuZW5kc1dpdGgoJy8nKSA/IGZvbGRlciA6IGZvbGRlciArICcvJykpIC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzQVx1MDQzMFx1MDQzRFx1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDNCXHUwNDREXHUwNDQ4XHJcblx0XHRcdC5tYXAoKGZvbGRlcikgPT4gKGZvbGRlci5zdGFydHNXaXRoKCcvJykgPyBmb2xkZXIuc3Vic3RyaW5nKDEpIDogZm9sZGVyKSk7IC8vIFx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQxXHUwNDNCXHUwNDREXHUwNDQ4XHJcblxyXG5cdFx0Zm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDM4XHUwNDM3IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0VcdTA0M0FcclxuXHRcdFx0aWYgKHRoaXMuaXNGaWxlSW5FeGNsdWRlZEZvbGRlcihmaWxlLCBub3JtYWxpemVkRXhjbHVkZWRGb2xkZXJzKSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zdCBpdGVtOiBBdXRvY29tcGxldGVJdGVtID0ge1xyXG5cdFx0XHRcdG5hbWU6IGZpbGUuYmFzZW5hbWUsXHJcblx0XHRcdFx0cGF0aDogZmlsZS5wYXRoLFxyXG5cdFx0XHRcdHR5cGU6IHRoaXMuaXNQcm9tcHRGaWxlKGZpbGUpID8gJ3Byb21wdCcgOiAnZmlsZScsXHJcblx0XHRcdFx0aWNvbjogdGhpcy5nZXRGaWxlSWNvbihmaWxlKSxcclxuXHRcdFx0XHRmaWxlOiBmaWxlXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoaXRlbS50eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRcdHByb21wdEl0ZW1zLnB1c2goaXRlbSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZmlsZUl0ZW1zLnB1c2goaXRlbSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFxyXG5cdFx0ZmlsZUl0ZW1zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xyXG5cdFx0cHJvbXB0SXRlbXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XHJcblxyXG5cdFx0dGhpcy5maWxlQ2FjaGUuc2V0KCdhbGwnLCBmaWxlSXRlbXMpO1xyXG5cdFx0dGhpcy5wcm9tcHRDYWNoZS5zZXQoJ2FsbCcsIHByb21wdEl0ZW1zKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQ0MiwgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDNDXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc1Byb21wdEZpbGUoZmlsZTogVEZpbGUpOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IHByb21wdHNGb2xkZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy5wcm9tcHRzRm9sZGVyO1xyXG5cdFx0aWYgKCFwcm9tcHRzRm9sZGVyKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG5cdFx0Y29uc3Qgbm9ybWFsaXplZFByb21wdHNQYXRoID0gcHJvbXB0c0ZvbGRlci5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJyk7XHJcblxyXG5cdFx0cmV0dXJuIGZpbGUucGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRQcm9tcHRzUGF0aCArICcvJykgfHwgZmlsZS5wYXRoID09PSBub3JtYWxpemVkUHJvbXB0c1BhdGg7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzRVx1MDQ0MVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzNSBPYnNpZGlhbiBcdTA0MzhcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIGdldEZpbGVJY29uKGZpbGU6IFRGaWxlKTogc3RyaW5nIHtcclxuXHRcdGlmICh0aGlzLmlzUHJvbXB0RmlsZShmaWxlKSkge1xyXG5cdFx0XHRyZXR1cm4gJ3phcCc7IC8vIFx1MDQxOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzBcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQzIFx1MDQzRlx1MDQzRSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEVcclxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUuZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRzd2l0Y2ggKGV4dGVuc2lvbikge1xyXG5cdFx0XHRjYXNlICdtZCc6XHJcblx0XHRcdFx0cmV0dXJuICdmaWxlLXRleHQnO1xyXG5cdFx0XHRjYXNlICdqcyc6XHJcblx0XHRcdGNhc2UgJ3RzJzpcclxuXHRcdFx0XHRyZXR1cm4gJ2NvZGUnO1xyXG5cdFx0XHRjYXNlICdqc29uJzpcclxuXHRcdFx0XHRyZXR1cm4gJ2JyYWNrZXRzJztcclxuXHRcdFx0Y2FzZSAnY3NzJzpcclxuXHRcdFx0XHRyZXR1cm4gJ3BhbGV0dGUnO1xyXG5cdFx0XHRjYXNlICdwbmcnOlxyXG5cdFx0XHRjYXNlICdqcGcnOlxyXG5cdFx0XHRjYXNlICdqcGVnJzpcclxuXHRcdFx0Y2FzZSAnZ2lmJzpcclxuXHRcdFx0XHRyZXR1cm4gJ2ltYWdlJztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm4gJ2ZpbGUnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzhcdTA0MzdcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDMwXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXR1cEZpbGVXYXRjaGVyKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5wbHVnaW4ucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5wbHVnaW4uYXBwLnZhdWx0Lm9uKCdjcmVhdGUnLCAoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jbGVhckNhY2hlKCk7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMucGx1Z2luLnJlZ2lzdGVyRXZlbnQoXHJcblx0XHRcdHRoaXMucGx1Z2luLmFwcC52YXVsdC5vbignZGVsZXRlJywgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuY2xlYXJDYWNoZSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnBsdWdpbi5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHR0aGlzLnBsdWdpbi5hcHAudmF1bHQub24oJ3JlbmFtZScsICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmNsZWFyQ2FjaGUoKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0NDIsIFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0JcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzMiBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDM4XHUwNDM3IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0VcdTA0M0EuXHJcblx0ICogQHBhcmFtIGZpbGUgLSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgT2JzaWRpYW4uXHJcblx0ICogQHBhcmFtIGV4Y2x1ZGVkRm9sZGVycyAtIFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0M0RcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM1XHUwNDM5IFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0VcdTA0M0EuXHJcblx0ICogQHJldHVybnMgdHJ1ZSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0RcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDMyIFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc0ZpbGVJbkV4Y2x1ZGVkRm9sZGVyKGZpbGU6IFRGaWxlLCBleGNsdWRlZEZvbGRlcnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBmaWxlUGF0aCA9IGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpOyAvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cclxuXHRcdGZvciAoY29uc3QgZm9sZGVyIG9mIGV4Y2x1ZGVkRm9sZGVycykge1xyXG5cdFx0XHRjb25zdCBub3JtYWxpemVkRm9sZGVyID0gZm9sZGVyLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwIFx1MDQ0MSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0MzggXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOFxyXG5cdFx0XHQvLyBcdTA0MThcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0RcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDRGXHUwNDNDXHUwNDNFIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0M0RcdTA0MzUgXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOCAoXHUwNDNELlx1MDQzRi4gXCJmb2xkZXIvZmlsZS5tZFwiKVxyXG5cdFx0XHRpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkRm9sZGVyKSkge1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRhc3luYyBoYW5kbGVFeHRlcm5hbEZpbGVTZWxlY3Rpb24oKTogUHJvbWlzZTxBdXRvY29tcGxldGVJdGVtIHwgbnVsbD4ge1xyXG5cdFx0aWYgKCF3aW5kb3cuZWxlY3Ryb24pIHtcclxuXHRcdFx0bmV3IE5vdGljZSgnXHUwNDEyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDM1XHUwNDNEIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzIgZGVza3RvcC1cdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzgnLCAzMDAwKTtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgd2luZG93LmVsZWN0cm9uLnJlbW90ZS5kaWFsb2cuc2hvd09wZW5EaWFsb2coe1xyXG5cdFx0XHRcdHByb3BlcnRpZXM6IFsnb3BlbkZpbGUnXSxcclxuXHRcdFx0XHR0aXRsZTogJ1x1MDQxMlx1MDQ0Qlx1MDQzMVx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQVx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RidcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAocmVzdWx0LmNhbmNlbGVkIHx8ICFyZXN1bHQuZmlsZVBhdGhzIHx8IHJlc3VsdC5maWxlUGF0aHMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnN0IGZpbGVQYXRoID0gcmVzdWx0LmZpbGVQYXRoc1swXTtcclxuXHRcdFx0Y29uc3QgcGF0aCA9IHdpbmRvdy5yZXF1aXJlKCdwYXRoJyk7XHJcblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCk7XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdG5hbWU6IGZpbGVOYW1lLFxyXG5cdFx0XHRcdHBhdGg6IGZpbGVQYXRoLFxyXG5cdFx0XHRcdHR5cGU6ICdleHRlcm5hbCcsXHJcblx0XHRcdFx0aWNvbjogJ3BhcGVyY2xpcCdcclxuXHRcdFx0fTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMDonLCBlcnJvcik7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQxQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzRVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS4gXHUwNDFGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0Qlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuICogXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzNSBAL0BAIFx1MDQzOCAjLyMjIFx1MDQ0MSBcdTA0NDNcdTA0M0NcdTA0M0RcdTA0NEJcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDNFXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlSXRlbSwgQXV0b2NvbXBsZXRlTWFuYWdlciB9IGZyb20gJy4vQXV0b2NvbXBsZXRlTWFuYWdlcic7XHJcbmltcG9ydCB7IFJlZmVyZW5jZU1hdGNoIH0gZnJvbSAnLi9SZWZlcmVuY2VQYXJzZXInO1xyXG5pbXBvcnQgeyBzZXRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIEF1dG9jb21wbGV0ZSBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQXV0b2NvbXBsZXRlIHtcclxuXHRwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcblx0cHJpdmF0ZSBkcm9wZG93bjogSFRNTEVsZW1lbnQ7XHJcblx0cHJpdmF0ZSBpbnB1dEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgYXV0b2NvbXBsZXRlTWFuYWdlcjogQXV0b2NvbXBsZXRlTWFuYWdlcjtcclxuXHRwcml2YXRlIGN1cnJlbnRSZWZlcmVuY2U6IFJlZmVyZW5jZU1hdGNoIHwgbnVsbCA9IG51bGw7XHJcblx0cHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gMDtcclxuXHRwcml2YXRlIGN1cnJlbnRPcHRpb25zOiBBdXRvY29tcGxldGVJdGVtW10gPSBbXTtcclxuXHRwcml2YXRlIG9uSXRlbVNlbGVjdGVkQ2FsbGJhY2s/OiAoaXRlbTogQXV0b2NvbXBsZXRlSXRlbSwgbWF0Y2g6IFJlZmVyZW5jZU1hdGNoKSA9PiB2b2lkO1xyXG5cdHByaXZhdGUgbW91c2VJc092ZXJEcm9wZG93biA9IGZhbHNlOyAvLyBcdTA0MjRcdTA0M0JcdTA0MzBcdTA0MzMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNDXHUwNDRCXHUwNDQ4XHUwNDM4XHJcblxyXG5cdGNvbnN0cnVjdG9yKGlucHV0RWxlbWVudDogSFRNTEVsZW1lbnQsIGF1dG9jb21wbGV0ZU1hbmFnZXI6IEF1dG9jb21wbGV0ZU1hbmFnZXIpIHtcclxuXHRcdHRoaXMuaW5wdXRFbGVtZW50ID0gaW5wdXRFbGVtZW50O1xyXG5cdFx0dGhpcy5hdXRvY29tcGxldGVNYW5hZ2VyID0gYXV0b2NvbXBsZXRlTWFuYWdlcjtcclxuXHRcdHRoaXMuY29udGFpbmVyID0gdGhpcy5pbnB1dEVsZW1lbnQuY2xvc2VzdCgnLmNoYXQtaW5wdXQtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG5cdFx0dGhpcy5jcmVhdGVEcm9wZG93bigpO1xyXG5cdFx0dGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0MiBcdTA0NDEgXHUwNDNFXHUwNDNGXHUwNDQ2XHUwNDM4XHUwNDRGXHUwNDNDXHUwNDM4LlxyXG5cdCAqIEBwYXJhbSByZWZlcmVuY2UgLSBcdTA0M0VcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIgUmVmZXJlbmNlTWF0Y2gsIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDXHUwNDRCXHUwNDM5IFx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQ0MS5cclxuXHQgKiBAcGFyYW0gY3Vyc29yUmVjdCAtIERPTVJlY3QgXHUwNDNFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDMwIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMCwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzguXHJcblx0ICovXHJcblx0YXN5bmMgc2hvd0F1dG9jb21wbGV0ZShyZWZlcmVuY2U6IFJlZmVyZW5jZU1hdGNoLCBjdXJzb3JSZWN0OiBET01SZWN0KTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLmN1cnJlbnRSZWZlcmVuY2UgPSByZWZlcmVuY2U7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgKCQsICEkKSBcdTA0NDFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDMgXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzOFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQzM1xyXG5cdFx0aWYgKHJlZmVyZW5jZS50eXBlID09PSAnZXh0ZXJuYWwnKSB7XHJcblx0XHRcdGNvbnN0IHNlbGVjdGVkRmlsZSA9IGF3YWl0IHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlci5oYW5kbGVFeHRlcm5hbEZpbGVTZWxlY3Rpb24oKTtcclxuXHRcdFx0aWYgKHNlbGVjdGVkRmlsZSAmJiB0aGlzLm9uSXRlbVNlbGVjdGVkQ2FsbGJhY2spIHtcclxuXHRcdFx0XHR0aGlzLm9uSXRlbVNlbGVjdGVkQ2FsbGJhY2soc2VsZWN0ZWRGaWxlLCByZWZlcmVuY2UpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NENcdTA0NDhcdTA0MzVcclxuXHRcdGNvbnN0IG9wdGlvbnMgPVxyXG5cdFx0XHRyZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnXHJcblx0XHRcdFx0PyBhd2FpdCB0aGlzLmF1dG9jb21wbGV0ZU1hbmFnZXIuZ2V0RmlsZU9wdGlvbnMocmVmZXJlbmNlLm5hbWUpXHJcblx0XHRcdFx0OiBhd2FpdCB0aGlzLmF1dG9jb21wbGV0ZU1hbmFnZXIuZ2V0UHJvbXB0T3B0aW9ucyhyZWZlcmVuY2UubmFtZSk7XHJcblxyXG5cdFx0aWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMuaGlkZUF1dG9jb21wbGV0ZSgpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50T3B0aW9ucyA9IG9wdGlvbnM7XHJcblx0XHRpZiAodGhpcy5zZWxlY3RlZEluZGV4ID49IHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcblx0XHR9XHJcblx0XHR0aGlzLnJlbmRlck9wdGlvbnMoKTtcclxuXHRcdHRoaXMucG9zaXRpb25Ecm9wZG93bihjdXJzb3JSZWN0KTtcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHJcblx0ICovXHJcblx0aGlkZUF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdHRoaXMuY3VycmVudFJlZmVyZW5jZSA9IG51bGw7XHJcblx0XHR0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XHJcblx0XHR0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0RiBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzM1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBldmVudCAtIFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0M0JcdTA0MzBcdTA0MzJcdTA0MzhcdTA0MzBcdTA0NDJcdTA0NDNcdTA0NDBcdTA0NEJcclxuXHQgKiBAcmV0dXJucyB0cnVlIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzFcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDRCXHUwNDNCXHUwNDNFIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVxyXG5cdCAqL1xyXG5cdGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcclxuXHRcdC8vIFx1MDQxQ1x1MDQ0QiBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDM4IEVudGVyIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0MVx1MDQ0QyBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0MiBcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzhcdTA0M0NcclxuXHRcdGlmICghdGhpcy5pc1Zpc2libGUoKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0Y2FzZSAnQXJyb3dEb3duJzpcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBcdTA0MUZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDJcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDNBXHUwNDQzIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0QlxyXG5cdFx0XHRcdHRoaXMubW92ZVNlbGVjdGlvbigxKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdGNhc2UgJ0Fycm93VXAnOlxyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDBcdTA0NDNcdTA0NDJcdTA0M0FcdTA0NDMgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCXHJcblx0XHRcdFx0dGhpcy5tb3ZlU2VsZWN0aW9uKC0xKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdGNhc2UgJ0VudGVyJzpcclxuXHRcdFx0Y2FzZSAnVGFiJzpcclxuXHRcdFx0XHQvLyBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzBcdTA0MzVcdTA0M0MgVGFiIFx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0OFx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0M0JcdTA0MzhcdTA0NDJcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0Q3VycmVudEl0ZW0oKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdGNhc2UgJ0VzY2FwZSc6XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHR0aGlzLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzQlx1MDQzMVx1MDQzNVx1MDQzQSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEBwYXJhbSBjYWxsYmFjayAtIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHJcblx0ICovXHJcblx0b25JdGVtU2VsZWN0ZWQoY2FsbGJhY2s6IChpdGVtOiBBdXRvY29tcGxldGVJdGVtLCBtYXRjaDogUmVmZXJlbmNlTWF0Y2gpID0+IHZvaWQpOiB2b2lkIHtcclxuXHRcdHRoaXMub25JdGVtU2VsZWN0ZWRDYWxsYmFjayA9IGNhbGxiYWNrO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyLCBcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzVcdTA0M0QgXHUwNDNCXHUwNDM4IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0MlxyXG5cdCAqIEByZXR1cm5zIHRydWUgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQzOFx1MDQzNFx1MDQzNVx1MDQzRFxyXG5cdCAqL1xyXG5cdGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jayc7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMyXHUwNDRCXHUwNDNGXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDRFXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY3JlYXRlRHJvcGRvd24oKTogdm9pZCB7XHJcblx0XHR0aGlzLmRyb3Bkb3duID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLmRyb3Bkb3duLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2UtYXV0b2NvbXBsZXRlJztcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgZHJvcGRvd24gXHUwNDMyIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFxyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpOiB2b2lkIHtcclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDM1IFx1MDQzMlx1MDQzRFx1MDQzNSBkcm9wZG93blxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRpZiAoIXRoaXMuZHJvcGRvd24uY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkgJiYgIXRoaXMuaW5wdXRFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XHJcblx0XHRcdFx0dGhpcy5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFx1MDQxRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNDXHUwNDRCXHUwNDQ4XHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDJcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQzRSBibHVyXHJcblx0XHR0aGlzLmRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMubW91c2VJc092ZXJEcm9wZG93biA9IHRydWU7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcclxuXHRcdFx0dGhpcy5tb3VzZUlzT3ZlckRyb3Bkb3duID0gZmFsc2U7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQ0Mlx1MDQzNVx1MDQ0MFx1MDQzNSBcdTA0NDRcdTA0M0VcdTA0M0FcdTA0NDNcdTA0NDFcdTA0MzAgaW5wdXQgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNFXHUwNDNDLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNDXHUwNDRCXHUwNDQ4XHUwNDRDIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzQgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDNFXHUwNDNDXHJcblx0XHR0aGlzLmlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQ0MyBcdTA0M0RcdTA0MzAgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRFx1MDQzMCBcdTA0NDFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NENcclxuXHRcdFx0aWYgKCF0aGlzLm1vdXNlSXNPdmVyRHJvcGRvd24pIHtcclxuXHRcdFx0XHR0aGlzLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDJcdTA0NDBcdTA0MzhcdTA0NDFcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNFXHUwNDNGXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBkcm9wZG93blxyXG5cdCAqL1xyXG5cdHByaXZhdGUgcmVuZGVyT3B0aW9ucygpOiB2b2lkIHtcclxuXHRcdHRoaXMuZHJvcGRvd24uaW5uZXJIVE1MID0gJyc7XHJcblxyXG5cdFx0dGhpcy5jdXJyZW50T3B0aW9ucy5mb3JFYWNoKChvcHRpb24sIGluZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IG9wdGlvbkVsZW1lbnQgPSB0aGlzLmNyZWF0ZU9wdGlvbkVsZW1lbnQob3B0aW9uLCBpbmRleCA9PT0gdGhpcy5zZWxlY3RlZEluZGV4KTtcclxuXHRcdFx0dGhpcy5kcm9wZG93bi5hcHBlbmRDaGlsZChvcHRpb25FbGVtZW50KTtcclxuXHRcdH0pO1xyXG5cdFx0dGhpcy5zY3JvbGxUb1NlbGVjdGVkKCk7IC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNlx1MDQzNFx1MDQzMFx1MDQzNVx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDM1XHUwNDNEXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzRVx1MDQzRlx1MDQ0Nlx1MDQzOFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBvcHRpb24gLSBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdCAqIEBwYXJhbSBpc1NlbGVjdGVkIC0gXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDMwIFx1MDQzQlx1MDQzOCBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0NEZcclxuXHQgKiBAcmV0dXJucyBIVE1MIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0MiBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0MzhcclxuXHQgKi9cclxuXHRwcml2YXRlIGNyZWF0ZU9wdGlvbkVsZW1lbnQob3B0aW9uOiBBdXRvY29tcGxldGVJdGVtLCBpc1NlbGVjdGVkOiBib29sZWFuKTogSFRNTEVsZW1lbnQge1xyXG5cdFx0Y29uc3Qgb3B0aW9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRvcHRpb25EaXYuY2xhc3NOYW1lID0gYHJlZmVyZW5jZS1vcHRpb24gJHtpc1NlbGVjdGVkID8gJ3NlbGVjdGVkJyA6ICcnfWA7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwXHJcblx0XHRjb25zdCBpY29uU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdGljb25TcGFuLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2Utb3B0aW9uLWljb24nO1xyXG5cdFx0c2V0SWNvbihpY29uU3Bhbiwgb3B0aW9uLmljb24pO1xyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHRcdGNvbnN0IG5hbWVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0bmFtZVNwYW4uY2xhc3NOYW1lID0gJ3JlZmVyZW5jZS1vcHRpb24tbmFtZSc7XHJcblx0XHRuYW1lU3Bhbi50ZXh0Q29udGVudCA9IG9wdGlvbi5uYW1lO1xyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDQzXHJcblx0XHRjb25zdCBwYXRoU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdHBhdGhTcGFuLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2Utb3B0aW9uLXBhdGgnO1xyXG5cdFx0cGF0aFNwYW4udGV4dENvbnRlbnQgPSBvcHRpb24ucGF0aDtcclxuXHJcblx0XHRvcHRpb25EaXYuYXBwZW5kQ2hpbGQoaWNvblNwYW4pO1xyXG5cdFx0b3B0aW9uRGl2LmFwcGVuZENoaWxkKG5hbWVTcGFuKTtcclxuXHRcdG9wdGlvbkRpdi5hcHBlbmRDaGlsZChwYXRoU3Bhbik7XHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDQ3XHUwNDM4XHUwNDNBIFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQzQVx1MDQzMFxyXG5cdFx0b3B0aW9uRGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBvcHRpb25EaXY7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgZHJvcGRvd24gXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMFxyXG5cdCAqIEBwYXJhbSBjdXJzb3JSZWN0IC0gRE9NUmVjdCBcdTA0M0VcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDJcdTA0MzAgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzOC5cclxuXHQgKi9cclxuXHRwcml2YXRlIHBvc2l0aW9uRHJvcGRvd24oY3Vyc29yUmVjdDogRE9NUmVjdCk6IHZvaWQge1xyXG5cdFx0Ly8gXHUwNDI3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCLCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgZGlzcGxheTogJ2Jsb2NrJ1xyXG5cdFx0dGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuXHJcblx0XHRjb25zdCBpbnB1dFJlY3QgPSB0aGlzLmlucHV0RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdGNvbnN0IGRyb3Bkb3duUmVjdCA9IHRoaXMuZHJvcGRvd24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0NcdTA0MzVcdTA0NDBcdTA0NEIgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDMwXHJcblx0XHRjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFIGlucHV0RWxlbWVudCwgXHUwNDQyLlx1MDQzQS4gXHUwNDNFXHUwNDNEIFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDM1IFx1MDQzNFx1MDQzRVx1MDQzQVx1MDQ0M1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFxyXG5cdFx0Ly8gXHUwNDFCXHUwNDM1XHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzOSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNGXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MSBcdTA0M0JcdTA0MzVcdTA0MzJcdTA0NEJcdTA0M0MgXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMFxyXG5cdFx0bGV0IGxlZnQgPSBjdXJzb3JSZWN0LmxlZnQgLSBjb250YWluZXJSZWN0LmxlZnQ7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDM1XHUwNDQ0XHUwNDNFXHUwNDNCXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSAtIFx1MDQzRlx1MDQzRVx1MDQzNCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0M0VcdTA0M0NcclxuXHRcdGxldCB0b3AgPSBjdXJzb3JSZWN0LmJvdHRvbSAtIGNvbnRhaW5lclJlY3QudG9wICsgNTsgLy8gKzVweCBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0M0JcdTA0MzggXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFIFx1MDQ0MVx1MDQzRFx1MDQzOFx1MDQzN1x1MDQ0M1xyXG5cdFx0Y29uc3Qgc3BhY2VCZWxvdyA9IHZpZXdwb3J0SGVpZ2h0IC0gY3Vyc29yUmVjdC5ib3R0b207XHJcblx0XHRjb25zdCBzcGFjZUFib3ZlID0gY3Vyc29yUmVjdC50b3A7XHJcblxyXG5cdFx0aWYgKHNwYWNlQmVsb3cgPCBkcm9wZG93blJlY3QuaGVpZ2h0ICsgMTAgJiYgc3BhY2VBYm92ZSA+IGRyb3Bkb3duUmVjdC5oZWlnaHQgKyAxMCkge1xyXG5cdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQxXHUwNDNEXHUwNDM4XHUwNDM3XHUwNDQzIFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQzRSBcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0MyBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0RcdTA0M0UsIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0NDNcclxuXHRcdFx0dG9wID0gY3Vyc29yUmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCAtIGRyb3Bkb3duUmVjdC5oZWlnaHQgLSA1OyAvLyAtNXB4IFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRCBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzN1x1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDZcdTA0NEIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFxyXG5cdFx0Y29uc3QgbWF4UmlnaHQgPSBpbnB1dFJlY3QucmlnaHQgLSBjb250YWluZXJSZWN0LmxlZnQ7XHJcblx0XHRpZiAobGVmdCArIGRyb3Bkb3duUmVjdC53aWR0aCA+IG1heFJpZ2h0KSB7XHJcblx0XHRcdGxlZnQgPSBtYXhSaWdodCAtIGRyb3Bkb3duUmVjdC53aWR0aDtcclxuXHRcdFx0aWYgKGxlZnQgPCAwKSBsZWZ0ID0gMDsgLy8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRCBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwLCBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0MzZcdTA0MzhcdTA0M0NcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBIFx1MDQzQlx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0M0FcdTA0NDBcdTA0MzBcdTA0NEVcclxuXHRcdH1cclxuXHRcdC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRCBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzN1x1MDQzMCBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NDZcdTA0NEIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwIFx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzMlx1MDQzMFxyXG5cdFx0aWYgKGxlZnQgPCAwKSB7XHJcblx0XHRcdGxlZnQgPSAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xyXG5cdFx0Ly8gXHUwNDIzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQ0MyBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0RcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzNSBpbnB1dEVsZW1lbnQsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0VcdTA0M0QgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDQ4XHUwNDM1XHJcblx0XHQvLyBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQyXHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQyIFx1MDQ0MVx1MDQzQlx1MDQzOFx1MDQ0OFx1MDQzQVx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNELCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0M0VcdTA0MzVcclxuXHRcdHRoaXMuZHJvcGRvd24uc3R5bGUubWluV2lkdGggPSBgJHtpbnB1dFJlY3Qud2lkdGggLyAyfXB4YDsgLy8gXHUwNDFDXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDNDXHUwNDQzXHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzOFx1MDQzRFx1MDQzMCBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NEIgXHUwNDM4XHUwNDNEXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDMwXHJcblx0XHR0aGlzLmRyb3Bkb3duLnN0eWxlLndpZHRoID0gJ2F1dG8nOyAvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDQzIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDMsIFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRDXHUwNDQ4XHUwNDM1IG1pbldpZHRoXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzMiBcdTA0NDFcdTA0M0ZcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzVcclxuXHQgKiBAcGFyYW0gZGlyZWN0aW9uIC0gXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1ICgxID0gXHUwNDMyXHUwNDNEXHUwNDM4XHUwNDM3LCAtMSA9IFx1MDQzMlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NSlcclxuXHQgKi9cclxuXHRwcml2YXRlIG1vdmVTZWxlY3Rpb24oZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRJbmRleCArPSBkaXJlY3Rpb247XHJcblxyXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA8IDApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGggLSAxO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPj0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGgpIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnJlbmRlck9wdGlvbnMoKTtcclxuXHRcdHRoaXMuc2Nyb2xsVG9TZWxlY3RlZCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0M0EgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDNDXHUwNDQzIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0M1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsVG9TZWxlY3RlZCgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHRoaXMuZHJvcGRvd24ucXVlcnlTZWxlY3RvcignLnJlZmVyZW5jZS1vcHRpb24uc2VsZWN0ZWQnKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGlmIChzZWxlY3RlZEVsZW1lbnQpIHtcclxuXHRcdFx0c2VsZWN0ZWRFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxMlx1MDQ0Qlx1MDQzMVx1MDQzOFx1MDQ0MFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWxlY3RDdXJyZW50SXRlbSgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkSW5kZXggPCB0aGlzLmN1cnJlbnRPcHRpb25zLmxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0odGhpcy5jdXJyZW50T3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxMlx1MDQ0Qlx1MDQzMVx1MDQzOFx1MDQ0MFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHJcblx0ICogQHBhcmFtIGl0ZW0gLSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0NDBcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZWxlY3RJdGVtKGl0ZW06IEF1dG9jb21wbGV0ZUl0ZW0pOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLm9uSXRlbVNlbGVjdGVkQ2FsbGJhY2sgJiYgdGhpcy5jdXJyZW50UmVmZXJlbmNlKSB7XHJcblx0XHRcdHRoaXMub25JdGVtU2VsZWN0ZWRDYWxsYmFjayhpdGVtLCB0aGlzLmN1cnJlbnRSZWZlcmVuY2UpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDdcdTA0MzhcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQwXHUwNDM1XHUwNDQxXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDRCXHJcblx0ICovXHJcblx0ZGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmRyb3Bkb3duLnBhcmVudE5vZGUpIHtcclxuXHRcdFx0dGhpcy5kcm9wZG93bi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24pO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQyMFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDRCLCBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0NEYgXHUwNDM4XHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzQyBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzQgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDNFXHUwNDM5IFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDAuXHJcbiAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDM1IChALyMpLCBcdTA0NDJcdTA0MzBcdTA0M0EgXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSAoQEAvIyMpIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOC5cclxuICovXHJcblxyXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBGaWxlUmVmZXJlbmNlLCBSZWZlcmVuY2VQYXJzZXIgfSBmcm9tICcuL1JlZmVyZW5jZVBhcnNlcic7XHJcbmltcG9ydCB7IFRlbXBsYXRlRW5naW5lIH0gZnJvbSAnLi9UZW1wbGF0ZUVuZ2luZSc7XHJcbmltcG9ydCB7IEF0dGFjaG1lbnQsIENoYXRIaXN0b3J5SXRlbSB9IGZyb20gJ3NyYy9jb21wb25lbnRzL21vZGVscy9DaGF0SGlzdG9yeUl0ZW0nO1xyXG5pbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tICcuL0NhY2hlTWFuYWdlcic7XHJcbmltcG9ydCB7IGdldE1pbWVUeXBlIH0gZnJvbSAnc3JjL3V0aWxzL2ZpbGVVdGlscyc7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgRXhwYW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlRXhwYW5kZXIge1xyXG5cdHByaXZhdGUgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHRwcml2YXRlIHRlbXBsYXRlRW5naW5lOiBUZW1wbGF0ZUVuZ2luZTtcclxuXHRwcml2YXRlIGNhY2hlTWFuYWdlcjogQ2FjaGVNYW5hZ2VyO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihwbHVnaW46IExMTUFnZW50UGx1Z2luLCB0ZW1wbGF0ZUVuZ2luZTogVGVtcGxhdGVFbmdpbmUpIHtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdFx0dGhpcy50ZW1wbGF0ZUVuZ2luZSA9IHRlbXBsYXRlRW5naW5lO1xyXG5cdFx0dGhpcy5jYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKHBsdWdpbik7XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgKFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNCBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MClcclxuXHQgKiBAcGFyYW0gdGV4dCAtIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4XHJcblx0ICogQHBhcmFtIHJlZmVyZW5jZXMgLSBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzhcclxuXHQgKiBAcmV0dXJucyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzBcdTA0M0NcdTA0MzhcclxuXHQgKi9cclxuXHRhc3luYyBleHBhbmRSZWZlcmVuY2VzKHRleHQ6IHN0cmluZywgcmVmZXJlbmNlczogRmlsZVJlZmVyZW5jZVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHRcdGlmIChyZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dDtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZXhwYW5kZWRUZXh0ID0gdGV4dDtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRVx1MDQ0MiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzAgXHUwNDNBIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQ0MywgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQzRFx1MDQzNSBcdTA0NDFcdTA0MzFcdTA0MzhcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDM4XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDNBXHUwNDQxXHUwNDRCXHJcblx0XHRjb25zdCBzb3J0ZWRSZWZlcmVuY2VzID0gWy4uLnJlZmVyZW5jZXNdLnNvcnQoKGEsIGIpID0+IHtcclxuXHRcdFx0Y29uc3QgYU1hdGNoZXMgPSBSZWZlcmVuY2VQYXJzZXIucGFyc2VSZWZlcmVuY2VzKHRleHQpLmZpbHRlcigobSkgPT4gbS5uYW1lID09PSBhLm5hbWUpO1xyXG5cdFx0XHRjb25zdCBiTWF0Y2hlcyA9IFJlZmVyZW5jZVBhcnNlci5wYXJzZVJlZmVyZW5jZXModGV4dCkuZmlsdGVyKChtKSA9PiBtLm5hbWUgPT09IGIubmFtZSk7XHJcblx0XHRcdGNvbnN0IGFJbmRleCA9IGFNYXRjaGVzLmxlbmd0aCA+IDAgPyBhTWF0Y2hlc1thTWF0Y2hlcy5sZW5ndGggLSAxXS5zdGFydEluZGV4IDogMDtcclxuXHRcdFx0Y29uc3QgYkluZGV4ID0gYk1hdGNoZXMubGVuZ3RoID4gMCA/IGJNYXRjaGVzW2JNYXRjaGVzLmxlbmd0aCAtIDFdLnN0YXJ0SW5kZXggOiAwO1xyXG5cdFx0XHRyZXR1cm4gYkluZGV4IC0gYUluZGV4O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Zm9yIChjb25zdCByZWZlcmVuY2Ugb2Ygc29ydGVkUmVmZXJlbmNlcykge1xyXG5cdFx0XHRleHBhbmRlZFRleHQgPSBhd2FpdCB0aGlzLmV4cGFuZFNpbmdsZVJlZmVyZW5jZShleHBhbmRlZFRleHQsIHJlZmVyZW5jZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4cGFuZGVkVGV4dDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NEUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5LCBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCAoQEAvIyMpXHJcblx0ICogQHBhcmFtIG1lc3NhZ2VzIC0gXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVxyXG5cdCAqIEByZXR1cm5zIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHQgKi9cclxuXHRhc3luYyBleHBhbmRNZXNzYWdlSGlzdG9yeShtZXNzYWdlczogYW55W10pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRjb25zdCBleHBhbmRlZE1lc3NhZ2VzID0gW107XHJcblxyXG5cdFx0Zm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XHJcblx0XHRcdGlmIChtZXNzYWdlLnJvbGUgPT09ICd1c2VyJykge1xyXG5cdFx0XHRcdGNvbnN0IGV4cGFuZGVkQ29udGVudCA9IGF3YWl0IHRoaXMuZXhwYW5kUGVybWFuZW50UmVmZXJlbmNlcyhtZXNzYWdlLmNvbnRlbnQpO1xyXG5cdFx0XHRcdGV4cGFuZGVkTWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHQuLi5tZXNzYWdlLFxyXG5cdFx0XHRcdFx0Y29udGVudDogZXhwYW5kZWRDb250ZW50XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZXhwYW5kZWRNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4cGFuZGVkTWVzc2FnZXM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MThcdTA0MzdcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0FcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzOFx1MDQzNyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzAgXHUwNDM4IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEJcclxuXHQgKi9cclxuXHRhc3luYyBleHRyYWN0QXR0YWNobWVudHMoXHJcblx0XHR0ZXh0OiBzdHJpbmcsXHJcblx0XHRyZWZlcmVuY2VzOiBGaWxlUmVmZXJlbmNlW11cclxuXHQpOiBQcm9taXNlPHtcclxuXHRcdG9yaWdpbmFsVGV4dDogc3RyaW5nO1xyXG5cdFx0YXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXTtcclxuXHR9PiB7XHJcblx0XHRjb25zdCBhdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XHJcblxyXG5cdFx0Zm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGxldCBjYWNoZWRQYXRoOiBzdHJpbmc7XHJcblx0XHRcdFx0bGV0IHV1aWQ6IHN0cmluZztcclxuXHRcdFx0XHRsZXQgbWltZVR5cGU6IHN0cmluZztcclxuXHRcdFx0XHRsZXQgc291cmNlUGF0aDogc3RyaW5nO1xyXG5cclxuXHRcdFx0XHRpZiAocmVmZXJlbmNlLnR5cGUgPT09ICdleHRlcm5hbCcpIHtcclxuXHRcdFx0XHRcdC8vIFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHJcblx0XHRcdFx0XHRjb25zdCBjYWNoZVJlc3VsdCA9IGF3YWl0IHRoaXMuY2FjaGVNYW5hZ2VyLmNhY2hlRXh0ZXJuYWxGaWxlKHJlZmVyZW5jZS5wYXRoKTtcclxuXHRcdFx0XHRcdGNhY2hlZFBhdGggPSBjYWNoZVJlc3VsdC5jYWNoZWRQYXRoO1xyXG5cdFx0XHRcdFx0dXVpZCA9IGNhY2hlUmVzdWx0LnV1aWQ7XHJcblx0XHRcdFx0XHRtaW1lVHlwZSA9IGNhY2hlUmVzdWx0Lm1pbWVUeXBlO1xyXG5cdFx0XHRcdFx0c291cmNlUGF0aCA9IHJlZmVyZW5jZS5wYXRoOyAvLyBcdTA0MTBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzlcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZmVyZW5jZS50eXBlID09PSAnZmlsZScpIHtcclxuXHRcdFx0XHRcdC8vIFx1MDQxOFx1MDQxN1x1MDQxQ1x1MDQxNVx1MDQxRFx1MDQxNVx1MDQxRFx1MDQxRTogXHUwNDFBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0MzhcdTA0MzcgdmF1bHRcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHJlZmVyZW5jZS5wYXRoKTtcclxuXHRcdFx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgY2FjaGVSZXN1bHQgPSBhd2FpdCB0aGlzLmNhY2hlTWFuYWdlci5jYWNoZVZhdWx0RmlsZShmaWxlKTtcclxuXHRcdFx0XHRcdFx0Y2FjaGVkUGF0aCA9IGNhY2hlUmVzdWx0LmNhY2hlZFBhdGg7XHJcblx0XHRcdFx0XHRcdHV1aWQgPSBjYWNoZVJlc3VsdC51dWlkO1xyXG5cdFx0XHRcdFx0XHRtaW1lVHlwZSA9IGdldE1pbWVUeXBlKGZpbGUubmFtZSk7XHJcblx0XHRcdFx0XHRcdHNvdXJjZVBhdGggPSBmaWxlLnBhdGg7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKGBcdTA0MjRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCBcdTA0MzIgdmF1bHQ6ICR7cmVmZXJlbmNlLnBhdGh9YCk7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBwcm9tcHRcclxuXHRcdFx0XHRcdC8vIFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHJlZmVyZW5jZS5wYXRoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGNhY2hlUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZU1hbmFnZXIuY2FjaGVWYXVsdEZpbGUoZmlsZSk7XHJcblx0XHRcdFx0XHRcdGNhY2hlZFBhdGggPSBjYWNoZVJlc3VsdC5jYWNoZWRQYXRoO1xyXG5cdFx0XHRcdFx0XHR1dWlkID0gY2FjaGVSZXN1bHQudXVpZDtcclxuXHRcdFx0XHRcdFx0bWltZVR5cGUgPSAndGV4dC9tYXJrZG93bic7XHJcblx0XHRcdFx0XHRcdHNvdXJjZVBhdGggPSBmaWxlLnBhdGg7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0VcdTA0NDIgcHJvbXB0c0ZvbGRlclxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKGBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRDogJHtyZWZlcmVuY2UucGF0aH1gKTtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRhdHRhY2htZW50cy5wdXNoKHtcclxuXHRcdFx0XHRcdHR5cGU6IHJlZmVyZW5jZS50eXBlLFxyXG5cdFx0XHRcdFx0bmFtZTogcmVmZXJlbmNlLm5hbWUsXHJcblx0XHRcdFx0XHRzb3VyY2VQYXRoOiBzb3VyY2VQYXRoLFxyXG5cdFx0XHRcdFx0Y2FjaGVkUGF0aDogY2FjaGVkUGF0aCxcclxuXHRcdFx0XHRcdHV1aWQ6IHV1aWQsXHJcblx0XHRcdFx0XHRwZXJtYW5lbnQ6IHJlZmVyZW5jZS5wZXJtYW5lbnQsXHJcblx0XHRcdFx0XHRtaW1lVHlwZTogbWltZVR5cGVcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyAke3JlZmVyZW5jZS5uYW1lfTpgLCBlcnJvcik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRvcmlnaW5hbFRleHQ6IHRleHQsXHJcblx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50c1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzM1x1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIExMTSBcdTA0NDEgXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOS5cclxuXHQgKiBcdTA0MjBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSAoQEAvIyMpIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzggXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzMiBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4LlxyXG5cdCAqL1xyXG5cdGFzeW5jIHByZXBhcmVNZXNzYWdlc0ZvckxMTShtZXNzYWdlczogQ2hhdEhpc3RvcnlJdGVtW10sIGlzTGFzdE1lc3NhZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdGNvbnN0IHByZXBhcmVkTWVzc2FnZXMgPSBbXTtcclxuXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IG1zZyA9IG1lc3NhZ2VzW2ldO1xyXG5cdFx0XHRjb25zdCBpc0xhc3QgPSBpID09PSBtZXNzYWdlcy5sZW5ndGggLSAxO1xyXG5cclxuXHRcdFx0aWYgKG1zZy5yb2xlID09PSAndXNlcicgJiYgbXNnLmF0dGFjaG1lbnRzICYmIG1zZy5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0Ly8gXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0M0FcdTA0MzBcdTA0M0FcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NENcclxuXHRcdFx0XHRjb25zdCBhdHRhY2htZW50c1RvRXhwYW5kID0gbXNnLmF0dGFjaG1lbnRzLmZpbHRlcigoYXR0KSA9PiBhdHQucGVybWFuZW50IHx8IChpc0xhc3QgJiYgaXNMYXN0TWVzc2FnZSkpO1xyXG5cclxuXHRcdFx0XHRpZiAoYXR0YWNobWVudHNUb0V4cGFuZC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MjRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHUwNDNDXHUwNDM4XHJcblx0XHRcdFx0XHRsZXQgZXhwYW5kZWRDb250ZW50ID0gbXNnLmNvbnRlbnQ7XHJcblxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBhdHRhY2htZW50IG9mIGF0dGFjaG1lbnRzVG9FeHBhbmQpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9ybWF0dGVkQ29udGVudCA9IHRoaXMuZm9ybWF0Q29udGVudEZvckluc2VydGlvbihhdHRhY2htZW50LmNvbnRlbnQgfHwgJycsIGF0dGFjaG1lbnQpO1xyXG5cdFx0XHRcdFx0XHRleHBhbmRlZENvbnRlbnQgKz0gJ1xcbicgKyBmb3JtYXR0ZWRDb250ZW50O1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHByZXBhcmVkTWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHRcdHJvbGU6IG1zZy5yb2xlLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBleHBhbmRlZENvbnRlbnRcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDLCBcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0VcclxuXHRcdFx0XHRcdHByZXBhcmVkTWVzc2FnZXMucHVzaCh7XHJcblx0XHRcdFx0XHRcdHJvbGU6IG1zZy5yb2xlLFxyXG5cdFx0XHRcdFx0XHRjb250ZW50OiBtc2cuY29udGVudFxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFx1MDQyMVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzVcdTA0MzcgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XHJcblx0XHRcdFx0cHJlcGFyZWRNZXNzYWdlcy5wdXNoKHtcclxuXHRcdFx0XHRcdHJvbGU6IG1zZy5yb2xlLFxyXG5cdFx0XHRcdFx0Y29udGVudDogbXNnLmNvbnRlbnRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwcmVwYXJlZE1lc3NhZ2VzO1xyXG5cdH1cclxuXHJcblx0Ly8gVE9ETzogXHUwNDFGXHUwNDQwXHUwNDM4IFx1MDQ0MFx1MDQzNVx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDFcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDhcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzIgLSBcdTA0NDFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzRVx1MDQzMlxyXG5cdC8vIGFzeW5jIGV4cGFuZFJlZmVyZW5jZXNXaXRoU25hcHNob3RzKHRleHQ6IHN0cmluZywgcmVmZXJlbmNlczogRmlsZVJlZmVyZW5jZVtdLCBtZXNzYWdlSWQ6IHN0cmluZyk6IFByb21pc2U8e2V4cGFuZGVkVGV4dDogc3RyaW5nLCBzbmFwc2hvdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz59PiB7XHJcblx0Ly8gICAgIGNvbnN0IHNuYXBzaG90czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cdC8vICAgICBsZXQgZXhwYW5kZWRUZXh0ID0gdGV4dDtcclxuXHQvL1xyXG5cdC8vICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XHJcblx0Ly8gICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5sb2FkRmlsZUNvbnRlbnQocmVmZXJlbmNlKTtcclxuXHQvLyAgICAgICAgIGlmIChjb250ZW50ICE9PSBudWxsKSB7XHJcblx0Ly8gICAgICAgICAgICAgc25hcHNob3RzW3JlZmVyZW5jZS5wYXRoXSA9IGNvbnRlbnQ7XHJcblx0Ly8gICAgICAgICAgICAgZXhwYW5kZWRUZXh0ID0gYXdhaXQgdGhpcy5leHBhbmRTaW5nbGVSZWZlcmVuY2UoZXhwYW5kZWRUZXh0LCByZWZlcmVuY2UsIGNvbnRlbnQpO1xyXG5cdC8vICAgICAgICAgfVxyXG5cdC8vICAgICB9XHJcblx0Ly9cclxuXHQvLyAgICAgcmV0dXJuIHsgZXhwYW5kZWRUZXh0LCBzbmFwc2hvdHMgfTtcclxuXHQvLyB9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRVx1MDQzNFx1MDQzRFx1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDMgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNVxyXG5cdCAqIEBwYXJhbSB0ZXh0IC0gXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzhcclxuXHQgKiBAcGFyYW0gcmVmZXJlbmNlIC0gXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0NEZcclxuXHQgKiBAcGFyYW0gcHJlbG9hZGVkQ29udGVudCAtIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgKFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDhcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzIpXHJcblx0ICogQHJldHVybnMgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQ0MSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDNFXHUwNDM5XHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyBleHBhbmRTaW5nbGVSZWZlcmVuY2UodGV4dDogc3RyaW5nLCByZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UsIHByZWxvYWRlZENvbnRlbnQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdFx0Y29uc3QgY29udGVudCA9IHByZWxvYWRlZENvbnRlbnQgfHwgKGF3YWl0IHRoaXMubG9hZEZpbGVDb250ZW50KHJlZmVyZW5jZSkpO1xyXG5cclxuXHRcdGlmIChjb250ZW50ID09PSBudWxsKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybihgXHUwNDFEXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQ0MVx1MDQ0QyBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0Mzg6ICR7cmVmZXJlbmNlLm5hbWV9YCk7XHJcblx0XHRcdHJldHVybiB0ZXh0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0MzBcdTA0NDJcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QlxyXG5cdFx0Y29uc3QgcHJlZml4ID0gcmVmZXJlbmNlLnBlcm1hbmVudCA/IChyZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnID8gJ0BAJyA6ICcjIycpIDogcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJyA/ICdAJyA6ICcjJztcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOFxyXG5cdFx0Y29uc3QgZXNjYXBlZE5hbWUgPSB0aGlzLmVzY2FwZVJlZ0V4cChyZWZlcmVuY2UubmFtZSk7XHJcblx0XHRjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgJHt0aGlzLmVzY2FwZVJlZ0V4cChwcmVmaXgpfSg/OlwiJHtlc2NhcGVkTmFtZX1cInwke2VzY2FwZWROYW1lfSkoPz1cXFxcc3wkfFteXFxcXHctXSlgLCAnZycpO1xyXG5cclxuXHRcdC8vIFx1MDQyNFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzOFxyXG5cdFx0Y29uc3QgZm9ybWF0dGVkQ29udGVudCA9IHRoaXMuZm9ybWF0Q29udGVudEZvckluc2VydGlvbihjb250ZW50LCByZWZlcmVuY2UpO1xyXG5cclxuXHRcdHJldHVybiB0ZXh0LnJlcGxhY2UocGF0dGVybiwgZm9ybWF0dGVkQ29udGVudCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjBcdTA0MzBcdTA0NDFcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggKEBALyMjKSBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDM1XHJcblx0ICogQHBhcmFtIHRleHQgLSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzOFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRCXHUwNDNDXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Rlx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzBcdTA0M0NcdTA0MzhcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIGV4cGFuZFBlcm1hbmVudFJlZmVyZW5jZXModGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHRcdGNvbnN0IG1hdGNoZXMgPSBSZWZlcmVuY2VQYXJzZXIucGFyc2VSZWZlcmVuY2VzKHRleHQpO1xyXG5cdFx0Y29uc3QgcGVybWFuZW50TWF0Y2hlcyA9IG1hdGNoZXMuZmlsdGVyKChtYXRjaCkgPT4gbWF0Y2gucHJlZml4Lmxlbmd0aCA9PT0gMik7IC8vIEBAIFx1MDQzOFx1MDQzQlx1MDQzOCAjI1xyXG5cclxuXHRcdGlmIChwZXJtYW5lbnRNYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dDtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgZXhwYW5kZWRUZXh0ID0gdGV4dDtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRVx1MDQ0MiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzAgXHUwNDNBIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQ0M1xyXG5cdFx0Y29uc3Qgc29ydGVkTWF0Y2hlcyA9IFsuLi5wZXJtYW5lbnRNYXRjaGVzXS5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0SW5kZXggLSBhLnN0YXJ0SW5kZXgpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgbWF0Y2ggb2Ygc29ydGVkTWF0Y2hlcykge1xyXG5cdFx0XHRjb25zdCByZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UgPSB7XHJcblx0XHRcdFx0dHlwZTogbWF0Y2gudHlwZSxcclxuXHRcdFx0XHRuYW1lOiBtYXRjaC5uYW1lLFxyXG5cdFx0XHRcdHBhdGg6IGF3YWl0IHRoaXMucmVzb2x2ZUZpbGVQYXRoKG1hdGNoLm5hbWUsIG1hdGNoLnR5cGUpLFxyXG5cdFx0XHRcdHBlcm1hbmVudDogdHJ1ZVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMubG9hZEZpbGVDb250ZW50KHJlZmVyZW5jZSk7XHJcblx0XHRcdGlmIChjb250ZW50ICE9PSBudWxsKSB7XHJcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVkQ29udGVudCA9IHRoaXMuZm9ybWF0Q29udGVudEZvckluc2VydGlvbihjb250ZW50LCByZWZlcmVuY2UpO1xyXG5cdFx0XHRcdGV4cGFuZGVkVGV4dCA9IGV4cGFuZGVkVGV4dC5zdWJzdHJpbmcoMCwgbWF0Y2guc3RhcnRJbmRleCkgKyBmb3JtYXR0ZWRDb250ZW50ICsgZXhwYW5kZWRUZXh0LnN1YnN0cmluZyhtYXRjaC5lbmRJbmRleCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZXhwYW5kZWRUZXh0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHQgKiBAcGFyYW0gcmVmZXJlbmNlIC0gXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcclxuXHQgKiBAcmV0dXJucyBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwIFx1MDQzOFx1MDQzQlx1MDQzOCBudWxsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNEXHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyBsb2FkRmlsZUNvbnRlbnQocmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5maW5kRmlsZShyZWZlcmVuY2UucGF0aCwgcmVmZXJlbmNlLnR5cGUpO1xyXG5cdFx0XHRpZiAoIWZpbGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEXHUwNDRCXHJcblx0XHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy50ZW1wbGF0ZUVuZ2luZS5leHBhbmRQcm9tcHRUZW1wbGF0ZShjb250ZW50KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGNvbnRlbnQ7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCAke3JlZmVyZW5jZS5wYXRofTpgLCBlcnJvcik7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0ZcdTA0M0UgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM4XHJcblx0ICogQHBhcmFtIHBhdGggLSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNBIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0M1xyXG5cdCAqIEBwYXJhbSB0eXBlIC0gXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0MzhcdTA0M0JcdTA0MzggbnVsbFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmluZEZpbGUocGF0aDogc3RyaW5nLCB0eXBlOiAnZmlsZScgfCAncHJvbXB0Jyk6IFRGaWxlIHwgbnVsbCB7XHJcblx0XHRsZXQgZmlsZSA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aCk7XHJcblxyXG5cdFx0aWYgKCFmaWxlICYmIHR5cGUgPT09ICdwcm9tcHQnKSB7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDMyIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHRcdFx0Y29uc3QgcHJvbXB0c0ZvbGRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXI7XHJcblx0XHRcdGlmIChwcm9tcHRzRm9sZGVyKSB7XHJcblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtwcm9tcHRzRm9sZGVyfS8ke3BhdGh9YDtcclxuXHRcdFx0XHRmaWxlID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChmdWxsUGF0aCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlID8gZmlsZSA6IG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzVcdTA0NDhcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0M0EgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDQzIFx1MDQzRlx1MDQzRSBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0MzhcclxuXHQgKiBAcGFyYW0gbmFtZSAtIFx1MDQzOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHQgKiBAcGFyYW0gdHlwZSAtIFx1MDQ0Mlx1MDQzOFx1MDQzRiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzBcclxuXHQgKiBAcmV0dXJucyBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NDNcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVGaWxlUGF0aChuYW1lOiBzdHJpbmcsIHR5cGU6ICdmaWxlJyB8ICdwcm9tcHQnKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuXHRcdGlmICh0eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuXHRcdFx0cmV0dXJuIHByb21wdHNGb2xkZXIgPyBgJHtwcm9tcHRzRm9sZGVyfS8ke25hbWV9Lm1kYCA6IGAke25hbWV9Lm1kYDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFx1MDQxOFx1MDQ0OVx1MDQzNVx1MDQzQyBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDMyIFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzQlx1MDQzOFx1MDQ0OVx1MDQzNVxyXG5cdFx0XHRjb25zdCBmaWxlcyA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XHJcblx0XHRcdGNvbnN0IG1hdGNoaW5nRmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuYmFzZW5hbWUgPT09IG5hbWUpO1xyXG5cdFx0XHRyZXR1cm4gbWF0Y2hpbmdGaWxlID8gbWF0Y2hpbmdGaWxlLnBhdGggOiBgJHtuYW1lfS5tZGA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzggXHUwNDMyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdCAqIEBwYXJhbSBjb250ZW50IC0gXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG5cdCAqIEBwYXJhbSByZWZlcmVuY2UgLSBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzNVxyXG5cdCAqIEByZXR1cm5zIFx1MDQzRVx1MDQ0Mlx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzVcclxuXHQgKi9cclxuXHRwcml2YXRlIGZvcm1hdENvbnRlbnRGb3JJbnNlcnRpb24oY29udGVudDogc3RyaW5nLCByZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiBzdHJpbmcge1xyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQSBcdTA0NDEgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzRSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzVcclxuXHRcdGNvbnN0IGhlYWRlciA9IGBcXG5cXG4tLS0gXHUwNDIxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1ICR7cmVmZXJlbmNlLnR5cGUgPT09ICdwcm9tcHQnID8gJ1x1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCcgOiAnXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwJ306ICR7cmVmZXJlbmNlLm5hbWV9IC0tLVxcbmA7XHJcblx0XHRjb25zdCBmb290ZXIgPSBgXFxuLS0tIFx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0NiAke3JlZmVyZW5jZS50eXBlID09PSAncHJvbXB0JyA/ICdcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAnIDogJ1x1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCd9OiAke3JlZmVyZW5jZS5uYW1lfSAtLS1cXG5cXG5gO1xyXG5cclxuXHRcdHJldHVybiBoZWFkZXIgKyBjb250ZW50LnRyaW0oKSArIGZvb3RlcjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyRFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHBhcmFtIHN0cmluZyAtIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHJldHVybnMgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MUZcdTA0MzBcdTA0NDBcdTA0NDFcdTA0MzVcdTA0NDAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNEXHUwNDMwIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QiAoQC9AQCkgXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQ0QiAoIy8jIykgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzkuXHJcbiAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0MzhcdTA0NDFcdTA0M0EgXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDM1IFx1MDQzOCBcdTA0MzJcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzRcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyLlxyXG4gKi9cclxuXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZU1hdGNoIHtcclxuICAgIGZ1bGxNYXRjaDogc3RyaW5nO1xyXG4gICAgcHJlZml4OiBzdHJpbmc7IC8vIFx1MDQyMlx1MDQzNVx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQ0QyBcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIEAsICFALCAjLCAhIywgJCwgISRcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcjtcclxuICAgIGVuZEluZGV4OiBudW1iZXI7XHJcbiAgICB0eXBlOiAnZmlsZScgfCAncHJvbXB0JyB8ICdleHRlcm5hbCc7XHJcbiAgICBwZXJtYW5lbnQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlZmVyZW5jZSB7XHJcbiAgICB0eXBlOiAnZmlsZScgfCAncHJvbXB0JyB8ICdleHRlcm5hbCc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXRoOiBzdHJpbmc7XHJcbiAgICBwZXJtYW5lbnQ6IGJvb2xlYW47XHJcbiAgICB1dWlkPzogc3RyaW5nO1xyXG59XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgUGFyc2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlZmVyZW5jZVBhcnNlciB7XHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzMlx1MDQ0MVx1MDQzNSBAL0BAIFx1MDQzOCAjLyMjIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOFxyXG5cdCAqIEBwYXJhbSB0ZXh0IC0gXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0MzBcdTA0NDBcdTA0NDFcdTA0MzhcdTA0M0RcdTA0MzNcdTA0MzBcclxuXHQgKiBAcmV0dXJucyBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBwYXJzZVJlZmVyZW5jZXModGV4dDogc3RyaW5nKTogUmVmZXJlbmNlTWF0Y2hbXSB7XHJcblx0XHRjb25zdCBtYXRjaGVzOiBSZWZlcmVuY2VNYXRjaFtdID0gW107XHJcblxyXG5cdFx0Y29uc3QgcmVnZXggPSAvKCFbQCMkXXxbQCMkXSkoPzpcIihbXlwiXSspXCJ8KFteXFxzQCMkXCIhXSspKS9nO1xyXG5cclxuXHRcdGxldCBtYXRjaDtcclxuXHRcdHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xyXG5cdFx0XHRjb25zdCBwcmVmaXggPSBtYXRjaFsxXTtcclxuXHRcdFx0Y29uc3QgcXVvdGVkTmFtZSA9IG1hdGNoWzJdO1xyXG5cdFx0XHRjb25zdCB1bnF1b3RlZE5hbWUgPSBtYXRjaFszXTtcclxuXHRcdFx0Y29uc3QgbmFtZSA9IHF1b3RlZE5hbWUgfHwgdW5xdW90ZWROYW1lO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzOFx1MDQzRiBcdTA0M0ZcdTA0M0UgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNFXHUwNDNDXHUwNDQzIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0MyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0NDRcdTA0MzhcdTA0M0FcdTA0NDFcdTA0MzAgKFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSAhKVxyXG5cdFx0XHRjb25zdCB0eXBlQ2hhciA9IHByZWZpeC5yZXBsYWNlKCchJywgJycpO1xyXG5cdFx0XHRsZXQgdHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcgfCAnZXh0ZXJuYWwnO1xyXG5cclxuXHRcdFx0aWYgKHR5cGVDaGFyID09PSAnQCcpIHR5cGUgPSAnZmlsZSc7XHJcblx0XHRcdGVsc2UgaWYgKHR5cGVDaGFyID09PSAnIycpIHR5cGUgPSAncHJvbXB0JztcclxuXHRcdFx0ZWxzZSB0eXBlID0gJ2V4dGVybmFsJzsgLy8gJFxyXG5cclxuXHRcdFx0bWF0Y2hlcy5wdXNoKHtcclxuXHRcdFx0XHRmdWxsTWF0Y2g6IG1hdGNoWzBdLFxyXG5cdFx0XHRcdHByZWZpeDogcHJlZml4LFxyXG5cdFx0XHRcdG5hbWU6IG5hbWUsXHJcblx0XHRcdFx0c3RhcnRJbmRleDogbWF0Y2guaW5kZXgsXHJcblx0XHRcdFx0ZW5kSW5kZXg6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoLFxyXG5cdFx0XHRcdHR5cGU6IHR5cGUsXHJcblx0XHRcdFx0cGVybWFuZW50OiBwcmVmaXguc3RhcnRzV2l0aCgnIScpXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtYXRjaGVzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyLCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4IFx1MDQzRFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0OFx1MDQ1MVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzhcclxuXHQgKiBAcGFyYW0gdGV4dCAtIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHQgKiBAcGFyYW0gY3Vyc29yUG9zaXRpb24gLSBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzkgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1IFx1MDQzOFx1MDQzQlx1MDQzOCBudWxsXHJcblx0ICovXHJcblx0c3RhdGljIGdldEN1cnJlbnRSZWZlcmVuY2UodGV4dDogc3RyaW5nLCBjdXJzb3JQb3NpdGlvbjogbnVtYmVyKTogUmVmZXJlbmNlTWF0Y2ggfCBudWxsIHtcclxuXHRcdGNvbnN0IGJlZm9yZUN1cnNvciA9IHRleHQuc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKTtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzQVx1MDQzMCAhQCwgISMsICEkXHJcblx0XHRjb25zdCBpbmNvbXBsZXRlUmVnZXggPSAvKCFbQCMkXXxbQCMkXSkoW15cXHNAIyRcIiFdKj8pJC87XHJcblx0XHRjb25zdCBtYXRjaCA9IGJlZm9yZUN1cnNvci5tYXRjaChpbmNvbXBsZXRlUmVnZXgpO1xyXG5cclxuXHRcdGlmIChtYXRjaCkge1xyXG5cdFx0XHRjb25zdCBwcmVmaXggPSBtYXRjaFsxXTtcclxuXHRcdFx0Y29uc3QgcGFydGlhbE5hbWUgPSBtYXRjaFsyXTtcclxuXHRcdFx0Y29uc3Qgc3RhcnRJbmRleCA9IGJlZm9yZUN1cnNvci5sZW5ndGggLSBtYXRjaFswXS5sZW5ndGg7XHJcblxyXG5cdFx0XHRjb25zdCB0eXBlQ2hhciA9IHByZWZpeC5yZXBsYWNlKCchJywgJycpO1xyXG5cdFx0XHRsZXQgdHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcgfCAnZXh0ZXJuYWwnO1xyXG5cclxuXHRcdFx0aWYgKHR5cGVDaGFyID09PSAnQCcpIHR5cGUgPSAnZmlsZSc7XHJcblx0XHRcdGVsc2UgaWYgKHR5cGVDaGFyID09PSAnIycpIHR5cGUgPSAncHJvbXB0JztcclxuXHRcdFx0ZWxzZSB0eXBlID0gJ2V4dGVybmFsJztcclxuXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0ZnVsbE1hdGNoOiBtYXRjaFswXSxcclxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeCxcclxuXHRcdFx0XHRuYW1lOiBwYXJ0aWFsTmFtZSxcclxuXHRcdFx0XHRzdGFydEluZGV4OiBzdGFydEluZGV4LFxyXG5cdFx0XHRcdGVuZEluZGV4OiBjdXJzb3JQb3NpdGlvbixcclxuXHRcdFx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0XHRcdHBlcm1hbmVudDogcHJlZml4LnN0YXJ0c1dpdGgoJyEnKVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDEyXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM0XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MiBcdTA0M0RcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDIEB7Li4ufSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKiBAcGFyYW0gcHJvbXB0Q29udGVudCAtIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzBcclxuXHQgKiBAcmV0dXJucyBcdTA0NDBcdTA0MzVcdTA0MzdcdTA0NDNcdTA0M0JcdTA0NENcdTA0NDJcdTA0MzBcdTA0NDIgXHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0ICovXHJcblx0c3RhdGljIHZhbGlkYXRlUHJvbXB0UmVmZXJlbmNlcyhwcm9tcHRDb250ZW50OiBzdHJpbmcpOiB7IHZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdIH0ge1xyXG5cdFx0Y29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQ0OVx1MDQzNVx1MDQzQyBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IEB7Li4ufVxyXG5cdFx0Y29uc3QgdGVtcGxhdGVSZWdleCA9IC9AXFx7KFtefV0rKVxcfS9nO1xyXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IHByb21wdENvbnRlbnQubWF0Y2hBbGwodGVtcGxhdGVSZWdleCk7XHJcblxyXG5cdFx0Zm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XHJcblx0XHRcdGNvbnN0IHJlZmVyZW5jZU5hbWUgPSBtYXRjaFsxXS50cmltKCk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzhcdTA0M0NcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzVcclxuXHRcdFx0aWYgKCFyZWZlcmVuY2VOYW1lKSB7XHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goYFx1MDQxRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0RiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzAgXHUwNDMyIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzOCAke21hdGNoLmluZGV4fWApO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzhcdTA0M0NcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzRcdTA0M0VcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzhcdTA0M0NcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRCXHJcblx0XHRcdGlmICghL15bYS16QS1aMC05Xy1dKyQvLnRlc3QocmVmZXJlbmNlTmFtZSkpIHtcclxuXHRcdFx0XHRlcnJvcnMucHVzaChgXHUwNDFEXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzIgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1IFwiJHtyZWZlcmVuY2VOYW1lfVwiYCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcclxuXHRcdFx0ZXJyb3JzOiBlcnJvcnNcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MThcdTA0MzdcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0FcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDM4XHUwNDM3IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCwgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDMwXHUwNDQ1LlxyXG5cdCAqIFx1MDQxRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgXHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0NDEgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDNFXHUwNDNDIEB7Li4ufS5cclxuXHQgKiBAcGFyYW0gcHJvbXB0Q29udGVudCAtIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzBcclxuXHQgKiBAcGFyYW0gcHJlZml4ZXMgLSBcdTA0M0NcdTA0MzBcdTA0NDFcdTA0NDFcdTA0MzhcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDNFXHUwNDMyLCBcdTA0M0ZcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDNDIFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IChcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsIFsnQCddLCBbJyMnXSwgWydAJywgJyMnXSkuIFx1MDQxRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgWydAJ10uXHJcblx0ICogQHJldHVybnMgXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRzdGF0aWMgZXh0cmFjdFRlbXBsYXRlUmVmZXJlbmNlcyhwcm9tcHRDb250ZW50OiBzdHJpbmcsIHByZWZpeGVzOiBBcnJheTwnQCcgfCAnIyc+ID0gWydAJ10pOiBzdHJpbmdbXSB7XHJcblx0XHRjb25zdCByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cdFx0bGV0IHByZWZpeFJlZ2V4UGFydDogc3RyaW5nO1xyXG5cclxuXHRcdGlmIChwcmVmaXhlcy5pbmNsdWRlcygnQCcpICYmIHByZWZpeGVzLmluY2x1ZGVzKCcjJykpIHtcclxuXHRcdFx0cHJlZml4UmVnZXhQYXJ0ID0gJ1sjQF0nOyAvLyBcdTA0MThcdTA0NDlcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDMwXHUwNDNBIEAsIFx1MDQ0Mlx1MDQzMFx1MDQzQSBcdTA0MzggI1xyXG5cdFx0fSBlbHNlIGlmIChwcmVmaXhlcy5pbmNsdWRlcygnQCcpKSB7XHJcblx0XHRcdHByZWZpeFJlZ2V4UGFydCA9ICdAJzsgLy8gXHUwNDE4XHUwNDQ5XHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBAXHJcblx0XHR9IGVsc2UgaWYgKHByZWZpeGVzLmluY2x1ZGVzKCcjJykpIHtcclxuXHRcdFx0cHJlZml4UmVnZXhQYXJ0ID0gJyMnOyAvLyBcdTA0MThcdTA0NDlcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFICNcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzkgXHUwNDNDXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDM4XHUwNDMyIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0RcdTA0MzVcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0NcdTA0NEJcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDRCLCBcdTA0M0RcdTA0MzUgXHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQzM1x1MDQzRVxyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDIwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0NDEgXHUwNDM0XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDNDXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzRVx1MDQzQ1xyXG5cdFx0Y29uc3QgdGVtcGxhdGVSZWdleCA9IG5ldyBSZWdFeHAoYCR7cHJlZml4UmVnZXhQYXJ0fVxcXFx7KFtefV0rKVxcXFx9YCwgJ2cnKTtcclxuXHRcdGNvbnN0IG1hdGNoZXMgPSBwcm9tcHRDb250ZW50Lm1hdGNoQWxsKHRlbXBsYXRlUmVnZXgpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xyXG5cdFx0XHRjb25zdCByZWZlcmVuY2VOYW1lID0gbWF0Y2hbMV0udHJpbSgpO1xyXG5cdFx0XHRpZiAocmVmZXJlbmNlTmFtZSAmJiAhcmVmZXJlbmNlcy5pbmNsdWRlcyhyZWZlcmVuY2VOYW1lKSkge1xyXG5cdFx0XHRcdHJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2VOYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZWZlcmVuY2VzO1xyXG5cdH1cclxufVxyXG4iLCAiLyoqXHJcbiAqIFx1MDQyM1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIChcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M0RcdTA0M0RcdTA0MzhcdTA0NDUsIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSwgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyKS5cclxuICogXHUwNDIxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QiBcdTA0MzIgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0NDEgVVVJRCBcdTA0MzIgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4LlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFRGaWxlLCBub3JtYWxpemVQYXRoIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgTExNQWdlbnRQbHVnaW4gZnJvbSAnbWFpbic7XHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnOyAvLyBcdTA0MURcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDOiBucG0gaW5zdGFsbCB1dWlkIEB0eXBlcy91dWlkXHJcbmltcG9ydCB7IGdldE1pbWVUeXBlIH0gZnJvbSAnc3JjL3V0aWxzL2ZpbGVVdGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2FjaGVNYW5hZ2VyIHtcclxuICAgIHByaXZhdGUgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IocGx1Z2luOiBMTE1BZ2VudFBsdWdpbikge1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQxMlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDMwXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDYWNoZUZvbGRlclBhdGgoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjYWNoZUZvbGRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnJlZkNhY2hlRm9sZGVyO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5LCBcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRSB2YXVsdFxyXG4gICAgICAgIGlmICghdGhpcy5pc0Fic29sdXRlUGF0aChjYWNoZUZvbGRlcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgKyAnLycgKyBjYWNoZUZvbGRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGNhY2hlRm9sZGVyO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQ0MiwgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NEMgXHUwNDMwXHUwNDMxXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRFXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDNDXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXNBYnNvbHV0ZVBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8gV2luZG93czogQzpcXCwgRDpcXCwgXHUwNDM4IFx1MDQ0Mi5cdTA0MzQuXHJcbiAgICAgICAgaWYgKC9eW2EtekEtWl06XFxcXC8udGVzdChwYXRoKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gVW5peDogL1xyXG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDMwLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDNEXHUwNDMwIFx1MDQzRFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDYWNoZUZvbGRlckV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBjYWNoZVBhdGggPSB0aGlzLmdldENhY2hlRm9sZGVyUGF0aCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICghd2luZG93LnJlcXVpcmUpIHJldHVybjsgLy8gV2ViIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQ0RlxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZzID0gd2luZG93LnJlcXVpcmUoJ2ZzJykucHJvbWlzZXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGNhY2hlUGF0aCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKGNhY2hlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IgXHUwNDM4XHUwNDM3IHZhdWx0XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNhY2hlVmF1bHRGaWxlKGZpbGU6IFRGaWxlKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZzsgY2FjaGVkUGF0aDogc3RyaW5nIH0+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUNhY2hlRm9sZGVyRXhpc3RzKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdXVpZCA9IHV1aWR2NCgpO1xyXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGUuZXh0ZW5zaW9uO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEZpbGVOYW1lID0gYCR7ZmlsZS5iYXNlbmFtZX0tJHt1dWlkfS4ke2V4dGVuc2lvbn1gO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnBsdWdpbi5hcHAudmF1bHQucmVhZEJpbmFyeShmaWxlKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjYWNoZUZvbGRlclBhdGggPSB0aGlzLmdldENhY2hlRm9sZGVyUGF0aCgpO1xyXG4gICAgICAgIGNvbnN0IGNhY2hlZEZpbGVQYXRoID0gYCR7Y2FjaGVGb2xkZXJQYXRofS8ke2NhY2hlZEZpbGVOYW1lfWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1x1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0M0RcdTA0M0UgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzMiBkZXNrdG9wIFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBmcyA9IHdpbmRvdy5yZXF1aXJlKCdmcycpLnByb21pc2VzO1xyXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShjYWNoZWRGaWxlUGF0aCwgQnVmZmVyLmZyb20oY29udGVudCkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHV1aWQ6IHV1aWQsXHJcbiAgICAgICAgICAgIGNhY2hlZFBhdGg6IGNhY2hlZEZpbGVOYW1lIC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0NENcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQxQVx1MDQzNVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNhY2hlRXh0ZXJuYWxGaWxlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZzsgY2FjaGVkUGF0aDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG1pbWVUeXBlOiBzdHJpbmcgfT4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQ2FjaGVGb2xkZXJFeGlzdHMoKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXdpbmRvdy5yZXF1aXJlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXHUwNDFBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzRFx1MDQzRSBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDMyIGRlc2t0b3AgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZzID0gd2luZG93LnJlcXVpcmUoJ2ZzJykucHJvbWlzZXM7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5yZXF1aXJlKCdwYXRoJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGFic29sdXRlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGFic29sdXRlUGF0aCk7XHJcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVOYW1lKS5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCBwYXRoLmV4dG5hbWUoZmlsZU5hbWUpKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCB1dWlkID0gdXVpZHY0KCk7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkRmlsZU5hbWUgPSBgJHtiYXNlTmFtZX0tJHt1dWlkfS4ke2V4dGVuc2lvbn1gO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNhY2hlRm9sZGVyUGF0aCA9IHRoaXMuZ2V0Q2FjaGVGb2xkZXJQYXRoKCk7XHJcbiAgICAgICAgY29uc3QgY2FjaGVkRmlsZVBhdGggPSBgJHtjYWNoZUZvbGRlclBhdGh9LyR7Y2FjaGVkRmlsZU5hbWV9YDtcclxuICAgICAgICBcclxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoY2FjaGVkRmlsZVBhdGgsIGNvbnRlbnQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHV1aWQ6IHV1aWQsXHJcbiAgICAgICAgICAgIGNhY2hlZFBhdGg6IGNhY2hlZEZpbGVOYW1lLFxyXG4gICAgICAgICAgICBuYW1lOiBmaWxlTmFtZSxcclxuICAgICAgICAgICAgbWltZVR5cGU6IGdldE1pbWVUeXBlKGZpbGVOYW1lKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogXHUwNDEyXHUwNDNFXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzQVx1MDQzNVx1MDQ0OCBcdTA0MzhcdTA0MzcgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZXN0b3JlQ2FjaGUoc291cmNlUGF0aDogc3RyaW5nLCB0eXBlOiAnZmlsZScgfCAncHJvbXB0JyB8ICdleHRlcm5hbCcsIHV1aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdleHRlcm5hbCcpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgc291cmNlUGF0aCAtIFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhY2hlRXh0ZXJuYWxGaWxlKHNvdXJjZVBhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhY2hlZFBhdGg7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZmlsZScpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIgc291cmNlUGF0aCAtIFx1MDQzRVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOVxyXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChzb3VyY2VQYXRoKTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZVZhdWx0RmlsZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FjaGVkUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuICAgICAgICAgICAgLy8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG4gICAgICAgICAgICBjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmlzQWJzb2x1dGVQYXRoKHNvdXJjZVBhdGgpIFxyXG4gICAgICAgICAgICAgICAgPyBzb3VyY2VQYXRoIFxyXG4gICAgICAgICAgICAgICAgOiBgJHtwcm9tcHRzRm9sZGVyfS8ke3NvdXJjZVBhdGh9YDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZ1bGxQYXRoKTtcclxuICAgICAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWNoZVZhdWx0RmlsZShmaWxlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2FjaGVkUGF0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFx1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDMyXHUwNDNFXHUwNDQxXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQVx1MDQzNVx1MDQ0OCBcdTA0MzRcdTA0M0JcdTA0NEYgJHtzb3VyY2VQYXRofWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFx1MDQyN1x1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDM4XHUwNDM3IFx1MDQzQVx1MDQzNVx1MDQ0OFx1MDQzMFxyXG4gICAgICovXHJcbiAgICBhc3luYyByZWFkQ2FjaGVkRmlsZShjYWNoZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXJQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2NhY2hlRm9sZGVyUGF0aH0vJHtjYWNoZWRQYXRofWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1x1MDQyN1x1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzAgXHUwNDM0XHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDNGXHUwNDNEXHUwNDNFIFx1MDQ0Mlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0MzIgZGVza3RvcCBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzgnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZnMgPSB3aW5kb3cucmVxdWlyZSgnZnMnKS5wcm9taXNlcztcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCk7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNhY2hlZEZpbGVFeGlzdHMoY2FjaGVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgY2FjaGVGb2xkZXJQYXRoID0gdGhpcy5nZXRDYWNoZUZvbGRlclBhdGgoKTtcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke2NhY2hlRm9sZGVyUGF0aH0vJHtjYWNoZWRQYXRofWA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF3aW5kb3cucmVxdWlyZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGZzID0gd2luZG93LnJlcXVpcmUoJ2ZzJykucHJvbWlzZXM7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCAiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuY29uc3QgYnl0ZVRvSGV4ID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gICAgcmV0dXJuIChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgICBjb25zdCB1dWlkID0gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0KTtcbiAgICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkO1xufVxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5O1xuIiwgImxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICBpZiAodHlwZW9mIGNyeXB0byA9PT0gJ3VuZGVmaW5lZCcgfHwgIWNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYW5kb21WYWx1ZXMgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59XG4iLCAiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHsgcmFuZG9tVVVJRCB9O1xuIiwgImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5mdW5jdGlvbiBfdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBybmRzID0gb3B0aW9ucy5yYW5kb20gPz8gb3B0aW9ucy5ybmc/LigpID8/IHJuZygpO1xuICAgIGlmIChybmRzLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tIGJ5dGVzIGxlbmd0aCBtdXN0IGJlID49IDE2Jyk7XG4gICAgfVxuICAgIHJuZHNbNl0gPSAocm5kc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgICBybmRzWzhdID0gKHJuZHNbOF0gJiAweDNmKSB8IDB4ODA7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMTYgPiBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVVVJRCBieXRlIHJhbmdlICR7b2Zmc2V0fToke29mZnNldCArIDE1fSBpcyBvdXQgb2YgYnVmZmVyIGJvdW5kc2ApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICByZXR1cm4gdW5zYWZlU3RyaW5naWZ5KHJuZHMpO1xufVxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAobmF0aXZlLnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmF0aXZlLnJhbmRvbVVVSUQoKTtcbiAgICB9XG4gICAgcmV0dXJuIF92NChvcHRpb25zLCBidWYsIG9mZnNldCk7XG59XG5leHBvcnQgZGVmYXVsdCB2NDtcbiIsICIvLyBzcmMvdXRpbHMvZmlsZVV0aWxzLnRzXHJcblxyXG4vKipcclxuICogXHUwNDEyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIE1JTUUtXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM1IFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFx1MDQxOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgKFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgXCJkb2N1bWVudC5wZGZcIiwgXCJpbWFnZS5wbmdcIilcclxuICogQHJldHVybnMgTUlNRS1cdTA0NDJcdTA0MzhcdTA0M0YgXHUwNDM4XHUwNDNCXHUwNDM4ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDQyXHUwNDM4XHUwNDNGIFx1MDQzRFx1MDQzNVx1MDQzOFx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzRFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pbWVUeXBlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdGNvbnN0IGV4dCA9IGZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XHJcblx0Y29uc3QgbWltZVR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG5cdFx0dHh0OiAndGV4dC9wbGFpbicsXHJcblx0XHRtZDogJ3RleHQvbWFya2Rvd24nLFxyXG5cdFx0anNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG5cdFx0anM6ICd0ZXh0L2phdmFzY3JpcHQnLFxyXG5cdFx0dHM6ICd0ZXh0L3R5cGVzY3JpcHQnLFxyXG5cdFx0aHRtbDogJ3RleHQvaHRtbCcsXHJcblx0XHRjc3M6ICd0ZXh0L2NzcycsXHJcblx0XHRwZGY6ICdhcHBsaWNhdGlvbi9wZGYnLFxyXG5cdFx0cG5nOiAnaW1hZ2UvcG5nJyxcclxuXHRcdGpwZzogJ2ltYWdlL2pwZWcnLFxyXG5cdFx0anBlZzogJ2ltYWdlL2pwZWcnLFxyXG5cdFx0Z2lmOiAnaW1hZ2UvZ2lmJyxcclxuXHRcdHN2ZzogJ2ltYWdlL3N2Zyt4bWwnLFxyXG5cdFx0d2VicDogJ2ltYWdlL3dlYnAnLFxyXG5cdFx0eG1sOiAnYXBwbGljYXRpb24veG1sJyxcclxuXHRcdGNzdjogJ3RleHQvY3N2JyxcclxuXHRcdHppcDogJ2FwcGxpY2F0aW9uL3ppcCcsXHJcblx0XHRweTogJ3RleHQveC1weXRob24nLFxyXG5cdFx0amF2YTogJ3RleHQveC1qYXZhJyxcclxuXHRcdGNwcDogJ3RleHQveC1jKytzcmMnLFxyXG5cdFx0YzogJ3RleHQveC1jc3JjJyxcclxuXHRcdGg6ICd0ZXh0L3gtY2hkcicsXHJcblx0XHRzaDogJ2FwcGxpY2F0aW9uL3gtc2gnLFxyXG5cdFx0eWFtbDogJ3RleHQveWFtbCcsXHJcblx0XHR5bWw6ICd0ZXh0L3lhbWwnXHJcblx0fTtcclxuXHRyZXR1cm4gbWltZVR5cGVzW2V4dCB8fCAnJ10gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XHJcbn0iLCAiLyoqXHJcbiAqIFx1MDQxNFx1MDQzMlx1MDQzOFx1MDQzNlx1MDQzRVx1MDQzQSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDQxIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOCBAey4uLn0uXHJcbiAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0QgXHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDRDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzOCBcdTA0MzggXHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM0XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBURmlsZSB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBSZWZlcmVuY2VQYXJzZXIgfSBmcm9tICcuL1JlZmVyZW5jZVBhcnNlcic7XHJcblxyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZW1wbGF0ZSBFbmdpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVFbmdpbmUge1xyXG5cdHByaXZhdGUgcGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHJcblx0Y29uc3RydWN0b3IocGx1Z2luOiBMTE1BZ2VudFBsdWdpbikge1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzMlx1MDQzRVx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIsIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQ0RiBAey4uLn0gXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4LlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDQyXHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0N1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NEUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQ0Nlx1MDQzOFx1MDQzQVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzBcdTA0NDUuXHJcblx0ICogQHBhcmFtIHByb21wdENvbnRlbnQgLSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0ICogQHBhcmFtIGV4cGFuZGVkUmVmZXJlbmNlcyAtIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzOFx1MDQzOSBTZXQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDM5IFx1MDQ0Nlx1MDQzNVx1MDQzRlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzhcclxuXHQgKiBAcmV0dXJucyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHJcblx0ICovXHJcblx0YXN5bmMgZXhwYW5kUHJvbXB0VGVtcGxhdGUocHJvbXB0Q29udGVudDogc3RyaW5nLCBleHBhbmRlZFJlZmVyZW5jZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4IEB7Li4ufVxyXG5cdFx0Y29uc3QgdGVtcGxhdGVSZWZlcmVuY2VzID0gUmVmZXJlbmNlUGFyc2VyLmV4dHJhY3RUZW1wbGF0ZVJlZmVyZW5jZXMocHJvbXB0Q29udGVudCwgWydAJywgJyMnXSk7XHJcblxyXG5cdFx0aWYgKHRlbXBsYXRlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIHByb21wdENvbnRlbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEIgXHUwNDMyIFx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzQlx1MDQzOFx1MDQ0OVx1MDQzNSBPYnNpZGlhbiBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0QgXHUwNDQwXHUwNDMwXHUwNDM3IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0MzkgXHUwNDQ2XHUwNDM1XHUwNDNGXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4IFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOFxyXG5cdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0MzdcdTA0MzFcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzRVx1MDQzMiB2YXVsdC5nZXRGaWxlcygpXHJcblx0XHRjb25zdCBhbGxGaWxlcyA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRGaWxlcygpO1xyXG5cclxuXHRcdGxldCBleHBhbmRlZENvbnRlbnQgPSBwcm9tcHRDb250ZW50O1xyXG5cclxuXHRcdC8vIFx1MDQxN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDQzIFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdFx0Zm9yIChjb25zdCByZWZlcmVuY2VOYW1lIG9mIHRlbXBsYXRlUmVmZXJlbmNlcykge1xyXG5cdFx0XHRpZiAoZXhwYW5kZWRSZWZlcmVuY2VzLmhhcyhyZWZlcmVuY2VOYW1lKSkge1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihcclxuXHRcdFx0XHRcdGBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzAgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFwiJHtyZWZlcmVuY2VOYW1lfVwiLiBcdTA0MThcdTA0MzNcdTA0M0RcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzFcdTA0MzVcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDdcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4LmBcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGNvbnRpbnVlOyAvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQ0M1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQ0MyBcdTA0MzIgU2V0IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCXHUwNDNFXHUwNDMyXHJcblx0XHRcdGV4cGFuZGVkUmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlTmFtZSk7XHJcblxyXG5cdFx0XHRjb25zdCByZWZlcmVuY2VkQ29udGVudCA9IGF3YWl0IHRoaXMubG9hZFByb21wdENvbnRlbnQocmVmZXJlbmNlTmFtZSwgYWxsRmlsZXMpO1xyXG5cdFx0XHRpZiAocmVmZXJlbmNlZENvbnRlbnQgIT09IG51bGwpIHtcclxuXHRcdFx0XHQvLyBcdTA0MjBcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0MzhcdTA0MzJcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDNFXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDMwXHJcblx0XHRcdFx0Y29uc3QgZXhwYW5kZWROZXN0ZWRDb250ZW50ID0gYXdhaXQgdGhpcy5leHBhbmRQcm9tcHRUZW1wbGF0ZShyZWZlcmVuY2VkQ29udGVudCwgZXhwYW5kZWRSZWZlcmVuY2VzKTtcclxuXHJcblx0XHRcdFx0Ly8gXHUwNDE3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0MzJcdTA0NDVcdTA0M0VcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgQHtyZWZlcmVuY2VOYW1lfSBcdTA0MzhcdTA0M0JcdTA0MzggI3tyZWZlcmVuY2VOYW1lfSBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM1XHJcblx0XHRcdFx0Y29uc3QgdGVtcGxhdGVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgWyNAXT9cXFxceyR7dGhpcy5lc2NhcGVSZWdFeHAocmVmZXJlbmNlTmFtZSl9XFxcXH1gLCAnZycpO1xyXG5cdFx0XHRcdGV4cGFuZGVkQ29udGVudCA9IGV4cGFuZGVkQ29udGVudC5yZXBsYWNlKHRlbXBsYXRlUGF0dGVybiwgZXhwYW5kZWROZXN0ZWRDb250ZW50KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QsIFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0Q1xyXG5cdFx0XHRcdGNvbnNvbGUud2FybihgXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyIFwiJHtyZWZlcmVuY2VOYW1lfVwiIFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0QuYCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDQzIFx1MDQzOFx1MDQzNyBTZXQgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzNVx1MDQ1MSBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzgsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDQ4XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzOFx1MDQzQyBcdTA0MzJcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzBcdTA0M0MgXHUwNDQwXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4XHJcblx0XHRcdGV4cGFuZGVkUmVmZXJlbmNlcy5kZWxldGUocmVmZXJlbmNlTmFtZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV4cGFuZGVkQ29udGVudDtcclxuXHR9XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDQwXHUwNDQzXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBwcm9tcHROYW1lIC0gXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDNCXHUwNDM4IG51bGwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRFx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzlcdTA0MzRcdTA0MzVcdTA0M0RcclxuXHQgKi9cclxuXHRwcml2YXRlIGFzeW5jIGxvYWRQcm9tcHRDb250ZW50KHByb21wdE5hbWU6IHN0cmluZywgYWxsRmlsZXM6IFRGaWxlW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuXHRcdGNvbnN0IHByb21wdEZpbGUgPSB0aGlzLmZpbmRQcm9tcHRGaWxlKHByb21wdE5hbWUsIGFsbEZpbGVzKTtcclxuXHJcblx0XHRpZiAoIXByb21wdEZpbGUpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucGx1Z2luLmFwcC52YXVsdC5yZWFkKHByb21wdEZpbGUpO1xyXG5cdFx0XHRyZXR1cm4gY29udGVudC50cmltKCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGBcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDQ3XHUwNDQyXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMCBcIiR7cHJvbXB0TmFtZX1cIjpgLCBlcnJvcik7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDNGXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzOFxyXG5cdCAqIEBwYXJhbSBwcm9tcHROYW1lIC0gXHUwNDM4XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdCAqIEByZXR1cm5zIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0MzAgXHUwNDM4XHUwNDNCXHUwNDM4IG51bGxcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRQcm9tcHRGaWxlKHByb21wdE5hbWU6IHN0cmluZywgYWxsRmlsZXM6IFRGaWxlW10pOiBURmlsZSB8IG51bGwge1xyXG5cdFx0Lypjb25zdCBwcm9tcHRzRm9sZGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MucHJvbXB0c0ZvbGRlcjtcclxuXHRcdGlmICghcHJvbXB0c0ZvbGRlcikge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MURcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDRDIFx1MDQzQSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyLCBcdTA0NDNcdTA0MzFcdTA0MzhcdTA0NDBcdTA0MzBcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1L1x1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0NDhcdTA0MzhcclxuXHRcdGNvbnN0IG5vcm1hbGl6ZWRQcm9tcHRzUGF0aCA9IHByb21wdHNGb2xkZXIucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpOyovXHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDQ5XHUwNDM1XHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM5IFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzIgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMiAoXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzNVx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzBcdTA0NDUpLCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgTWFya2Rvd24tXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDNDXHJcblx0XHQvLyBcdTA0MzggXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzOFx1MDQzQ1x1MDQ0RiAoXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQ0MFx1MDQzMFx1MDQ0MVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RikgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNGXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MSBwcm9tcHROYW1lXHJcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgYWxsRmlsZXMpIHtcclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQiBNYXJrZG93biBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0M0VcdTA0M0QgXHUwNDMyIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDJcdTA0M0VcdTA0MzJcclxuXHRcdFx0Ly8gXHUwNDIxXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQ1x1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0MzAgKFx1MDQzMVx1MDQzNVx1MDQzNyBcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYpIFx1MDQ0MSBcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0NcdTA0NEJcdTA0M0MgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzMFxyXG5cdFx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRTogZmlsZS5wYXRoLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByb21wdHNQYXRofS9gXHJcblx0XHRcdGlmIChmaWxlLmV4dGVuc2lvbiA9PT0gJ21kJyAmJiBmaWxlLmJhc2VuYW1lID09PSBwcm9tcHROYW1lKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZpbGU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyRFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHBhcmFtIHN0cmluZyAtIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICogQHJldHVybnMgXHUwNDREXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcclxuXHR9XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDM4IFx1MDQ0M1x1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzhcdTA0MzdcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzMiBcdTA0NDdcdTA0MzBcdTA0NDJcdTA0MzUuXHJcbiAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0JcdTA0MzhcdTA0NDdcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzIvXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDQyXHUwNDNFXHUwNDMyIFx1MDQzOCBcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzBcdTA0NDBcdTA0M0RcdTA0NEJcdTA0NDUvXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBGaWxlUmVmZXJlbmNlIH0gZnJvbSAnLi9SZWZlcmVuY2VQYXJzZXInO1xyXG5pbXBvcnQgeyBzZXRJY29uIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIEJveCBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlQm94IHtcclxuXHQvKipcclxuXHQgKiBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0NTFcdTA0NDIgXHUwNDMyXHUwNDM4XHUwNDM3XHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM4XHJcblx0ICogQHBhcmFtIHJlZmVyZW5jZSAtIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0UgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1XHJcblx0ICogQHJldHVybnMgSFRNTCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICovXHJcblx0c3RhdGljIGNyZWF0ZUJveChyZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcblx0XHRib3guY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJzsgLy8gXHUwNDE0XHUwNDFFXHUwNDExXHUwNDEwXHUwNDEyXHUwNDFCXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MTRcdTA0MzVcdTA0M0JcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxIFx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQzQ1xyXG5cdFx0Ym94LmNsYXNzTmFtZSA9IHRoaXMuZ2V0Qm94Q2xhc3NlcyhyZWZlcmVuY2UpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScsIHJlZmVyZW5jZS50eXBlKTtcclxuXHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLW5hbWUnLCByZWZlcmVuY2UubmFtZSk7XHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1wYXRoJywgcmVmZXJlbmNlLnBhdGgpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JywgcmVmZXJlbmNlLnBlcm1hbmVudC50b1N0cmluZygpKTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQyMVx1MDQzRVx1MDQ0NVx1MDQ0MFx1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzNVx1MDQzQyBVVUlELCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDXHJcblx0XHRpZiAocmVmZXJlbmNlLnV1aWQpIHtcclxuXHRcdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdXVpZCcsIHJlZmVyZW5jZS51dWlkKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDQzXHJcblx0XHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0aWNvbi5jbGFzc05hbWUgPSAncmVmZXJlbmNlLWJveC1pY29uJztcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQzQyBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEIgXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDNFIHNldEljb24gXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMVx1MDQzRVx1MDQzQlx1MDQzNVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0XHRpY29uLnRleHRDb250ZW50ID0gdGhpcy5nZXRJY29uU3ltYm9sKHJlZmVyZW5jZSk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNDXHJcblx0XHRjb25zdCBuYW1lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdG5hbWVTcGFuLmNsYXNzTmFtZSA9ICdyZWZlcmVuY2UtYm94LW5hbWUnO1xyXG5cdFx0bmFtZVNwYW4udGV4dENvbnRlbnQgPSByZWZlcmVuY2UubmFtZTtcclxuXHJcblx0XHRib3guYXBwZW5kQ2hpbGQoaWNvbik7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQobmFtZVNwYW4pO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0EgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0NcdTA0M0VcdTA0NDJcdTA0NDBcdTA0MzAgKFRPRE86IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzMFx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0M0VcdTA0M0RcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMpXHJcblx0XHRib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdC8vIFRPRE86IFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0NcdTA0M0VcdTA0NDJcdTA0NDAgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMFxyXG5cdFx0XHRjb25zb2xlLmxvZygnQ2xpY2tlZCByZWZlcmVuY2U6JywgcmVmZXJlbmNlKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBib3g7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVxyXG5cdCAqIEBwYXJhbSBib3hFbGVtZW50IC0gXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzMFxyXG5cdCAqIEBwYXJhbSByZWZlcmVuY2UgLSBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzVcclxuXHQgKi9cclxuXHRzdGF0aWMgdXBkYXRlQm94KGJveEVsZW1lbnQ6IEhUTUxFbGVtZW50LCByZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiB2b2lkIHtcclxuXHRcdGJveEVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5nZXRCb3hDbGFzc2VzKHJlZmVyZW5jZSk7XHJcblx0XHRib3hFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScsIHJlZmVyZW5jZS50eXBlKTtcclxuXHRcdGJveEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1uYW1lJywgcmVmZXJlbmNlLm5hbWUpO1xyXG5cdFx0Ym94RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLXBhdGgnLCByZWZlcmVuY2UucGF0aCk7XHJcblx0XHRib3hFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JywgcmVmZXJlbmNlLnBlcm1hbmVudC50b1N0cmluZygpKTtcclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0MUVcdTA0MTFcdTA0MTBcdTA0MTJcdTA0MUJcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxRVx1MDQzMVx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBVVUlELCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDXHJcblx0XHRpZiAocmVmZXJlbmNlLnV1aWQpIHtcclxuXHRcdFx0Ym94RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmZXJlbmNlLXV1aWQnLCByZWZlcmVuY2UudXVpZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgaWNvbkVsZW1lbnQgPSBib3hFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5yZWZlcmVuY2UtYm94LWljb24nKTtcclxuXHRcdGNvbnN0IG5hbWVFbGVtZW50ID0gYm94RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucmVmZXJlbmNlLWJveC1uYW1lJyk7XHJcblxyXG5cdFx0aWYgKGljb25FbGVtZW50KSB7XHJcblx0XHRcdC8vIFx1MDQxOFx1MDQxN1x1MDQxQ1x1MDQxNVx1MDQxRFx1MDQxNVx1MDQxRFx1MDQxRTogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0Ugc2V0SWNvblxyXG5cdFx0XHRpY29uRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0SWNvblN5bWJvbChyZWZlcmVuY2UpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChuYW1lRWxlbWVudCkge1xyXG5cdFx0XHRuYW1lRWxlbWVudC50ZXh0Q29udGVudCA9IHJlZmVyZW5jZS5uYW1lO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0UgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM1IFx1MDQzOFx1MDQzNyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICogQHBhcmFtIGJveEVsZW1lbnQgLSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICogQHJldHVybnMgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzRSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzVcclxuXHQgKi9cclxuXHRzdGF0aWMgZXh0cmFjdFJlZmVyZW5jZShib3hFbGVtZW50OiBIVE1MRWxlbWVudCk6IEZpbGVSZWZlcmVuY2UgfCBudWxsIHtcclxuXHRcdGNvbnN0IHR5cGUgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdHlwZScpIGFzICdmaWxlJyB8ICdwcm9tcHQnIHwgJ2V4dGVybmFsJztcclxuXHRcdGNvbnN0IG5hbWUgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtbmFtZScpO1xyXG5cdFx0Y29uc3QgcGF0aCA9IGJveEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlZmVyZW5jZS1wYXRoJyk7XHJcblx0XHRjb25zdCBwZXJtYW5lbnQgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtcGVybWFuZW50JykgPT09ICd0cnVlJztcclxuXHRcdGNvbnN0IHV1aWQgPSBib3hFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWZlcmVuY2UtdXVpZCcpO1xyXG5cclxuXHRcdGlmICghdHlwZSB8fCAhbmFtZSB8fCAhcGF0aCkge1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRwYXRoLFxyXG5cdFx0XHRwZXJtYW5lbnQsXHJcblx0XHRcdHV1aWQ6IHV1aWQgfHwgdW5kZWZpbmVkXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgQ1NTIFx1MDQzQVx1MDQzQlx1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQ0QiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHUwNDMwXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Qm94Q2xhc3NlcyhyZWZlcmVuY2U6IEZpbGVSZWZlcmVuY2UpOiBzdHJpbmcge1xyXG5cdFx0Y29uc3QgYmFzZUNsYXNzID0gJ3JlZmVyZW5jZS1ib3gnO1xyXG5cdFx0Y29uc3QgdHlwZUNsYXNzID0gcmVmZXJlbmNlLnR5cGU7XHJcblx0XHRjb25zdCBwZXJtYW5lbnRDbGFzcyA9IHJlZmVyZW5jZS5wZXJtYW5lbnQgPyAncGVybWFuZW50JyA6ICdzaW5nbGUnO1xyXG5cclxuXHRcdHJldHVybiBgJHtiYXNlQ2xhc3N9ICR7dHlwZUNsYXNzfSAke3Blcm1hbmVudENsYXNzfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4XHJcblx0ICogXHUwNDE4XHUwNDE3XHUwNDFDXHUwNDE1XHUwNDFEXHUwNDE1XHUwNDFEXHUwNDFFOiBcdTA0MjJcdTA0MzVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0NEMgXHUwNDMyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0MzJcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NDJcdTA0M0UgXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzRVx1MDQzQSBPYnNpZGlhblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldEljb25TeW1ib2wocmVmZXJlbmNlOiBGaWxlUmVmZXJlbmNlKTogc3RyaW5nIHtcclxuXHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ3Byb21wdCcpIHtcclxuXHRcdFx0cmV0dXJuICdcdTI2QTEnOyAvLyBcdTA0MUNcdTA0M0VcdTA0M0JcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0Mlx1MDQzRVx1MDQzMlxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChyZWZlcmVuY2UudHlwZSA9PT0gJ2V4dGVybmFsJykge1xyXG5cdFx0XHRyZXR1cm4gJ1x1RDgzRFx1RENDRSc7IC8vIFx1MDQxN1x1MDQzRFx1MDQzMFx1MDQzQSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0M0JcdTA0MzBcdTA0NDBcdTA0MzAgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQ0NSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzOFx1MDQzNyB2YXVsdCBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgQFxyXG5cdFx0cmV0dXJuICdcdUQ4M0RcdURDQzQnO1xyXG5cdH1cclxufVxyXG4iLCAiLypcclxuICogXHUwNDIzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQyBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0NDRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0M0VcdTA0M0MgXHUwNDQ3XHUwNDMwXHUwNDQyXHUwNDMwLCBcdTA0MzJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0NEYgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSxcclxuICogXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDNBXHUwNDM4IFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDM3XHUwNDMwXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDRGIFx1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0MuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ2hhdEhpc3RvcnlJdGVtLCBBdHRhY2htZW50IH0gZnJvbSAnLi9tb2RlbHMvQ2hhdEhpc3RvcnlJdGVtJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlTWFuYWdlciB9IGZyb20gJy4uL3JlZmVyZW5jZXMvQXV0b2NvbXBsZXRlTWFuYWdlcic7XHJcbmltcG9ydCB7IFJlZmVyZW5jZUF1dG9jb21wbGV0ZSB9IGZyb20gJy4uL3JlZmVyZW5jZXMvUmVmZXJlbmNlQXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlRXhwYW5kZXIgfSBmcm9tICcuLi9yZWZlcmVuY2VzL1JlZmVyZW5jZUV4cGFuZGVyJztcclxuaW1wb3J0IHsgVGVtcGxhdGVFbmdpbmUgfSBmcm9tICcuLi9yZWZlcmVuY2VzL1RlbXBsYXRlRW5naW5lJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlUGFyc2VyLCBGaWxlUmVmZXJlbmNlLCBSZWZlcmVuY2VNYXRjaCB9IGZyb20gJy4uL3JlZmVyZW5jZXMvUmVmZXJlbmNlUGFyc2VyJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlQm94IH0gZnJvbSAnLi4vcmVmZXJlbmNlcy9SZWZlcmVuY2VCb3gnO1xyXG5pbXBvcnQgeyBBdXRvY29tcGxldGVJdGVtIH0gZnJvbSAnLi4vcmVmZXJlbmNlcy9BdXRvY29tcGxldGVNYW5hZ2VyJztcclxuaW1wb3J0IExMTUFnZW50UGx1Z2luIGZyb20gJ21haW4nO1xyXG5pbXBvcnQgeyBNYXJrZG93blJlbmRlcmVyLCBzZXRJY29uLCBOb3RpY2UsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tICdzcmMvdXRpbHMvRGlhbG9nJztcclxuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnc3JjL3JlZmVyZW5jZXMvQ2FjaGVNYW5hZ2VyJztcclxuXHJcbmludGVyZmFjZSBDaGF0UGFuZWxQcm9wcyB7XHJcblx0Y2hhdEhpc3Rvcnk6IENoYXRIaXN0b3J5SXRlbVtdO1xyXG5cdG9uU2VuZE1lc3NhZ2U6IChtZXNzYWdlOiBzdHJpbmcsIHNlbGVjdGVkTW9kZWw/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudFtdKSA9PiB2b2lkO1xyXG5cdGF2YWlsYWJsZU1vZGVscz86IHN0cmluZ1tdO1xyXG5cdHNlbGVjdGVkTW9kZWw/OiBzdHJpbmc7XHJcblx0cGx1Z2luOiBMTE1BZ2VudFBsdWdpbjtcclxuXHRjdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaGF0UGFuZWwge1xyXG5cdGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcblx0cHJvcHM6IENoYXRQYW5lbFByb3BzO1xyXG5cdGNoYXRIaXN0b3J5OiBDaGF0SGlzdG9yeUl0ZW1bXTtcclxuXHRtZXNzYWdlSW5wdXQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cdHNlbmRCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cdHN1Z2dlc3Rpb25zQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudDtcclxuXHRtb2RlbFNlbGVjdEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0bW9kZWxEcm9wZG93bjogSFRNTERpdkVsZW1lbnQ7XHJcblx0c2VsZWN0ZWRNb2RlbDogc3RyaW5nO1xyXG5cdGN1c3RvbVByb21wdEluZGljYXRvcjogSFRNTFNwYW5FbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblx0Y3VycmVudFN0cmVhbWluZ05vZGVJZDogc3RyaW5nIHwgbnVsbDtcclxuXHRzdG9wQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHJcblx0Ly8gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDRCIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XHJcblx0YXR0YWNoRmlsZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0ZmlsZUlucHV0OiBIVE1MSW5wdXRFbGVtZW50O1xyXG5cdGF0dGFjaGVkRmlsZXNDb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xyXG5cdGN1cnJlbnRBdHRhY2htZW50czogQXR0YWNobWVudFtdID0gW107XHJcblxyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBTeXN0ZW0gRmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cdGNhY2hlTWFuYWdlcjogQ2FjaGVNYW5hZ2VyO1xyXG5cclxuXHRwcml2YXRlIGF1dG9jb21wbGV0ZU1hbmFnZXI6IEF1dG9jb21wbGV0ZU1hbmFnZXI7XHJcblx0cHJpdmF0ZSByZWZlcmVuY2VBdXRvY29tcGxldGU6IFJlZmVyZW5jZUF1dG9jb21wbGV0ZTtcclxuXHRwcml2YXRlIHJlZmVyZW5jZUV4cGFuZGVyOiBSZWZlcmVuY2VFeHBhbmRlcjtcclxuXHRwcml2YXRlIHRlbXBsYXRlRW5naW5lOiBUZW1wbGF0ZUVuZ2luZTtcclxuXHRwcml2YXRlIGN1cnJlbnRSZWZlcmVuY2VzOiBGaWxlUmVmZXJlbmNlW10gPSBbXTtcclxuXHRwcml2YXRlIGlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcm9wczogQ2hhdFBhbmVsUHJvcHMpIHtcclxuXHRcdHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xyXG5cdFx0dGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cdFx0dGhpcy5jaGF0SGlzdG9yeSA9IHByb3BzLmNoYXRIaXN0b3J5IHx8IFtdO1xyXG5cdFx0dGhpcy5zZWxlY3RlZE1vZGVsID0gcHJvcHMuc2VsZWN0ZWRNb2RlbCB8fCAnZ2VtaW5pLTIuNS1mbGFzaCc7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0QiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZVN5c3RlbSgpO1xyXG5cclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlUGxhY2Vob2xkZXIoKTogdm9pZCB7XHJcblx0XHRjb25zdCBpc0VtcHR5ID0gdGhpcy5tZXNzYWdlSW5wdXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJyc7XHJcblx0XHRjb25zdCBpc0ZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLm1lc3NhZ2VJbnB1dDtcclxuXHJcblx0XHRpZiAoaXNFbXB0eSAmJiAhaXNGb2N1c2VkKSB7XHJcblx0XHRcdHRoaXMubWVzc2FnZUlucHV0LmNsYXNzTGlzdC5hZGQoJ2lzLWVtcHR5Jyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1lbXB0eScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dG9nZ2xlTW9kZWxEcm9wZG93bigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snO1xyXG5cdFx0aWYgKGlzVmlzaWJsZSkge1xyXG5cdFx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQ0QiBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG5cdFx0Y29uc3QgY29udGFpbmVyID0gdGhpcy5tb2RlbFNlbGVjdEJ1dHRvbi5jbG9zZXN0KCcuY2hhdC1pbnB1dC1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcblx0XHRjb25zdCBtb2RlbFNlbGVjdEJ1dHRvblJlY3QgPSB0aGlzLm1vZGVsU2VsZWN0QnV0dG9uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gXHUwNDFFXHUwNDMxXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0QiBcdTA0NDdcdTA0MzBcdTA0NDItXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4XHJcblx0XHRjb25zdCBkcm9wZG93blJlY3QgPSB0aGlzLm1vZGVsRHJvcGRvd24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblx0XHRjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBjaGF0UGFuZWxcclxuXHRcdC8vIFx1MDQxQlx1MDQzNVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0M0FcdTA0NDBcdTA0MzBcdTA0MzkgXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDNGXHUwNDM0XHUwNDMwXHUwNDQzXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDEgXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDRCXHUwNDNDIFx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFxyXG5cdFx0bGV0IGxlZnQgPSBtb2RlbFNlbGVjdEJ1dHRvblJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCAtIDU7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDM1XHUwNDQ0XHUwNDNFXHUwNDNCXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSAtIFx1MDQzRlx1MDQzRVx1MDQzNCBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0M0VcdTA0MzlcclxuXHRcdGxldCB0b3AgPSBtb2RlbFNlbGVjdEJ1dHRvblJlY3QuaGVpZ2h0O1xyXG5cclxuXHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDNGXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBkcm9wZG93biBcdTA0NDFcdTA0M0RcdTA0MzhcdTA0MzdcdTA0NDNcclxuXHRcdGNvbnN0IHNwYWNlQmVsb3cgPSB2aWV3cG9ydEhlaWdodCAtIG1vZGVsU2VsZWN0QnV0dG9uUmVjdC5ib3R0b207XHJcblx0XHRjb25zdCBzcGFjZUFib3ZlID0gbW9kZWxTZWxlY3RCdXR0b25SZWN0LnRvcDtcclxuXHJcblx0XHRpZiAoc3BhY2VCZWxvdyA8IGRyb3Bkb3duUmVjdC5oZWlnaHQgKyAxMCAmJiBzcGFjZUFib3ZlID4gZHJvcGRvd25SZWN0LmhlaWdodCArIDEwKSB7XHJcblx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0M0RcdTA0MzhcdTA0MzdcdTA0NDMgXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDNFIFx1MDQzQ1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMCBcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1XHUwNDQzIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQzRSwgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0M1xyXG5cdFx0XHR0b3AgPSAtZHJvcGRvd25SZWN0LmhlaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzBcclxuXHRcdGNvbnN0IG1heFJpZ2h0ID0gY29udGFpbmVyUmVjdC5yaWdodCAtIGNvbnRhaW5lclJlY3QubGVmdDtcclxuXHRcdGlmIChsZWZ0ICsgZHJvcGRvd25SZWN0LndpZHRoID4gbWF4UmlnaHQpIHtcclxuXHRcdFx0bGVmdCA9IG1heFJpZ2h0IC0gZHJvcGRvd25SZWN0LndpZHRoIC0gNTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MjNcdTA0MzFcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0NcdTA0NDFcdTA0NEYsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0MzRcdTA0NDBcdTA0M0VcdTA0M0ZcdTA0MzRcdTA0MzBcdTA0NDNcdTA0M0QgXHUwNDNEXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0MiBcdTA0MzdcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDRCIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzJcdTA0MzBcclxuXHRcdGlmIChsZWZ0IDwgMCkge1xyXG5cdFx0XHRsZWZ0ID0gMDtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcclxuXHRcdHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUucmlnaHQgPSAnYXV0byc7IC8vIFx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MSByaWdodCwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIGxlZnQgXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDNCIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQzRFx1MDQzRVxyXG5cclxuXHRcdC8vIFx1MDQyM1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0NcdTA0MzhcdTA0M0RcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NDNcdTA0NEUgXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDQzIFx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQzNFx1MDQzMFx1MDQ0M1x1MDQzRFx1MDQzMCwgXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzNSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzhcclxuXHRcdGxldCBtaW5XaWR0aCA9IE1hdGgubWluKGNvbnRhaW5lclJlY3Qud2lkdGggLyAyLCBkcm9wZG93blJlY3Qud2lkdGgpO1xyXG5cdFx0dGhpcy5tb2RlbERyb3Bkb3duLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG5cdFx0dGhpcy5tb2RlbERyb3Bkb3duLnN0eWxlLndpZHRoID0gJ2F1dG8nOyAvLyBcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDQzIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0NDMsIFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRDXHUwNDQ4XHUwNDM1IG1pbldpZHRoXHJcblx0fVxyXG5cclxuXHR1cGRhdGVNb2RlbERyb3Bkb3duKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnByb3BzLmF2YWlsYWJsZU1vZGVscykgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMubW9kZWxEcm9wZG93bi5pbm5lckhUTUwgPSB0aGlzLnByb3BzLmF2YWlsYWJsZU1vZGVsc1xyXG5cdFx0XHQubWFwKFxyXG5cdFx0XHRcdChtb2RlbCkgPT4gYFxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RlbC1vcHRpb25cIiBkYXRhLW1vZGVsPVwiJHttb2RlbH1cIj5cclxuXHRcdFx0XHRcdCR7bW9kZWx9XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdGBcclxuXHRcdFx0KVxyXG5cdFx0XHQuam9pbignJyk7XHJcblxyXG5cdFx0Ly8gQWRkIGV2ZW50IGxpc3RlbmVycyB0byBtb2RlbCBvcHRpb25zXHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24ucXVlcnlTZWxlY3RvckFsbCgnLm1vZGVsLW9wdGlvbicpLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG5cdFx0XHRvcHRpb24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbW9kZWwgPSAob3B0aW9uIGFzIEhUTUxFbGVtZW50KS5kYXRhc2V0Lm1vZGVsO1xyXG5cdFx0XHRcdGlmIChtb2RlbCkge1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRTZWxlY3RlZE1vZGVsKG1vZGVsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZXRTZWxlY3RlZE1vZGVsKG1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VsZWN0ZWRNb2RlbCA9IG1vZGVsO1xyXG5cdFx0Y29uc3QgbW9kZWxOYW1lRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNzZWxlY3RlZC1tb2RlbC1uYW1lJyk7XHJcblx0XHRpZiAobW9kZWxOYW1lRWxlbWVudCkge1xyXG5cdFx0XHRtb2RlbE5hbWVFbGVtZW50LnRleHRDb250ZW50ID0gbW9kZWw7XHJcblx0XHR9XHJcblx0XHR0aGlzLm1vZGVsRHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHR9XHJcblxyXG5cdGhhbmRsZUlucHV0KCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgdmFsdWUgPSB0aGlzLm1lc3NhZ2VJbnB1dC50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdGNvbnN0IGNvbW1hbmRzID0gWycvaGVscCcsICcvaW1hZ2luZScsICcvYW5hbHl6ZScsICcvc3VidGl0bGVzX21lZXQnLCAnL3N1YnRpdGxlc190ZWFtcycsICcvc3VtbWFyaXplJywgJy9jaGF0J107XHJcblxyXG5cdFx0aWYgKHZhbHVlLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG5cdFx0XHRjb25zdCBmaWx0ZXJlZENvbW1hbmRzID0gY29tbWFuZHMuZmlsdGVyKChjbWQpID0+IGNtZC5zdGFydHNXaXRoKHZhbHVlLnRvTG93ZXJDYXNlKCkpKTtcclxuXHRcdFx0dGhpcy5zaG93U3VnZ2VzdGlvbnMoZmlsdGVyZWRDb21tYW5kcyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c2hvd1N1Z2dlc3Rpb25zKHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSk6IHZvaWQge1xyXG5cdFx0aWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5pbm5lckhUTUwgPSBzdWdnZXN0aW9ucy5tYXAoKHN1Z2dlc3Rpb24pID0+IGA8ZGl2IGNsYXNzPVwic3VnZ2VzdGlvbi1pdGVtXCI+JHtzdWdnZXN0aW9ufTwvZGl2PmApLmpvaW4oJycpO1xyXG5cclxuXHRcdHRoaXMuc3VnZ2VzdGlvbnNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG5cdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQVx1MDQzOCBcdTA0M0FcdTA0M0JcdTA0MzhcdTA0M0FcdTA0M0VcdTA0MzIgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0dGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc3VnZ2VzdGlvbi1pdGVtJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG5cdFx0XHRpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMubWVzc2FnZUlucHV0LnRleHRDb250ZW50ID0gaXRlbS50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdFx0XHR0aGlzLmhpZGVTdWdnZXN0aW9ucygpO1xyXG5cdFx0XHRcdHRoaXMubWVzc2FnZUlucHV0LmZvY3VzKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRoaWRlU3VnZ2VzdGlvbnMoKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MjBcdTA0MzVcdTA0M0RcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDM5XHUwNDNEXHUwNDM1XHUwNDQwIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyByZW5kZXJIaXN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgaGlzdG9yeUNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNjaGF0LWhpc3RvcnknKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdGhpc3RvcnlDb250YWluZXIuZW1wdHkoKTtcclxuXHJcblx0XHRmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmNoYXRIaXN0b3J5KSB7XHJcblx0XHRcdGNvbnN0IG1lc3NhZ2VFbCA9IGhpc3RvcnlDb250YWluZXIuY3JlYXRlRGl2KHtcclxuXHRcdFx0XHRjbHM6IGBtZXNzYWdlICR7bXNnLnJvbGV9IG1lc3NhZ2UtdHlwZS0ke21zZy50eXBlIHx8ICdkZWZhdWx0J30gZ3JvdXAvdHVybi1tZXNzYWdlc2BcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUNcdTA0MzVcdTA0NDJcdTA0MzBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEZcclxuXHRcdFx0Y29uc3QgbWV0YURpdiA9IG1lc3NhZ2VFbC5jcmVhdGVEaXYoeyBjbHM6ICdjaGF0LW1ldGEnIH0pO1xyXG5cdFx0XHRjb25zdCBzZW5kZXJJbmZvRGl2ID0gbWV0YURpdi5jcmVhdGVEaXYoeyBjbHM6ICdjaGF0LXNlbmRlci1pbmZvJyB9KTtcclxuXHRcdFx0Y29uc3QgaWNvbkRpdiA9IHNlbmRlckluZm9EaXYuY3JlYXRlRGl2KHsgY2xzOiAnY2hhdC1tZXNzYWdlLWljb24nIH0pO1xyXG5cdFx0XHRpY29uRGl2LmlubmVySFRNTCA9XHJcblx0XHRcdFx0bXNnLnJvbGUgPT09ICd1c2VyJ1xyXG5cdFx0XHRcdFx0PyBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS11c2VyXCI+PHBhdGggZD1cIk0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyXCI+PC9wYXRoPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiN1wiIHI9XCI0XCI+PC9jaXJjbGU+PC9zdmc+YFxyXG5cdFx0XHRcdFx0OiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGNsYXNzPVwibHVjaWRlIGx1Y2lkZS1ib3RcIj48cGF0aCBkPVwiTTEyIDhWNEg4XCI+PC9wYXRoPjxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxMlwiIHg9XCI0XCIgeT1cIjhcIiByeD1cIjJcIj48L3JlY3Q+PHBhdGggZD1cIk0yIDE0aDJcIj48L3BhdGg+PHBhdGggZD1cIk0yMCAxNGgyXCI+PC9wYXRoPjxwYXRoIGQ9XCJNMTUgMTN2MlwiPjwvcGF0aD48cGF0aCBkPVwiTTkgMTN2MlwiPjwvcGF0aD48L3N2Zz5gO1xyXG5cdFx0XHRzZW5kZXJJbmZvRGl2LmNyZWF0ZVNwYW4oeyBjbHM6ICdjaGF0LXJvbGUtbGFiZWwnLCB0ZXh0OiB0aGlzLmdldFJvbGVMYWJlbChtc2cucm9sZSkgfSk7XHJcblxyXG5cdFx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcdTA0NEJcclxuXHRcdFx0aWYgKG1zZy5hdHRhY2htZW50cyAmJiBtc2cuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRzQ29udGFpbmVyID0gbWVzc2FnZUVsLmNyZWF0ZURpdih7IGNsczogJ21lc3NhZ2UtYXR0YWNobWVudHMnIH0pO1xyXG5cclxuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgbXNnLmF0dGFjaG1lbnRzKSB7XHJcblx0XHRcdFx0XHRjb25zdCBib3ggPSB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRCb3goYXR0YWNobWVudCk7XHJcblx0XHRcdFx0XHRhdHRhY2htZW50c0NvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDFBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRjb25zdCBjb250ZW50RGl2ID0gbWVzc2FnZUVsLmNyZWF0ZURpdih7IGNsczogJ2NoYXQtbWVzc2FnZS1jb250ZW50JyB9KTtcclxuXHRcdFx0YXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihtc2cuY29udGVudCwgY29udGVudERpdiwgJycsIHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHJcblx0XHRcdHRoaXMuY3JlYXRlTWVzc2FnZVRvb2xzZXQobWVzc2FnZUVsLCBtc2cuY29udGVudCwgbXNnLm5vZGVfaWQsIG1zZy5ncmFwaF9pZCB8fCAnJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDQzXHUwNDQyXHUwNDNBXHUwNDMwXHJcblx0XHRpZiAodGhpcy5jaGF0SGlzdG9yeS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmNsb3Nlc3QoJy52aWV3LWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuXHRcdFx0XHRpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRzY3JvbGxDb250YWluZXIuc2Nyb2xsVG9wID0gc2Nyb2xsQ29udGFpbmVyLnNjcm9sbEhlaWdodDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIDApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDEgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQzOC5cclxuXHQgKi9cclxuXHRwcml2YXRlIGNyZWF0ZUF0dGFjaG1lbnRCb3goYXR0YWNobWVudDogQXR0YWNobWVudCk6IEhUTUxFbGVtZW50IHtcclxuXHRcdGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHJcblx0XHQvLyBcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDQxXHUwNDQxXHUwNDRCIFx1MDQzMiBcdTA0MzdcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDFcdTA0MzhcdTA0M0NcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDNFXHUwNDQyIFx1MDQ0Mlx1MDQzOFx1MDQzRlx1MDQzMCBcdTA0MzggcGVybWFuZW50XHJcblx0XHRjb25zdCBwZXJtYW5lbnRDbGFzcyA9IGF0dGFjaG1lbnQucGVybWFuZW50ID8gJ3Blcm1hbmVudCcgOiAnc2luZ2xlJztcclxuXHRcdGJveC5jbGFzc05hbWUgPSBgcmVmZXJlbmNlLWJveCBhdHRhY2htZW50LWJveCAke2F0dGFjaG1lbnQudHlwZX0gJHtwZXJtYW5lbnRDbGFzc30gY2xpY2thYmxlYDtcclxuXHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnLCBhdHRhY2htZW50LnR5cGUpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJywgYXR0YWNobWVudC5uYW1lKTtcclxuXHRcdGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc291cmNlLXBhdGgnLCBhdHRhY2htZW50LnNvdXJjZVBhdGgpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1jYWNoZWQtcGF0aCcsIGF0dGFjaG1lbnQuY2FjaGVkUGF0aCk7XHJcblx0XHRib3guc2V0QXR0cmlidXRlKCdkYXRhLXV1aWQnLCBhdHRhY2htZW50LnV1aWQpO1xyXG5cdFx0Ym94LnNldEF0dHJpYnV0ZSgnZGF0YS1wZXJtYW5lbnQnLCBTdHJpbmcoYXR0YWNobWVudC5wZXJtYW5lbnQpKTtcclxuXHJcblx0XHRib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuaGFuZGxlQXR0YWNobWVudENsaWNrKGF0dGFjaG1lbnQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Y29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdGljb24uY2xhc3NOYW1lID0gJ3JlZmVyZW5jZS1pY29uJztcclxuXHJcblx0XHRpZiAoYXR0YWNobWVudC50eXBlID09PSAncHJvbXB0Jykge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1MjZBMSc7XHJcblx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2V4dGVybmFsJykge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDRSc7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNCc7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuXHRcdG5hbWUuY2xhc3NOYW1lID0gJ3JlZmVyZW5jZS1uYW1lJztcclxuXHRcdG5hbWUudGV4dENvbnRlbnQgPSBhdHRhY2htZW50Lm5hbWU7XHJcblxyXG5cdFx0Ym94LmFwcGVuZENoaWxkKGljb24pO1xyXG5cdFx0Ym94LmFwcGVuZENoaWxkKG5hbWUpO1xyXG5cclxuXHRcdHJldHVybiBib3g7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDNCXHUwNDM4XHUwNDNBIFx1MDQzRlx1MDQzRSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcdTA0NDMgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICovXHJcblx0cHJpdmF0ZSBhc3luYyBoYW5kbGVBdHRhY2htZW50Q2xpY2soYXR0YWNobWVudDogQXR0YWNobWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzBcclxuXHRcdGNvbnN0IGNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIodGhpcy5wcm9wcy5wbHVnaW4pO1xyXG5cdFx0Y29uc3QgY2FjaGVFeGlzdHMgPSBhd2FpdCBjYWNoZU1hbmFnZXIuY2FjaGVkRmlsZUV4aXN0cyhhdHRhY2htZW50LmNhY2hlZFBhdGgpO1xyXG5cclxuXHRcdGxldCBwYXRoVG9PcGVuOiBzdHJpbmc7XHJcblxyXG5cdFx0aWYgKGNhY2hlRXhpc3RzKSB7XHJcblx0XHRcdC8vIFx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0FcdTA0MzVcdTA0NDhcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHJcblx0XHRcdGNvbnN0IGNhY2hlRm9sZGVyUGF0aCA9IHRoaXMucHJvcHMucGx1Z2luLnNldHRpbmdzLnJlZkNhY2hlRm9sZGVyO1xyXG5cdFx0XHRwYXRoVG9PcGVuID0gdGhpcy5wcm9wcy5wbHVnaW4uYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSArICcvJyArIGNhY2hlRm9sZGVyUGF0aCArICcvJyArIGF0dGFjaG1lbnQuY2FjaGVkUGF0aDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFx1MDQxQVx1MDQzNVx1MDQ0OCBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNELCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlxyXG5cdFx0XHRpZiAoYXR0YWNobWVudC50eXBlID09PSAnZXh0ZXJuYWwnKSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IGF0dGFjaG1lbnQuc291cmNlUGF0aDsgLy8gXHUwNDIzXHUwNDM2XHUwNDM1IFx1MDQzMFx1MDQzMVx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0RVx1MDQ0Mlx1MDQzRFx1MDQ0Qlx1MDQzOVxyXG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQudHlwZSA9PT0gJ2ZpbGUnKSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IHRoaXMucHJvcHMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgKyAnLycgKyBhdHRhY2htZW50LnNvdXJjZVBhdGg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cGF0aFRvT3BlbiA9IHRoaXMucHJvcHMucGx1Z2luLnNldHRpbmdzLnByb21wdHNGb2xkZXIgKyAnLycgKyBhdHRhY2htZW50LnNvdXJjZVBhdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLm9wZW5FeHRlcm5hbEZpbGUocGF0aFRvT3Blbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzOFx1MDQzNyBcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzhcdTA0M0JcdTA0MzhcdTA0NDlcdTA0MzAgT2JzaWRpYW5cclxuXHQgKi9cclxuXHRwcml2YXRlIG9wZW5WYXVsdEZpbGUocGF0aDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRjb25zdCBmaWxlID0gdGhpcy5wcm9wcy5wbHVnaW4uYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcclxuXHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHRcdFx0dGhpcy5wcm9wcy5wbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5vcGVuRmlsZShmaWxlKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG5ldyBOb3RpY2UoYFx1MDQyNFx1MDQzMFx1MDQzOVx1MDQzQiBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNEOiAke3BhdGh9YCwgMzAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBUT0RPOiBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0NDFcdTA0NDJcdTA0M0VcdTA0Mzkgd2luZG93LmVsZWN0cm9uLnNoZWxsLm9wZW5QYXRoKGFic29sdXRlUGF0aCkgXHUwNDNEXHUwNDM1IFx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQzMFx1MDQzNVx1MDQ0MlxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzRlx1MDQzRSBcdTA0MzBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQzXHUwNDQyXHUwNDM4XHJcblx0ICovXHJcblx0cHJpdmF0ZSBvcGVuRXh0ZXJuYWxGaWxlKGFic29sdXRlUGF0aDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHRpZiAoIXdpbmRvdy5yZXF1aXJlKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignXHUwNDFEXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM3XHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzMiBcdTA0MzJcdTA0MzVcdTA0MzEtXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4OicsIGFic29sdXRlUGF0aCk7XHJcblx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0NDUgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzRlx1MDQzRFx1MDQzRSBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDMyIGRlc2t0b3AtXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM4JywgMzAwMCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRjb25zdCB7IGV4ZWMgfSA9IHdpbmRvdy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XHJcblx0XHRcdGNvbnN0IHBhdGggPSB3aW5kb3cucmVxdWlyZSgncGF0aCcpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQzRFx1MDQzNFx1MDQ0MyBcdTA0MzIgXHUwNDM3XHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQxXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzRVx1MDQ0MiBcdTA0M0ZcdTA0M0JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0NEJcclxuXHRcdFx0bGV0IGNvbW1hbmQ6IHN0cmluZztcclxuXHRcdFx0Y29uc3QgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtO1xyXG5cclxuXHRcdFx0aWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcblx0XHRcdFx0Ly8gV2luZG93czogXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIHN0YXJ0XHJcblx0XHRcdFx0Y29tbWFuZCA9IGBzdGFydCBcIlwiIFwiJHthYnNvbHV0ZVBhdGh9XCJgO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG5cdFx0XHRcdC8vIG1hY09TOiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0Mgb3BlblxyXG5cdFx0XHRcdGNvbW1hbmQgPSBgb3BlbiBcIiR7YWJzb2x1dGVQYXRofVwiYDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBMaW51eDogXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIHhkZy1vcGVuXHJcblx0XHRcdFx0Y29tbWFuZCA9IGB4ZGctb3BlbiBcIiR7YWJzb2x1dGVQYXRofVwiYDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZXhlYyhjb21tYW5kLCAoZXJyb3I6IEVycm9yIHwgbnVsbCkgPT4ge1xyXG5cdFx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCXHUwNDMwOicsIGVycm9yKTtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoYFx1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQjogJHtlcnJvci5tZXNzYWdlfWAsIDMwMDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MUVcdTA0NDhcdTA0MzhcdTA0MzFcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQ0Mlx1MDQzQVx1MDQzNSBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCOicsIGVycm9yKTtcclxuXHRcdFx0bmV3IE5vdGljZShgXHUwNDFEXHUwNDM1IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzRVx1MDQ0MVx1MDQ0QyBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCOiAke2Vycm9yLm1lc3NhZ2V9YCwgMzAwMCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0M0VcdTA0MzdcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDNFXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM1XHUwNDNDXHUwNDQzXHUwNDRFIFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDNFXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Ri5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcm9sZSAtIFx1MDQyMFx1MDQzRVx1MDQzQlx1MDQ0QyBcdTA0M0VcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIChcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsICd1c2VyJywgJ2Fzc2lzdGFudCcpLlxyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFx1MDQxQlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDQwXHUwNDNFXHUwNDNCXHUwNDM4LlxyXG5cdCAqL1xyXG5cdGdldFJvbGVMYWJlbChyb2xlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoIChyb2xlKSB7XHJcblx0XHRcdGNhc2UgJ3VzZXInOlxyXG5cdFx0XHRcdHJldHVybiAnXHUwNDEyXHUwNDRCOic7XHJcblx0XHRcdGNhc2UgJ2Fzc2lzdGFudCc6XHJcblx0XHRcdFx0cmV0dXJuICdMTE0gXHUwNDEwXHUwNDMzXHUwNDM1XHUwNDNEXHUwNDQyOic7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmV0dXJuIGAke3JvbGV9OmA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRFIFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDQxXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzNVx1MDQ1MS5cclxuXHQgKiBAcGFyYW0ge0NoYXRIaXN0b3J5SXRlbVtdfSBuZXdIaXN0b3J5IC0gXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQzQ1x1MDQzMFx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMiBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQ0N1x1MDQzMFx1MDQ0Mlx1MDQzMC5cclxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cclxuXHQgKi9cclxuXHRhc3luYyB1cGRhdGVIaXN0b3J5KG5ld0hpc3Rvcnk6IENoYXRIaXN0b3J5SXRlbVtdKTogUHJvbWlzZTx2b2lkPiB7XHJcblx0XHR0aGlzLmNoYXRIaXN0b3J5ID0gbmV3SGlzdG9yeTtcclxuXHRcdGF3YWl0IHRoaXMucmVuZGVySGlzdG9yeSgpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlQXZhaWxhYmxlTW9kZWxzKG1vZGVsczogc3RyaW5nW10pOiB2b2lkIHtcclxuXHRcdHRoaXMucHJvcHMuYXZhaWxhYmxlTW9kZWxzID0gbW9kZWxzO1xyXG5cdFx0dGhpcy51cGRhdGVNb2RlbERyb3Bkb3duKCk7XHJcblx0fVxyXG5cclxuXHRkZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmRlc3Ryb3koKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFN5c3RlbSBJbml0aWFsaXphdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDM3XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIGluaXRpYWxpemVSZWZlcmVuY2VTeXN0ZW0oKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucHJvcHMucGx1Z2luKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignUGx1Z2luIFx1MDQzRFx1MDQzNSBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0QgXHUwNDMyIENoYXRQYW5lbCwgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzAnKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlciA9IG5ldyBBdXRvY29tcGxldGVNYW5hZ2VyKHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHRcdHRoaXMudGVtcGxhdGVFbmdpbmUgPSBuZXcgVGVtcGxhdGVFbmdpbmUodGhpcy5wcm9wcy5wbHVnaW4pO1xyXG5cdFx0dGhpcy5jYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKHRoaXMucHJvcHMucGx1Z2luKTtcclxuXHRcdHRoaXMucmVmZXJlbmNlRXhwYW5kZXIgPSBuZXcgUmVmZXJlbmNlRXhwYW5kZXIodGhpcy5wcm9wcy5wbHVnaW4sIHRoaXMudGVtcGxhdGVFbmdpbmUpO1xyXG5cdH1cclxuXHJcblx0Ly8gXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzNCBpbml0KCk6XHJcblx0aW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IGBcclxuXHRcdFx0PGRpdiBjbGFzcz1cImxsbS1hZ2VudC1jaGF0LXBhbmVsXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXQtaGlzdG9yeVwiIGlkPVwiY2hhdC1oaXN0b3J5XCI+PC9kaXY+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImNoYXQtaW5wdXQtY29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IFxyXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBcclxuXHRcdFx0XHRcdFx0XHRkYXRhLXRlc3RpZD1cImVkaXRvci1pbnB1dC1tYWluXCIgXHJcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJtZXNzYWdlLWlucHV0LWVkaXRvclwiIFxyXG5cdFx0XHRcdFx0XHRcdHRhYmluZGV4PVwiMFwiXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS1wbGFjZWhvbGRlcj1cIlx1MDQxMlx1MDQzMlx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUsIEBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0IsICNcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIsICRcdTA0MzJcdTA0M0RcdTA0MzVcdTA0NDhcdTA0M0RcdTA0MzhcdTA0MzlfXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0M0VcdTA0M0NcdTA0MzBcdTA0M0RcdTA0MzRcdTA0NDMgKC8pXCJcclxuXHRcdFx0XHRcdFx0PjwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYXR0YWNoZWQtZmlsZXMtY29udGFpbmVyXCIgaWQ9XCJhdHRhY2hlZC1maWxlcy1jb250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjaGF0LWNvbnRyb2xzXCI+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb250cm9sLWJ1dHRvbnMtbGVmdFwiPlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RlbC1zZWxlY3QtY29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwibW9kZWwtc2VsZWN0LWJ1dHRvblwiIGlkPVwibW9kZWwtc2VsZWN0LWJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1vZGVsLW5hbWVcIiBpZD1cInNlbGVjdGVkLW1vZGVsLW5hbWVcIj4ke3RoaXMuc2VsZWN0ZWRNb2RlbH08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzdmcgY2xhc3M9XCJkcm9wZG93bi1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgZD1cIm0xOS41IDguMjUtNy41IDcuNS03LjUtNy41XCI+PC9wYXRoPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L3N2Zz5cclxuXHRcdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGVsLWRyb3Bkb3duXCIgaWQ9XCJtb2RlbC1kcm9wZG93blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiY3VzdG9tLXByb21wdC1pbmRpY2F0b3JcIiBpZD1cImN1c3RvbS1wcm9tcHQtaW5kaWNhdG9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGEtdG9vbHRpcC1wb3NpdGlvbj1cInRvcFwiIGFyaWEtbGFiZWw9XCJcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0ZcdTA0NDIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzNcdTA0NDBcdTA0MzBcdTA0NDRcdTA0MzBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHUyNjk5XHVGRTBGXHJcblx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29udHJvbC1idXR0b25zLXJpZ2h0XCI+XHJcblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cInN0b3AtYnV0dG9uXCIgaWQ9XCJzdG9wLWJ1dHRvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RvcC1pY29uXCI+XHUyNUEwPC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCIgaWQ9XCJzZW5kLWJ1dHRvblwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdWJtaXQtdGV4dFwiPlx1MjNDRSBFbnRlcjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uc1wiIGlkPVwic3VnZ2VzdGlvbnNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XHJcblx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0YDtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dCA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5tZXNzYWdlLWlucHV0LWVkaXRvcicpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0dGhpcy5zZW5kQnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI3NlbmQtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblx0XHR0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI3N1Z2dlc3Rpb25zJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblx0XHR0aGlzLm1vZGVsU2VsZWN0QnV0dG9uID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignI21vZGVsLXNlbGVjdC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHRcdHRoaXMubW9kZWxEcm9wZG93biA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJyNtb2RlbC1kcm9wZG93bicpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3IgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjY3VzdG9tLXByb21wdC1pbmRpY2F0b3InKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcblx0XHR0aGlzLnN0b3BCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjc3RvcC1idXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuXHJcblx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYXR0YWNoZWQtZmlsZXMtY29udGFpbmVyJykgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblxyXG5cdFx0dGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XHJcblx0XHR0aGlzLnNldHVwUmVmZXJlbmNlU3lzdGVtKCk7XHJcblx0XHR0aGlzLnJlbmRlckhpc3RvcnkoKTtcclxuXHRcdHRoaXMudXBkYXRlTW9kZWxEcm9wZG93bigpO1xyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG5cdFx0dGhpcy51cGRhdGVDdXN0b21TeXN0ZW1Qcm9tcHRTdGF0dXModGhpcy5wcm9wcy5jdXJyZW50R3JhcGhDdXN0b21TeXN0ZW1Qcm9tcHQpO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFN5c3RlbSBTZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzNVx1MDQzQ1x1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldHVwUmVmZXJlbmNlU3lzdGVtKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmF1dG9jb21wbGV0ZU1hbmFnZXIpIHJldHVybjtcclxuXHJcblx0XHQvLyBcdTA0MThcdTA0M0RcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzBcdTA0M0JcdTA0MzhcdTA0MzdcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCXHUwNDM4XHUwNDQyXHJcblx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSA9IG5ldyBSZWZlcmVuY2VBdXRvY29tcGxldGUodGhpcy5tZXNzYWdlSW5wdXQsIHRoaXMuYXV0b2NvbXBsZXRlTWFuYWdlcik7XHJcblxyXG5cdFx0Ly8gXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0Mlx1MDQ0N1x1MDQzOFx1MDQzQSBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHJcblx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5vbkl0ZW1TZWxlY3RlZCgoaXRlbTogQXV0b2NvbXBsZXRlSXRlbSwgbWF0Y2g6IFJlZmVyZW5jZU1hdGNoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVwbGFjZVJlZmVyZW5jZVdpdGhCb3gobWF0Y2gsIGl0ZW0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDM0IHNldHVwRXZlbnRMaXN0ZW5lcnMoKTpcclxuXHRzZXR1cEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVTZW5kV2l0aFJlZmVyZW5jZXMoKSk7XHJcblxyXG5cdFx0dGhpcy5tZXNzYWdlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSAmJiB0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5oYW5kbGVLZXlkb3duKGUpKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xyXG5cdFx0XHRcdGlmICh0aGlzLnN1Z2dlc3Rpb25zQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGZpcnN0U3VnZ2VzdGlvbiA9IHRoaXMuc3VnZ2VzdGlvbnNDb250YWluZXIucXVlcnlTZWxlY3RvcignLnN1Z2dlc3Rpb24taXRlbScpO1xyXG5cdFx0XHRcdFx0aWYgKGZpcnN0U3VnZ2VzdGlvbikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1lc3NhZ2VJbnB1dC50ZXh0Q29udGVudCA9IGZpcnN0U3VnZ2VzdGlvbi50ZXh0Q29udGVudCB8fCAnJztcclxuXHRcdFx0XHRcdFx0dGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcclxuXHRcdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRoaXMuaGFuZGxlU2VuZFdpdGhSZWZlcmVuY2VzKCk7XHJcblx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oYW5kbGVJbnB1dCgpO1xyXG5cdFx0XHR0aGlzLmhhbmRsZVJlZmVyZW5jZUlucHV0KCk7XHJcblx0XHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMubWVzc2FnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1lc3NhZ2VJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZVBsYWNlaG9sZGVyKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm1vZGVsU2VsZWN0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy50b2dnbGVNb2RlbERyb3Bkb3duKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnN0b3BCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN0b3BHZW5lcmF0aW9uKCkpO1xyXG5cclxuXHRcdC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxyXG5cdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG5cdFx0XHRpZiAoIXRoaXMubW9kZWxTZWxlY3RCdXR0b24uY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkgJiYgIXRoaXMubW9kZWxEcm9wZG93bi5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkge1xyXG5cdFx0XHRcdHRoaXMubW9kZWxEcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICghdGhpcy5zdWdnZXN0aW9uc0NvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkge1xyXG5cdFx0XHRcdHRoaXMuaGlkZVN1Z2dlc3Rpb25zKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIFByb2Nlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzMVx1MDQzMFx1MDQ0Mlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzQgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzMCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0VcdTA0M0FcclxuXHQgKi9cclxuXHRwcml2YXRlIGhhbmRsZVJlZmVyZW5jZUlucHV0KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSB8fCB0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSkgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHRcdGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblx0XHRjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25JblRleHQoKTtcclxuXHJcblx0XHRpZiAoY3Vyc29yUG9zaXRpb24gPT09IC0xKSB7XHJcblx0XHRcdHRoaXMucmVmZXJlbmNlQXV0b2NvbXBsZXRlLmhpZGVBdXRvY29tcGxldGUoKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHRleHQgPSB0aGlzLmdldFRleHRDb250ZW50KCk7XHJcblx0XHRjb25zdCBjdXJyZW50UmVmID0gUmVmZXJlbmNlUGFyc2VyLmdldEN1cnJlbnRSZWZlcmVuY2UodGV4dCwgY3Vyc29yUG9zaXRpb24pO1xyXG5cclxuXHRcdGlmIChjdXJyZW50UmVmKSB7XHJcblx0XHRcdC8vIFx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0NERcdTA0M0FcdTA0NDBcdTA0MzBcdTA0M0RcdTA0MzVcclxuXHRcdFx0Y29uc3QgY3Vyc29yUmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5zaG93QXV0b2NvbXBsZXRlKGN1cnJlbnRSZWYsIGN1cnNvclJlY3QpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5yZWZlcmVuY2VBdXRvY29tcGxldGUuaGlkZUF1dG9jb21wbGV0ZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQzMlx1MDQzOFx1MDQzN1x1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDFcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlcGxhY2VSZWZlcmVuY2VXaXRoQm94KG1hdGNoOiBSZWZlcmVuY2VNYXRjaCwgaXRlbTogQXV0b2NvbXBsZXRlSXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5pc1Byb2Nlc3NpbmdSZWZlcmVuY2UgPSB0cnVlO1xyXG5cclxuXHRcdGNvbnN0IHJlZmVyZW5jZTogRmlsZVJlZmVyZW5jZSA9IHtcclxuXHRcdFx0dHlwZTogaXRlbS50eXBlLFxyXG5cdFx0XHRuYW1lOiBpdGVtLm5hbWUsXHJcblx0XHRcdHBhdGg6IGl0ZW0ucGF0aCxcclxuXHRcdFx0cGVybWFuZW50OiBtYXRjaC5wcmVmaXgubGVuZ3RoID09PSAyIC8vIEBAIFx1MDQzOFx1MDQzQlx1MDQzOCAjI1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBcdTA0MjFcdTA0M0VcdTA0MzdcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHJcblx0XHRjb25zdCBib3ggPSBSZWZlcmVuY2VCb3guY3JlYXRlQm94KHJlZmVyZW5jZSk7XHJcblxyXG5cdFx0Ly8gXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzOSBSYW5nZSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRCXHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblx0XHRpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG5cdFx0XHR0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG5cdFx0Ly8gXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0ZcdTA0MzBcdTA0MzdcdTA0M0VcdTA0M0QgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiwgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMCBtYXRjaC5zdGFydEluZGV4IFx1MDQzOCBtYXRjaC5lbmRJbmRleFxyXG5cdFx0Ly8gXHUwNDFEXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDNDXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzUgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCLCBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDM4XHUwNDNDIFx1MDQzOFx1MDQzRFx1MDQzNFx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQzMFx1MDQzQ1xyXG5cdFx0Y29uc3QgeyBzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBlbmROb2RlLCBlbmRPZmZzZXQgfSA9IHRoaXMuZmluZE5vZGVzQW5kT2Zmc2V0c0Zvck1hdGNoKG1hdGNoKTtcclxuXHJcblx0XHRpZiAoIXN0YXJ0Tm9kZSB8fCAhZW5kTm9kZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0NEIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzgnLCBtYXRjaCk7XHJcblx0XHRcdHRoaXMuaXNQcm9jZXNzaW5nUmVmZXJlbmNlID0gZmFsc2U7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCByZXBsYWNlbWVudFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuXHRcdHJlcGxhY2VtZW50UmFuZ2Uuc2V0U3RhcnQoc3RhcnROb2RlLCBzdGFydE9mZnNldCk7XHJcblx0XHRyZXBsYWNlbWVudFJhbmdlLnNldEVuZChlbmROb2RlLCBlbmRPZmZzZXQpO1xyXG5cclxuXHRcdHJlcGxhY2VtZW50UmFuZ2UuZGVsZXRlQ29udGVudHMoKTsgLy8gXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzhcclxuXHRcdHJlcGxhY2VtZW50UmFuZ2UuaW5zZXJ0Tm9kZShib3gpOyAvLyBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxXHJcblxyXG5cdFx0Ly8gXHUwNDFFXHUwNDQ3XHUwNDM4XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0c2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG5cclxuXHRcdC8vIFx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDMgXHUwNDMyIFx1MDQ0MVx1MDQzRlx1MDQzOFx1MDQ0MVx1MDQzRVx1MDQzQSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0NDUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBXHJcblx0XHR0aGlzLmN1cnJlbnRSZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcclxuXHJcblx0XHR0aGlzLmlzUHJvY2Vzc2luZ1JlZmVyZW5jZSA9IGZhbHNlO1xyXG5cclxuXHRcdC8vIFx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0IgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzMCBcdTA0MzggXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDQ5XHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MCBcdTA0MzdcdTA0MzAgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFXHJcblx0XHR0aGlzLmluc2VydFNwYWNlQW5kU2V0Q3Vyc29yQWZ0ZXJFbGVtZW50KGJveCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MURcdTA0MzBcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0NDIgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDRCIFx1MDQzOCBcdTA0NDFcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBtYXRjaCBcdTA0MzIgY29udGVudGVkaXRhYmxlIFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzNS5cclxuXHQgKiBAcGFyYW0gbWF0Y2ggLSBcdTA0M0VcdTA0MzFcdTA0NEFcdTA0MzVcdTA0M0FcdTA0NDIgUmVmZXJlbmNlTWF0Y2guXHJcblx0ICogQHJldHVybnMgXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDNBXHUwNDQyIFx1MDQ0MSBzdGFydE5vZGUsIHN0YXJ0T2Zmc2V0LCBlbmROb2RlLCBlbmRPZmZzZXQuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kTm9kZXNBbmRPZmZzZXRzRm9yTWF0Y2gobWF0Y2g6IFJlZmVyZW5jZU1hdGNoKToge1xyXG5cdFx0c3RhcnROb2RlOiBOb2RlIHwgbnVsbDtcclxuXHRcdHN0YXJ0T2Zmc2V0OiBudW1iZXI7XHJcblx0XHRlbmROb2RlOiBOb2RlIHwgbnVsbDtcclxuXHRcdGVuZE9mZnNldDogbnVtYmVyO1xyXG5cdH0ge1xyXG5cdFx0bGV0IHN0YXJ0Tm9kZTogTm9kZSB8IG51bGwgPSBudWxsO1xyXG5cdFx0bGV0IHN0YXJ0T2Zmc2V0ID0gMDtcclxuXHRcdGxldCBlbmROb2RlOiBOb2RlIHwgbnVsbCA9IG51bGw7XHJcblx0XHRsZXQgZW5kT2Zmc2V0ID0gMDtcclxuXHRcdGxldCBjdXJyZW50TGVuZ3RoID0gMDtcclxuXHJcblx0XHRjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKHRoaXMubWVzc2FnZUlucHV0LCBOb2RlRmlsdGVyLlNIT1dfQUxMKTsgLy8gU0hPV19BTEwsIFx1MDQ0N1x1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0QiBcdTA0NDNcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDM4IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0QlxyXG5cdFx0bGV0IG5vZGU6IE5vZGUgfCBudWxsOyAvLyBcdTA0MjNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBub2RlIFx1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgbnVsbFxyXG5cclxuXHRcdHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSkge1xyXG5cdFx0XHRpZiAoIW5vZGUpIGJyZWFrOyAvLyBcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDNBXHUwNDQzIFx1MDQzRFx1MDQzMCBudWxsXHJcblxyXG5cdFx0XHRjb25zdCBub2RlVGV4dExlbmd0aCA9IHRoaXMuZ2V0Tm9kZUVxdWl2YWxlbnRMZW5ndGhGb3JSZWZlcmVuY2VQYXJzaW5nKG5vZGUpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDNDLCBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzhcdTA0M0RcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0MzIgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzNVxyXG5cdFx0XHRpZiAoY3VycmVudExlbmd0aCA8PSBtYXRjaC5zdGFydEluZGV4ICYmIG1hdGNoLnN0YXJ0SW5kZXggPCBjdXJyZW50TGVuZ3RoICsgbm9kZVRleHRMZW5ndGgpIHtcclxuXHRcdFx0XHRzdGFydE5vZGUgPSBub2RlO1xyXG5cdFx0XHRcdHN0YXJ0T2Zmc2V0ID0gbWF0Y2guc3RhcnRJbmRleCAtIGN1cnJlbnRMZW5ndGg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Rlx1MDQzNVx1MDQzQywgXHUwNDM3XHUwNDMwXHUwNDNBXHUwNDMwXHUwNDNEXHUwNDQ3XHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzAgXHUwNDMyIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzVcclxuXHRcdFx0aWYgKGN1cnJlbnRMZW5ndGggPD0gbWF0Y2guZW5kSW5kZXggJiYgbWF0Y2guZW5kSW5kZXggPD0gY3VycmVudExlbmd0aCArIG5vZGVUZXh0TGVuZ3RoKSB7XHJcblx0XHRcdFx0ZW5kTm9kZSA9IG5vZGU7XHJcblx0XHRcdFx0ZW5kT2Zmc2V0ID0gbWF0Y2guZW5kSW5kZXggLSBjdXJyZW50TGVuZ3RoO1xyXG5cdFx0XHRcdGJyZWFrOyAvLyBcdTA0MURcdTA0MzBcdTA0NDhcdTA0M0JcdTA0MzggXHUwNDNFXHUwNDMxXHUwNDMwLCBcdTA0MzJcdTA0NEJcdTA0NDVcdTA0M0VcdTA0MzRcdTA0MzhcdTA0M0NcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMCBcdTA0M0VcdTA0NDVcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiwgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QywgZW5kTm9kZSBcdTA0MzVcdTA0NDlcdTA0MzUgXHUwNDNEXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzOVx1MDQzNFx1MDQzNVx1MDQzRCxcclxuXHRcdFx0Ly8gXHUwNDNEXHUwNDNFIFx1MDQzQ1x1MDQ0QiBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ4XHUwNDNCXHUwNDM4IHN0YXJ0Tm9kZS5cclxuXHRcdFx0aWYgKHN0YXJ0Tm9kZSAmJiAhZW5kTm9kZSAmJiBtYXRjaC5lbmRJbmRleCA8PSBjdXJyZW50TGVuZ3RoICsgbm9kZVRleHRMZW5ndGgpIHtcclxuXHRcdFx0XHQvLyBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDQxXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM5LCBcdTA0M0FcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzAgZW5kTWF0Y2guZW5kSW5kZXggXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDQyIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0M0RcdTA0MzAgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDM1IFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzMFxyXG5cdFx0XHRcdGVuZE5vZGUgPSBub2RlO1xyXG5cdFx0XHRcdGVuZE9mZnNldCA9IG1hdGNoLmVuZEluZGV4IC0gY3VycmVudExlbmd0aDtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3VycmVudExlbmd0aCArPSBub2RlVGV4dExlbmd0aDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggZW5kTm9kZSBcdTA0M0RcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDM5XHUwNDM0XHUwNDM1XHUwNDNELCBcdTA0MzJcdTA0M0VcdTA0MzdcdTA0M0NcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0UsIG1hdGNoLmVuZEluZGV4IFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0RcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2IGlucHV0RWxlbWVudFxyXG5cdFx0aWYgKCFlbmROb2RlICYmIHN0YXJ0Tm9kZSAmJiBjdXJyZW50TGVuZ3RoIDw9IG1hdGNoLmVuZEluZGV4KSB7XHJcblx0XHRcdGlmICh0aGlzLm1lc3NhZ2VJbnB1dC5sYXN0Q2hpbGQpIHtcclxuXHRcdFx0XHRlbmROb2RlID0gdGhpcy5tZXNzYWdlSW5wdXQubGFzdENoaWxkO1xyXG5cdFx0XHRcdGVuZE9mZnNldCA9IHRoaXMubWVzc2FnZUlucHV0Lmxhc3RDaGlsZC50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7IC8vIFx1MDQxOFx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDYgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHsgc3RhcnROb2RlLCBzdGFydE9mZnNldCwgZW5kTm9kZSwgZW5kT2Zmc2V0IH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NEJcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDREXHUwNDNBXHUwNDMyXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQ0M1x1MDQ0RSBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0NDMgXHUwNDQzXHUwNDM3XHUwNDNCXHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDZcdTA0MzVcdTA0M0JcdTA0MzVcdTA0MzkgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQS5cclxuXHQgKiBcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRVx1MDQ0MiBnZXROb2RlRXF1aXZhbGVudExlbmd0aCwgXHUwNDQyXHUwNDMwXHUwNDNBIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NEMgcmVmZXJlbmNlLWJveCBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSxcclxuXHQgKiBcdTA0MzAgXHUwNDNEXHUwNDM1IDAsIFx1MDQ0Mlx1MDQzMFx1MDQzQSBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDNDXHUwNDRCIFx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzQyBcdTA0MzNcdTA0MzRcdTA0MzUgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIG1hdGNoLlxyXG5cdCAqIEBwYXJhbSBub2RlIC0gXHUwNDQzXHUwNDM3XHUwNDM1XHUwNDNCIERPTS5cclxuXHQgKiBAcmV0dXJucyBcdTA0NERcdTA0M0FcdTA0MzJcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQzOFx1MDQzRFx1MDQzMCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXROb2RlRXF1aXZhbGVudExlbmd0aEZvclJlZmVyZW5jZVBhcnNpbmcobm9kZTogTm9kZSk6IG51bWJlciB7XHJcblx0XHRpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuXHRcdFx0cmV0dXJuIG5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG5cdFx0fSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZWZlcmVuY2UtYm94JykpIHtcclxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlID0gUmVmZXJlbmNlQm94LmV4dHJhY3RSZWZlcmVuY2Uobm9kZSBhcyBIVE1MRWxlbWVudCk7XHJcblx0XHRcdGlmIChyZWZlcmVuY2UpIHtcclxuXHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDREXHUwNDQyXHUwNDNFIHJlZmVyZW5jZS1ib3gsIFx1MDQzNVx1MDQzM1x1MDQzRSBcIlx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0MzBcIiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDM4XHUwNDNEXHUwNDMzXHUwNDMwIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzhcdTA0NDFcdTA0NDVcdTA0M0VcdTA0MzRcdTA0M0RcdTA0MzBcdTA0NEYgQC9AQCNuYW1lXHJcblx0XHRcdFx0cmV0dXJuIChyZWZlcmVuY2UucGVybWFuZW50ID8gMiA6IDEpICsgcmVmZXJlbmNlLm5hbWUubGVuZ3RoO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gMDsgLy8gXHUwNDE0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDM1IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQ0QiBcdTA0M0RcdTA0MzUgXHUwNDMyXHUwNDNCXHUwNDM4XHUwNDRGXHUwNDRFXHUwNDQyIFx1MDQzRFx1MDQzMCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NDNcdTA0NEUgXHUwNDM0XHUwNDNCXHUwNDM4XHUwNDNEXHUwNDQzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NERcdTA0NDJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwLlxyXG5cdCAqIEBwYXJhbSBlbGVtZW50IC0gSFRNTCBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIsIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0IgXHUwNDM4IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpbnNlcnRTcGFjZUFuZFNldEN1cnNvckFmdGVyRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cdFx0aWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcblx0XHRjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcblx0XHRyYW5nZS5zZXRTdGFydEFmdGVyKGVsZW1lbnQpO1xyXG5cdFx0cmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIFx1MDQyMVx1MDQ0NVx1MDQzQlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzRcdTA0MzhcdTA0MzBcdTA0M0ZcdTA0MzBcdTA0MzdcdTA0M0VcdTA0M0QgXHUwNDM0XHUwNDNFIFx1MDQzRVx1MDQzNFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcclxuXHJcblx0XHQvLyBcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDRCXHUwNDMyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlxyXG5cdFx0Y29uc3Qgc3BhY2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTAwQTAnKTtcclxuXHRcdHJhbmdlLmluc2VydE5vZGUoc3BhY2VOb2RlKTtcclxuXHJcblx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwXHJcblx0XHRyYW5nZS5zZXRTdGFydEFmdGVyKHNwYWNlTm9kZSk7XHJcblx0XHRyYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcblx0XHRzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcblx0XHRzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNVxyXG5cdCAqIChcdTA0NDJcdTA0MzVcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0NEMgXHUwNDM4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIGZpbmROb2Rlc0FuZE9mZnNldHNGb3JNYXRjaCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDM1XHUwNDM1IFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzQ1x1MDQzNVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RilcclxuXHQgKi9cclxuXHRwcml2YXRlIGdldEN1cnNvclBvc2l0aW9uSW5UZXh0KCk6IG51bWJlciB7XHJcblx0XHRjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblx0XHRpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIC0xO1xyXG5cclxuXHRcdGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblx0XHQvLyBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzVcdTA0M0MgXCJcdTA0MzBcdTA0MzFcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEVcdTA0NDJcdTA0M0RcdTA0NEJcdTA0MzlcIiBcdTA0MzhcdTA0M0RcdTA0MzRcdTA0MzVcdTA0M0FcdTA0NDEgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzUgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzNcdTA0M0UgYG1lc3NhZ2VJbnB1dGBcclxuXHRcdC8vIFx1MDQ0MSBcdTA0NDNcdTA0NDdcdTA0MzVcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFLCBcdTA0NDdcdTA0NDJcdTA0M0UgcmVmZXJlbmNlLWJveCdcdTA0NEIgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDRCIFx1MDQzOFx1MDQ0NSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NEJcdTA0M0NcdTA0MzggXHUwNDMwXHUwNDNEXHUwNDMwXHUwNDNCXHUwNDNFXHUwNDMzXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzMiBnZXRUZXh0Q29udGVudCgpXHJcblx0XHRsZXQgY3VycmVudFRleHRPZmZzZXQgPSAwO1xyXG5cdFx0Y29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLm1lc3NhZ2VJbnB1dCwgTm9kZUZpbHRlci5TSE9XX0FMTCk7XHJcblx0XHRsZXQgbm9kZTtcclxuXHJcblx0XHR3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkpIHtcclxuXHRcdFx0aWYgKG5vZGUgPT09IHJhbmdlLmVuZENvbnRhaW5lcikge1xyXG5cdFx0XHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG5cdFx0XHRcdFx0Y3VycmVudFRleHRPZmZzZXQgKz0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAobm9kZSA9PT0gdGhpcy5tZXNzYWdlSW5wdXQpIHtcclxuXHRcdFx0XHRcdC8vIENcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzksIFx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDMyIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzRFx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzUsIFx1MDQzRFx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzUuXHJcblx0XHRcdFx0XHQvLyBcdTA0MUNcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDLCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDNEXHUwNDMwXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzUuXHJcblx0XHRcdFx0XHQvLyBcdTA0MURcdTA0MzBcdTA0M0MgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QywgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQ0M1x1MDQzN1x1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0UgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLlxyXG5cdFx0XHRcdFx0bGV0IG5vZGVCZWZvcmVDdXJzb3JFbGVtZW50Q291bnQgPSAwO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5lbmRPZmZzZXQ7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjaGlsZE5vZGUgPSB0aGlzLm1lc3NhZ2VJbnB1dC5jaGlsZE5vZGVzW2ldO1xyXG5cdFx0XHRcdFx0XHRjdXJyZW50VGV4dE9mZnNldCArPSB0aGlzLmdldE5vZGVFcXVpdmFsZW50TGVuZ3RoRm9yUmVmZXJlbmNlUGFyc2luZyhjaGlsZE5vZGUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggZW5kQ29udGFpbmVyIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzNFx1MDQ0MFx1MDQ0M1x1MDQzM1x1MDQzRVx1MDQzOSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDIgKFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgPGJyPiksXHJcblx0XHRcdFx0XHQvLyBcdTA0NDJcdTA0M0UgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzRFx1MDQzMFx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0MzRcdTA0M0UgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDFDXHUwNDRCIFx1MDQzRFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0M0RcdTA0NEIgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzRcdTA0M0JcdTA0MzhcdTA0M0RcdTA0NDMsIFx1MDQzRFx1MDQzRSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0M0RcdTA0NEIgXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDRDLCBcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzMVx1MDQ0Qlx1MDQzQlx1MDQzRSBcdTA0MzRcdTA0M0UgXHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyIFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzQyBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzUgYHJhbmdlLmVuZE9mZnNldGAgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDM1XHUwNDQyIDAsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDM0IFx1MDQzRFx1MDQzOFx1MDQzQy5cclxuXHRcdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMCwgXHUwNDNEXHUwNDQzXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzRlx1MDQzRS1cdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDQxXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDLlxyXG5cdFx0XHRcdFx0Ly8gXHUwNDEyIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzNSBgY29udGVudGVkaXRhYmxlYCBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzN1x1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0MiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzQ1x1MDQ0QiBcdTA0M0JcdTA0MzhcdTA0MzFcdTA0M0UgXHUwNDMyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzQyBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzUsXHJcblx0XHRcdFx0XHQvLyBcdTA0M0JcdTA0MzhcdTA0MzFcdTA0M0UgYGVuZENvbnRhaW5lcmAgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQ0MFx1MDQzRVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzQywgXHUwNDMwIGBlbmRPZmZzZXRgIC0gXHUwNDM4XHUwNDNEXHUwNDM0XHUwNDM1XHUwNDNBXHUwNDQxXHUwNDNFXHUwNDNDIFx1MDQzNFx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzRFx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NERcdTA0M0JcdTA0MzVcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXHJcblx0XHRcdFx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgYHJlZmVyZW5jZS1ib3hgIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0MzVcdTA0M0QgKFx1MDQ0Mi5cdTA0M0EuIFx1MDQzRVx1MDQzRCBgPHNwYW4gY29udGVudGVkaXRhYmxlPVwiZmFsc2VcIj5gKS5cclxuXHRcdFx0XHRcdC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0NDUgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDNFXHUwNDMyLCBcdTA0MzVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwIFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzOCBcdTA0M0RcdTA0MzhcdTA0NDUsIGByYW5nZS5lbmRPZmZzZXRgIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0NDFcdTA0M0NcdTA0MzVcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MuXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGN1cnJlbnRUZXh0T2Zmc2V0ICs9IHRoaXMuZ2V0Tm9kZUVxdWl2YWxlbnRMZW5ndGhGb3JSZWZlcmVuY2VQYXJzaW5nKG5vZGUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGN1cnJlbnRUZXh0T2Zmc2V0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgaW5wdXQgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwIChcdTA0MzFcdTA0MzVcdTA0MzcgSFRNTCksXHJcblx0ICogXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDRGIHJlZmVyZW5jZS1ib3ggXHUwNDM4XHUwNDQ1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0MuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRUZXh0Q29udGVudCgpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cdFx0Y29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLm1lc3NhZ2VJbnB1dCwgTm9kZUZpbHRlci5TSE9XX0FMTCk7IC8vIFNIT1dfQUxMIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDMwXHJcblx0XHRsZXQgbm9kZTtcclxuXHJcblx0XHR3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkpIHtcclxuXHRcdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IG5vZGUudGV4dENvbnRlbnQgfHwgJyc7XHJcblx0XHRcdH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygncmVmZXJlbmNlLWJveCcpKSB7XHJcblx0XHRcdFx0Y29uc3QgcmVmZXJlbmNlID0gUmVmZXJlbmNlQm94LmV4dHJhY3RSZWZlcmVuY2Uobm9kZSBhcyBIVE1MRWxlbWVudCk7XHJcblx0XHRcdFx0aWYgKHJlZmVyZW5jZSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJlZml4ID0gcmVmZXJlbmNlLnBlcm1hbmVudCA/IChyZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnID8gJ0BAJyA6ICcjIycpIDogcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJyA/ICdAJyA6ICcjJztcclxuXHRcdFx0XHRcdHJlc3VsdCArPSBwcmVmaXggKyByZWZlcmVuY2UubmFtZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuXHRcdFx0XHQvLyBcdTA0MTRcdTA0M0JcdTA0NEYgXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDQ1IFx1MDQ0RFx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzMiwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM1IFx1MDQzQ1x1MDQzRVx1MDQzM1x1MDQ0M1x1MDQ0MiBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMyIGNvbnRlbnRlZGl0YWJsZSAoXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCA8YnI+KSxcclxuXHRcdFx0XHQvLyBcdTA0M0RcdTA0NDNcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQyXHUwNDRDLCBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDM4XHUwNDQ1IFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQ0Mlx1MDQ0QyBcdTA0MzIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzRVx1MDQzQy5cclxuXHRcdFx0XHQvLyBcdTA0MTIgXHUwNDM0XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQ0MVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzMFx1MDQzNSwgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0RFx1MDQ0Mlx1MDQzRSA8YnI+LCBcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNDXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFIFx1MDQzOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRFx1MDQzMCBcXG4uXHJcblx0XHRcdFx0Ly8gXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0Mlx1MDQ0QiwgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQzOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQywgXHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0M0RcdTA0MzUgXHUwNDMxXHUwNDNFXHUwNDNBXHUwNDQxLlxyXG5cdFx0XHRcdC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NDBcdTA0MzggaW5wdXRFbGVtZW50IFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDRCLCBcdTA0M0VcdTA0M0RcdTA0MzggXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1IFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0NDdcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NENcdTA0NEUgZ2V0VGV4dENvbnRlbnQsXHJcblx0XHRcdFx0Ly8gXHUwNDNGXHUwNDNFXHUwNDREXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDQzIHdhbGtlci5uZXh0Tm9kZSgpIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0MzhcdTA0NDUgXHUwNDQzXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDLlxyXG5cdFx0XHRcdC8vIFx1MDQxMlx1MDQzRVx1MDQzN1x1MDQzQ1x1MDQzRVx1MDQzNlx1MDQzRFx1MDQzRSwgXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQ0M1x1MDQzNlx1MDQzRFx1MDQzRSBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDMxXHUwNDNFXHUwNDNCXHUwNDM1XHUwNDM1IFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzQywgXHUwNDNFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRGXHUwNDQxXHUwNDRDIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0MzZcdTA0MzhcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0NcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDM1LlxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE4XHUwNDM3XHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDEgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MVx1MDQzRVx1MDQzMiBcdTA0M0RcdTA0MzAgXHUwNDM4XHUwNDQxXHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzOFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZXh0cmFjdFRleHRXaXRoUmVmZXJlbmNlcygpOiBzdHJpbmcge1xyXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuXHRcdGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5mcm9tKHRoaXMubWVzc2FnZUlucHV0LmNoaWxkTm9kZXMpO1xyXG5cclxuXHRcdGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGNoaWxkTm9kZXMpIHtcclxuXHRcdFx0aWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuXHRcdFx0XHRyZXN1bHQgKz0gY2hpbGROb2RlLnRleHRDb250ZW50O1xyXG5cdFx0XHR9IGVsc2UgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuXHRcdFx0XHRjb25zdCBlbGVtZW50ID0gY2hpbGROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuXHRcdFx0XHRpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3JlZmVyZW5jZS1ib3gnKSkge1xyXG5cdFx0XHRcdFx0Ly8gXHUwNDJEXHUwNDQyXHUwNDNFIFx1MDQzMVx1MDQzRVx1MDQzQVx1MDQ0MSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzggLSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNEXHUwNDMwIFx1MDQzOFx1MDQ0MVx1MDQ0NVx1MDQzRVx1MDQzNFx1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0NDNcclxuXHRcdFx0XHRcdGNvbnN0IHJlZmVyZW5jZSA9IFJlZmVyZW5jZUJveC5leHRyYWN0UmVmZXJlbmNlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0aWYgKHJlZmVyZW5jZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmVmaXggPSByZWZlcmVuY2UucGVybWFuZW50XHJcblx0XHRcdFx0XHRcdFx0PyByZWZlcmVuY2UudHlwZSA9PT0gJ2ZpbGUnXHJcblx0XHRcdFx0XHRcdFx0XHQ/ICdAQCdcclxuXHRcdFx0XHRcdFx0XHRcdDogJyMjJ1xyXG5cdFx0XHRcdFx0XHRcdDogcmVmZXJlbmNlLnR5cGUgPT09ICdmaWxlJ1xyXG5cdFx0XHRcdFx0XHRcdD8gJ0AnXHJcblx0XHRcdFx0XHRcdFx0OiAnIyc7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBgJHtwcmVmaXh9JHtyZWZlcmVuY2UubmFtZX1gO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MUVcdTA0MzFcdTA0NEJcdTA0NDdcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDREXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIC0gXHUwNDMxXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzVcclxuXHRcdFx0XHRcdHJlc3VsdCArPSBlbGVtZW50LnRleHRDb250ZW50O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDNFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDM4IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDEgXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1XHUwNDNDIFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU2VuZFdpdGhSZWZlcmVuY2VzKCk6IFByb21pc2U8dm9pZD4ge1xyXG5cdFx0Y29uc3QgcmF3VGV4dCA9IHRoaXMuZXh0cmFjdFRleHRXaXRoUmVmZXJlbmNlcygpO1xyXG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJhd1RleHQudHJpbSgpO1xyXG5cclxuXHRcdGlmICghbWVzc2FnZSAmJiB0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcblx0XHRpZiAoIXRoaXMucmVmZXJlbmNlRXhwYW5kZXIpIHtcclxuXHRcdFx0dGhpcy5oYW5kbGVTZW5kKCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHQvLyBcdTA0MThcdTA0MTdcdTA0MUNcdTA0MTVcdTA0MURcdTA0MTVcdTA0MURcdTA0MUU6IFx1MDQxOFx1MDQzN1x1MDQzMlx1MDQzQlx1MDQzNVx1MDQzQVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM4XHUwNDM3IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0MTggXHUwNDNBXHUwNDM1XHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQ0NVxyXG5cdFx0XHRjb25zdCB7IG9yaWdpbmFsVGV4dCwgYXR0YWNobWVudHMgfSA9IGF3YWl0IHRoaXMucmVmZXJlbmNlRXhwYW5kZXIuZXh0cmFjdEF0dGFjaG1lbnRzKHJhd1RleHQsIHRoaXMuY3VycmVudFJlZmVyZW5jZXMpO1xyXG5cclxuXHRcdFx0Ly8gXHUwNDFFXHUwNDMxXHUwNDRBXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzhcdTA0MzcgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0MzUgKFx1MDQzOFx1MDQzNyBhdHRhY2hlZC1maWxlcy1jb250YWluZXIpXHJcblx0XHRcdGNvbnN0IGFsbEF0dGFjaG1lbnRzID0gWy4uLmF0dGFjaG1lbnRzLCAuLi50aGlzLmN1cnJlbnRBdHRhY2htZW50c107XHJcblxyXG5cdFx0XHQvLyBcdTA0MUVcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0MzggXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlxyXG5cdFx0XHRpZiAodGhpcy5wcm9wcy5vblNlbmRNZXNzYWdlKSB7XHJcblx0XHRcdFx0dGhpcy5wcm9wcy5vblNlbmRNZXNzYWdlKG9yaWdpbmFsVGV4dCB8fCAnJywgdGhpcy5zZWxlY3RlZE1vZGVsLCBhbGxBdHRhY2htZW50cyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuY2xlYXJJbnB1dCgpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignXHUwNDFFXHUwNDQ4XHUwNDM4XHUwNDMxXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0M0FcdTA0MzUgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNFXHUwNDNBOicsIGVycm9yKTtcclxuXHRcdFx0aWYgKHRoaXMucHJvcHMub25TZW5kTWVzc2FnZSkge1xyXG5cdFx0XHRcdHRoaXMucHJvcHMub25TZW5kTWVzc2FnZShyYXdUZXh0LCB0aGlzLnNlbGVjdGVkTW9kZWwsIHRoaXMuY3VycmVudEF0dGFjaG1lbnRzKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmNsZWFySW5wdXQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0N1x1MDQzOFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDMwIFx1MDQzOCBcdTA0NDFcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDFcdTA0NEJcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDQxXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzRVx1MDQzQVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2xlYXJJbnB1dCgpOiB2b2lkIHtcclxuXHRcdHRoaXMubWVzc2FnZUlucHV0LmlubmVySFRNTCA9ICcnO1xyXG5cdFx0dGhpcy5jdXJyZW50UmVmZXJlbmNlcyA9IFtdO1xyXG5cdFx0dGhpcy5jdXJyZW50QXR0YWNobWVudHMgPSBbXTtcclxuXHRcdHRoaXMucmVuZGVyQXR0YWNoZWRGaWxlcygpO1xyXG5cdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xyXG5cdFx0dGhpcy5oaWRlU3VnZ2VzdGlvbnMoKTtcclxuXHRcdGlmICh0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZSkge1xyXG5cdFx0XHR0aGlzLnJlZmVyZW5jZUF1dG9jb21wbGV0ZS5oaWRlQXV0b2NvbXBsZXRlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDM0IGhhbmRsZVNlbmQoKSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNDXHUwNDM1XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4OlxyXG5cdGhhbmRsZVNlbmQoKTogdm9pZCB7XHJcblx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlSW5wdXQudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJztcclxuXHRcdGlmIChtZXNzYWdlICYmIHRoaXMucHJvcHMub25TZW5kTWVzc2FnZSkge1xyXG5cdFx0XHR0aGlzLnByb3BzLm9uU2VuZE1lc3NhZ2UobWVzc2FnZSwgdGhpcy5zZWxlY3RlZE1vZGVsLCB0aGlzLmN1cnJlbnRBdHRhY2htZW50cyk7XHJcblx0XHRcdHRoaXMuY2xlYXJJbnB1dCgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQzMFx1MDQzRFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzhcdTA0M0RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0M0VcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDM0IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQzQyBcdTA0NDEgXHUwNDNBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0MzJcdTA0MzdcdTA0MzBcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NEYuXHJcblx0ICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50IC0gXHUwNDJEXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiwgXHUwNDNBIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQ0MyBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQzOFx1MDQzRFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzRVx1MDQzMi5cclxuXHQgKiBAcGFyYW0gbWVzc2FnZUNvbnRlbnQgLSBcdTA0MjFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzhcdTA0M0NcdTA0M0VcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDMxXHUwNDQ5XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqIEBwYXJhbSBub2RlSWQgLSBJRCBcdTA0NDNcdTA0MzdcdTA0M0JcdTA0MzAsIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEUsIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLlxyXG5cdCAqIEBwYXJhbSBncmFwaElkIC0gSUQgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDQ0XHUwNDMwLCBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0M0NcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNEXHUwNDMwXHUwNDM0XHUwNDNCXHUwNDM1XHUwNDM2XHUwNDM4XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjcmVhdGVNZXNzYWdlVG9vbHNldChtZXNzYWdlRWxlbWVudDogSFRNTEVsZW1lbnQsIG1lc3NhZ2VDb250ZW50OiBzdHJpbmcsIG5vZGVJZDogc3RyaW5nLCBncmFwaElkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHRvb2xzZXRXcmFwcGVyID0gbWVzc2FnZUVsZW1lbnQuY3JlYXRlRGl2KHtcclxuXHRcdFx0Y2xzOiAnei0wIGZsZXggbWluLWgtWzQ2cHhdIGp1c3RpZnktc3RhcnQnXHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHRvb2xzZXRDb250YWluZXIgPSB0b29sc2V0V3JhcHBlci5jcmVhdGVEaXYoe1xyXG5cdFx0XHRjbHM6ICd0b3VjaDotbWUtMiB0b3VjaDotbXMtMy41IC1tcy0yLjUgLW1lLTEgZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC15LTQgcC0xIHNlbGVjdC1ub25lIHRvdWNoOnctW2NhbGMoMTAwJSstLXNwYWNpbmcoMy41KSldIC1tdC0xIHctW2NhbGMoMTAwJSstLXNwYWNpbmcoMi41KSldIGR1cmF0aW9uLVsxLjVzXSBmb2N1cy13aXRoaW46dHJhbnNpdGlvbi1ub25lIGhvdmVyOnRyYW5zaXRpb24tbm9uZSBwb2ludGVyLWV2ZW50cy1ub25lIFttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0b19yaWdodCxibGFja18zMyUsdHJhbnNwYXJlbnRfNjYlKV0gW21hc2stc2l6ZTozMDAlXzEwMCVdIFttYXNrLXBvc2l0aW9uOjEwMCVfMCVdIG1vdGlvbi1zYWZlOnRyYW5zaXRpb24tW21hc2stcG9zaXRpb25dIGdyb3VwLWhvdmVyL3R1cm4tbWVzc2FnZXM6cG9pbnRlci1ldmVudHMtYXV0byBncm91cC1ob3Zlci90dXJuLW1lc3NhZ2VzOlttYXNrLXBvc2l0aW9uOjBfMF0gZ3JvdXAtZm9jdXMtd2l0aGluL3R1cm4tbWVzc2FnZXM6cG9pbnRlci1ldmVudHMtYXV0byBncm91cC1mb2N1cy13aXRoaW4vdHVybi1tZXNzYWdlczpbbWFzay1wb3NpdGlvbjowXzBdIGhhcy1kYXRhLVtzdGF0ZT1vcGVuXTpwb2ludGVyLWV2ZW50cy1hdXRvIGhhcy1kYXRhLVtzdGF0ZT1vcGVuXTpbbWFzay1wb3NpdGlvbjowXzBdJ1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDXCJcclxuXHRcdGNvbnN0IGNvcHlCdXR0b24gPSB0b29sc2V0Q29udGFpbmVyLmNyZWF0ZUVsKCdidXR0b24nLCB7XHJcblx0XHRcdGNsczogJ3RleHQtdG9rZW4tdGV4dC1zZWNvbmRhcnkgaG92ZXI6YmctdG9rZW4tYmctc2Vjb25kYXJ5IHJvdW5kZWQtbGcnLFxyXG5cdFx0XHRhdHRyOiB7XHJcblx0XHRcdFx0J2FyaWEtbGFiZWwnOiAnXHUwNDFBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDJyxcclxuXHRcdFx0XHQnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJyxcclxuXHRcdFx0XHQnZGF0YS10ZXN0aWQnOiAnY29weS10dXJuLWFjdGlvbi1idXR0b24nLFxyXG5cdFx0XHRcdCdkYXRhLXN0YXRlJzogJ2Nsb3NlZCdcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRjb25zdCBjb3B5SWNvbkNvbnRhaW5lciA9IGNvcHlCdXR0b24uY3JlYXRlU3Bhbih7IGNsczogJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRvdWNoOnctMTAgaC04IHctOCcgfSk7XHJcblx0XHRzZXRJY29uKGNvcHlJY29uQ29udGFpbmVyLCAnY29weScpOyAvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgXHUwNDM4XHUwNDNDXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RSBzZXRJY29uXHJcblx0XHRjb3B5QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmNvcHlNZXNzYWdlQ29udGVudChtZXNzYWdlQ29udGVudClcclxuXHRcdFx0XHQudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0XHQvLyBcdTA0MTIgXHUwNDQxXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDMwXHUwNDM1IFx1MDQ0M1x1MDQ0MVx1MDQzRlx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0FcdTA0M0VcdTA0M0ZcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzOFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzQVx1MDQ0MyBcdTA0M0RcdTA0MzAgXHUwNDMzXHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDQzXHJcblx0XHRcdFx0XHRzZXRJY29uKGNvcHlJY29uQ29udGFpbmVyLCAnY2hlY2snKTtcclxuXHRcdFx0XHRcdC8vIFx1MDQxMlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzhcdTA0M0FcdTA0M0VcdTA0M0RcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNyAxIFx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQ0M1xyXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHNldEljb24oY29weUljb25Db250YWluZXIsICdjb3B5Jyk7XHJcblx0XHRcdFx0XHR9LCAxMDAwKTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5jYXRjaCgoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCdcdTA0MURcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDNFXHUwNDQxXHUwNDRDIFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzRlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU6JywgZXJyKTtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoJ1x1MDQxRFx1MDQzNSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0M0VcdTA0NDFcdTA0NEMgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNGXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNS4nLCAzMDAwKTsgLy8gXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDNDIE5vdGljZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDXCJcclxuXHRcdGNvbnN0IGRlbGV0ZUJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJywgLy8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRFx1MDQzNVx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0NDJcdTA0NDNcdTA0M0ZcdTA0MzBcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUnLFxyXG5cdFx0XHRcdCdkYXRhLXRlc3RpZCc6ICdkZWxldGUtdHVybi1hY3Rpb24tYnV0dG9uJyxcclxuXHRcdFx0XHQnZGF0YS1zdGF0ZSc6ICdjbG9zZWQnXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0Y29uc3QgZGVsZXRlSWNvbkNvbnRhaW5lciA9IGRlbGV0ZUJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24oZGVsZXRlSWNvbkNvbnRhaW5lciwgJ3RyYXNoLTInKTsgLy8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzN1x1MDQzOFx1MDQzRFx1MDQ0QlxyXG5cdFx0ZGVsZXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBjb25maXJtZWQgPSBhd2FpdCBEaWFsb2cuY29uZmlybShcclxuXHRcdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5hcHAsXHJcblx0XHRcdFx0J1x1MDQxMlx1MDQ0QiBcdTA0NDNcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0RcdTA0NEIsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBcdTA0NDVcdTA0M0VcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU/IFx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0MzZcdTA0MzUgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDNcdTA0MzdcdTA0MzVcdTA0M0IgXHUwNDMyIFx1MDQzM1x1MDQ0MFx1MDQzMFx1MDQ0NFx1MDQzNS4nXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChjb25maXJtZWQpIHtcclxuXHRcdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdkZWxldGUtbm9kZScsIHsgZ3JhcGhJZCwgbm9kZUlkIH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBcdTA0MUFcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0MzAgXCJcdTA0MjBcdTA0MzVcdTA0MzNcdTA0MzVcdTA0M0RcdTA0MzVcdTA0NDBcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NENcIlxyXG5cdFx0Y29uc3QgcmVnZW5lcmF0ZUJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJyxcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQyMFx1MDQzNVx1MDQzM1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUnLFxyXG5cdFx0XHRcdCdkYXRhLXRlc3RpZCc6ICdyZWdlbmVyYXRlLXR1cm4tYWN0aW9uLWJ1dHRvbicsXHJcblx0XHRcdFx0J2RhdGEtc3RhdGUnOiAnY2xvc2VkJ1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHJlZ2VuZXJhdGVJY29uQ29udGFpbmVyID0gcmVnZW5lcmF0ZUJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24ocmVnZW5lcmF0ZUljb25Db250YWluZXIsICdyZWZyZXNoLWN3Jyk7XHJcblx0XHRyZWdlbmVyYXRlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQzQ1x1MDQzRVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDQwXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XHJcblx0XHRcdHRoaXMucHJvcHMucGx1Z2luLmV2ZW50QnVzLmVtaXQoJ3JlZ2VuZXJhdGUtbWVzc2FnZScsIHsgZ3JhcGhJZCwgbm9kZUlkLCBtb2RlbDogdGhpcy5zZWxlY3RlZE1vZGVsIH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gXHUwNDFBXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDNBXHUwNDMwIFwiXHUwNDFEXHUwNDMwXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiXHJcblx0XHRjb25zdCBzY3JvbGxUb1RvcEJ1dHRvbiA9IHRvb2xzZXRDb250YWluZXIuY3JlYXRlRWwoJ2J1dHRvbicsIHtcclxuXHRcdFx0Y2xzOiAndGV4dC10b2tlbi10ZXh0LXNlY29uZGFyeSBob3ZlcjpiZy10b2tlbi1iZy1zZWNvbmRhcnkgcm91bmRlZC1sZyBtbC0xJyxcclxuXHRcdFx0YXR0cjoge1xyXG5cdFx0XHRcdCdhcmlhLWxhYmVsJzogJ1x1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0M0EgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDQzIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQzMVx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RicsXHJcblx0XHRcdFx0J2RhdGEtdGVzdGlkJzogJ3Njcm9sbC10by1tZXNzYWdlLXRvcC1idXR0b24nLFxyXG5cdFx0XHRcdCdkYXRhLXN0YXRlJzogJ2Nsb3NlZCdcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRjb25zdCBzY3JvbGxUb1RvcEljb25Db250YWluZXIgPSBzY3JvbGxUb1RvcEJ1dHRvbi5jcmVhdGVTcGFuKHsgY2xzOiAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdG91Y2g6dy0xMCBoLTggdy04JyB9KTtcclxuXHRcdHNldEljb24oc2Nyb2xsVG9Ub3BJY29uQ29udGFpbmVyLCAnYXJyb3ctdXAnKTsgLy8gXHUwNDE4XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzQlx1MDQzQVx1MDQzOCBcdTA0MzJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcclxuXHRcdHNjcm9sbFRvVG9wQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHQvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDBcdTA0NDNcdTA0NDdcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzOVx1MDQzRFx1MDQzNVx1MDQ0MCAodmlldy1jb250ZW50KSBcdTA0M0EgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDQzIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0MzFcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHRcdFx0Y29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5jb250YWluZXIuY2xvc2VzdCgnLnZpZXctY29udGVudCcpIGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0XHRpZiAoc2Nyb2xsQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0c2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IG1lc3NhZ2VFbGVtZW50Lm9mZnNldFRvcDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGhhbmRsZVN0b3BHZW5lcmF0aW9uKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY3VycmVudFN0cmVhbWluZ05vZGVJZCkge1xyXG5cdFx0XHR0aGlzLnByb3BzLnBsdWdpbi5ldmVudEJ1cy5lbWl0KCdzdG9wLXN0cmVhbS1yZXF1ZXN0Jywge1xyXG5cdFx0XHRcdG5vZGVJZDogdGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlU3RvcEJ1dHRvblZpc2liaWxpdHkoaXNTdHJlYW1pbmc6IGJvb2xlYW4sIG5vZGVJZDogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jdXJyZW50U3RyZWFtaW5nTm9kZUlkID0gbm9kZUlkO1xyXG5cclxuXHRcdGlmIChpc1N0cmVhbWluZyAmJiBub2RlSWQpIHtcclxuXHRcdFx0dGhpcy5zdG9wQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWZsZXgnO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zdG9wQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNvcHlNZXNzYWdlQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb250ZW50KTtcclxuXHR9XHJcblxyXG5cdHVwZGF0ZUN1c3RvbVN5c3RlbVByb21wdFN0YXR1cyhjdXN0b21TeXN0ZW1Qcm9tcHQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmN1c3RvbVByb21wdEluZGljYXRvcikge1xyXG5cdFx0XHRpZiAoY3VzdG9tU3lzdGVtUHJvbXB0KSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtZmxleCc7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc2V0QXR0cmlidXRlKFxyXG5cdFx0XHRcdFx0J2FyaWEtbGFiZWwnLFxyXG5cdFx0XHRcdFx0YFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM1XHUwNDNDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzRlx1MDQ0MjogJHtjdXN0b21TeXN0ZW1Qcm9tcHR9YFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jdXN0b21Qcm9tcHRJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdFx0XHR0aGlzLmN1c3RvbVByb21wdEluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmlsZSBBdHRhY2htZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQVx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEJcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbmRlckF0dGFjaGVkRmlsZXMoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5jdXJyZW50QXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMuYXR0YWNoZWRGaWxlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHRcdHRoaXMuYXR0YWNoZWRGaWxlc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuXHJcblx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgdGhpcy5jdXJyZW50QXR0YWNobWVudHMpIHtcclxuXHRcdFx0Y29uc3QgYm94ID0gdGhpcy5jcmVhdGVSZW1vdmFibGVBdHRhY2htZW50Qm94KGF0dGFjaG1lbnQpO1xyXG5cdFx0XHR0aGlzLmF0dGFjaGVkRmlsZXNDb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQyMVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0MzFcdTA0M0VcdTA0M0FcdTA0NDEgXHUwNDMyXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MSBcdTA0M0FcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjcmVhdGVSZW1vdmFibGVBdHRhY2htZW50Qm94KGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnQpOiBIVE1MRWxlbWVudCB7XHJcblx0XHRjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdGJveC5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1ib3ggcmVtb3ZhYmxlJztcclxuXHJcblx0XHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0aWNvbi5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1pY29uJztcclxuXHRcdGljb24udGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0NFJztcclxuXHJcblx0XHRjb25zdCBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cdFx0bmFtZS5jbGFzc05hbWUgPSAnYXR0YWNobWVudC1uYW1lJztcclxuXHRcdG5hbWUudGV4dENvbnRlbnQgPSBhdHRhY2htZW50Lm5hbWU7XHJcblxyXG5cdFx0Y29uc3QgcmVtb3ZlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcblx0XHRyZW1vdmVCdG4uY2xhc3NOYW1lID0gJ2F0dGFjaG1lbnQtcmVtb3ZlJztcclxuXHRcdHJlbW92ZUJ0bi5pbm5lckhUTUwgPSAnXHUwMEQ3JztcclxuXHRcdHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNScpO1xyXG5cdFx0cmVtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnJlbW92ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRib3guYXBwZW5kQ2hpbGQoaWNvbik7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQobmFtZSk7XHJcblx0XHRib3guYXBwZW5kQ2hpbGQocmVtb3ZlQnRuKTtcclxuXHJcblx0XHRyZXR1cm4gYm94O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzRFx1MDQzNVx1MDQ0OFx1MDQzRFx1MDQzNVx1MDQzNSBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHQgKi9cclxuXHRwcml2YXRlIHJlbW92ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnQpO1xyXG5cdFx0aWYgKGluZGV4ID4gLTEpIHtcclxuXHRcdFx0dGhpcy5jdXJyZW50QXR0YWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJBdHRhY2hlZEZpbGVzKCk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiIsICJjb25zdCBQQUNLRVRfVFlQRVMgPSBPYmplY3QuY3JlYXRlKG51bGwpOyAvLyBubyBNYXAgPSBubyBwb2x5ZmlsbFxuUEFDS0VUX1RZUEVTW1wib3BlblwiXSA9IFwiMFwiO1xuUEFDS0VUX1RZUEVTW1wiY2xvc2VcIl0gPSBcIjFcIjtcblBBQ0tFVF9UWVBFU1tcInBpbmdcIl0gPSBcIjJcIjtcblBBQ0tFVF9UWVBFU1tcInBvbmdcIl0gPSBcIjNcIjtcblBBQ0tFVF9UWVBFU1tcIm1lc3NhZ2VcIl0gPSBcIjRcIjtcblBBQ0tFVF9UWVBFU1tcInVwZ3JhZGVcIl0gPSBcIjVcIjtcblBBQ0tFVF9UWVBFU1tcIm5vb3BcIl0gPSBcIjZcIjtcbmNvbnN0IFBBQ0tFVF9UWVBFU19SRVZFUlNFID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbk9iamVjdC5rZXlzKFBBQ0tFVF9UWVBFUykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgUEFDS0VUX1RZUEVTX1JFVkVSU0VbUEFDS0VUX1RZUEVTW2tleV1dID0ga2V5O1xufSk7XG5jb25zdCBFUlJPUl9QQUNLRVQgPSB7IHR5cGU6IFwiZXJyb3JcIiwgZGF0YTogXCJwYXJzZXIgZXJyb3JcIiB9O1xuZXhwb3J0IHsgUEFDS0VUX1RZUEVTLCBQQUNLRVRfVFlQRVNfUkVWRVJTRSwgRVJST1JfUEFDS0VUIH07XG4iLCAiaW1wb3J0IHsgUEFDS0VUX1RZUEVTIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuY29uc3Qgd2l0aE5hdGl2ZUJsb2IgPSB0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIjtcbi8vIEFycmF5QnVmZmVyLmlzVmlldyBtZXRob2QgaXMgbm90IGRlZmluZWQgaW4gSUUxMFxuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iaiAmJiBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuY29uc3QgZW5jb2RlUGFja2V0ID0gKHsgdHlwZSwgZGF0YSB9LCBzdXBwb3J0c0JpbmFyeSwgY2FsbGJhY2spID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUJsb2IgJiYgZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlQmxvYkFzQmFzZTY0KGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiZcbiAgICAgICAgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBpc1ZpZXcoZGF0YSkpKSB7XG4gICAgICAgIGlmIChzdXBwb3J0c0JpbmFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZUJsb2JBc0Jhc2U2NChuZXcgQmxvYihbZGF0YV0pLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxhaW4gc3RyaW5nXG4gICAgcmV0dXJuIGNhbGxiYWNrKFBBQ0tFVF9UWVBFU1t0eXBlXSArIChkYXRhIHx8IFwiXCIpKTtcbn07XG5jb25zdCBlbmNvZGVCbG9iQXNCYXNlNjQgPSAoZGF0YSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGZpbGVSZWFkZXIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtcbiAgICAgICAgY2FsbGJhY2soXCJiXCIgKyAoY29udGVudCB8fCBcIlwiKSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGRhdGEpO1xufTtcbmZ1bmN0aW9uIHRvQXJyYXkoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICAgIH1cbn1cbmxldCBURVhUX0VOQ09ERVI7XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUGFja2V0VG9CaW5hcnkocGFja2V0LCBjYWxsYmFjaykge1xuICAgIGlmICh3aXRoTmF0aXZlQmxvYiAmJiBwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgcmV0dXJuIHBhY2tldC5kYXRhLmFycmF5QnVmZmVyKCkudGhlbih0b0FycmF5KS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyICYmXG4gICAgICAgIChwYWNrZXQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhwYWNrZXQuZGF0YSkpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayh0b0FycmF5KHBhY2tldC5kYXRhKSk7XG4gICAgfVxuICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZCkgPT4ge1xuICAgICAgICBpZiAoIVRFWFRfRU5DT0RFUikge1xuICAgICAgICAgICAgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soVEVYVF9FTkNPREVSLmVuY29kZShlbmNvZGVkKSk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQgfTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9iYXNlNjQtYXJyYXlidWZmZXJcbmNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuLy8gVXNlIGEgbG9va3VwIHRhYmxlIHRvIGZpbmQgdGhlIGluZGV4LlxuY29uc3QgbG9va3VwID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gW10gOiBuZXcgVWludDhBcnJheSgyNTYpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIGxvb2t1cFtjaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG59XG5leHBvcnQgY29uc3QgZW5jb2RlID0gKGFycmF5YnVmZmVyKSA9PiB7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpLCBpLCBsZW4gPSBieXRlcy5sZW5ndGgsIGJhc2U2NCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykge1xuICAgICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1soKGJ5dGVzW2ldICYgMykgPDwgNCkgfCAoYnl0ZXNbaSArIDFdID4+IDQpXTtcbiAgICAgICAgYmFzZTY0ICs9IGNoYXJzWygoYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIpIHwgKGJ5dGVzW2kgKyAyXSA+PiA2KV07XG4gICAgICAgIGJhc2U2NCArPSBjaGFyc1tieXRlc1tpICsgMl0gJiA2M107XG4gICAgfVxuICAgIGlmIChsZW4gJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH1cbiAgICBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7XG4gICAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgJz09JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn07XG5leHBvcnQgY29uc3QgZGVjb2RlID0gKGJhc2U2NCkgPT4ge1xuICAgIGxldCBidWZmZXJMZW5ndGggPSBiYXNlNjQubGVuZ3RoICogMC43NSwgbGVuID0gYmFzZTY0Lmxlbmd0aCwgaSwgcCA9IDAsIGVuY29kZWQxLCBlbmNvZGVkMiwgZW5jb2RlZDMsIGVuY29kZWQ0O1xuICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChiYXNlNjRbYmFzZTY0Lmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFycmF5YnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCksIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IGxvb2t1cFtiYXNlNjQuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGVuY29kZWQyID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAxKV07XG4gICAgICAgIGVuY29kZWQzID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAyKV07XG4gICAgICAgIGVuY29kZWQ0ID0gbG9va3VwW2Jhc2U2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDEgPDwgMikgfCAoZW5jb2RlZDIgPj4gNCk7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoKGVuY29kZWQyICYgMTUpIDw8IDQpIHwgKGVuY29kZWQzID4+IDIpO1xuICAgICAgICBieXRlc1twKytdID0gKChlbmNvZGVkMyAmIDMpIDw8IDYpIHwgKGVuY29kZWQ0ICYgNjMpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlidWZmZXI7XG59O1xuIiwgImltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgUEFDS0VUX1RZUEVTX1JFVkVSU0UsIH0gZnJvbSBcIi4vY29tbW9ucy5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSBcIi4vY29udHJpYi9iYXNlNjQtYXJyYXlidWZmZXIuanNcIjtcbmNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuZXhwb3J0IGNvbnN0IGRlY29kZVBhY2tldCA9IChlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGVkUGFja2V0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIGRhdGE6IG1hcEJpbmFyeShlbmNvZGVkUGFja2V0LCBiaW5hcnlUeXBlKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGVuY29kZWRQYWNrZXQuY2hhckF0KDApO1xuICAgIGlmICh0eXBlID09PSBcImJcIikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBkYXRhOiBkZWNvZGVCYXNlNjRQYWNrZXQoZW5jb2RlZFBhY2tldC5zdWJzdHJpbmcoMSksIGJpbmFyeVR5cGUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYWNrZXRUeXBlID0gUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV07XG4gICAgaWYgKCFwYWNrZXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBFUlJPUl9QQUNLRVQ7XG4gICAgfVxuICAgIHJldHVybiBlbmNvZGVkUGFja2V0Lmxlbmd0aCA+IDFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiBQQUNLRVRfVFlQRVNfUkVWRVJTRVt0eXBlXSxcbiAgICAgICAgICAgIGRhdGE6IGVuY29kZWRQYWNrZXQuc3Vic3RyaW5nKDEpLFxuICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogUEFDS0VUX1RZUEVTX1JFVkVSU0VbdHlwZV0sXG4gICAgICAgIH07XG59O1xuY29uc3QgZGVjb2RlQmFzZTY0UGFja2V0ID0gKGRhdGEsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBpZiAod2l0aE5hdGl2ZUFycmF5QnVmZmVyKSB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUoZGF0YSk7XG4gICAgICAgIHJldHVybiBtYXBCaW5hcnkoZGVjb2RlZCwgYmluYXJ5VHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBiYXNlNjQ6IHRydWUsIGRhdGEgfTsgLy8gZmFsbGJhY2sgZm9yIG9sZCBicm93c2Vyc1xuICAgIH1cbn07XG5jb25zdCBtYXBCaW5hcnkgPSAoZGF0YSwgYmluYXJ5VHlwZSkgPT4ge1xuICAgIHN3aXRjaCAoYmluYXJ5VHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiOlxuICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZnJvbSBXZWJTb2NrZXQgKyBiaW5hcnlUeXBlIFwiYmxvYlwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIG9yIFdlYlRyYW5zcG9ydFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYihbZGF0YV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXJyYXlidWZmZXJcIjpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIEhUVFAgbG9uZy1wb2xsaW5nIChiYXNlNjQpIG9yIFdlYlNvY2tldCArIGJpbmFyeVR5cGUgXCJhcnJheWJ1ZmZlclwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmcm9tIFdlYlRyYW5zcG9ydCAoVWludDhBcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgfVxufTtcbiIsICJpbXBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBhY2tldFRvQmluYXJ5IH0gZnJvbSBcIi4vZW5jb2RlUGFja2V0LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiLi9kZWNvZGVQYWNrZXQuanNcIjtcbmltcG9ydCB7IEVSUk9SX1BBQ0tFVCwgfSBmcm9tIFwiLi9jb21tb25zLmpzXCI7XG5jb25zdCBTRVBBUkFUT1IgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMwKTsgLy8gc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlbGltaXRlciNBU0NJSV9kZWxpbWl0ZWRfdGV4dFxuY29uc3QgZW5jb2RlUGF5bG9hZCA9IChwYWNrZXRzLCBjYWxsYmFjaykgPT4ge1xuICAgIC8vIHNvbWUgcGFja2V0cyBtYXkgYmUgYWRkZWQgdG8gdGhlIGFycmF5IHdoaWxlIGVuY29kaW5nLCBzbyB0aGUgaW5pdGlhbCBsZW5ndGggbXVzdCBiZSBzYXZlZFxuICAgIGNvbnN0IGxlbmd0aCA9IHBhY2tldHMubGVuZ3RoO1xuICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBwYWNrZXRzLmZvckVhY2goKHBhY2tldCwgaSkgPT4ge1xuICAgICAgICAvLyBmb3JjZSBiYXNlNjQgZW5jb2RpbmcgZm9yIGJpbmFyeSBwYWNrZXRzXG4gICAgICAgIGVuY29kZVBhY2tldChwYWNrZXQsIGZhbHNlLCAoZW5jb2RlZFBhY2tldCkgPT4ge1xuICAgICAgICAgICAgZW5jb2RlZFBhY2tldHNbaV0gPSBlbmNvZGVkUGFja2V0O1xuICAgICAgICAgICAgaWYgKCsrY291bnQgPT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuY29kZWRQYWNrZXRzLmpvaW4oU0VQQVJBVE9SKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IGRlY29kZVBheWxvYWQgPSAoZW5jb2RlZFBheWxvYWQsIGJpbmFyeVR5cGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGVkUGFja2V0cyA9IGVuY29kZWRQYXlsb2FkLnNwbGl0KFNFUEFSQVRPUik7XG4gICAgY29uc3QgcGFja2V0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW5jb2RlZFBhY2tldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZFBhY2tldCA9IGRlY29kZVBhY2tldChlbmNvZGVkUGFja2V0c1tpXSwgYmluYXJ5VHlwZSk7XG4gICAgICAgIHBhY2tldHMucHVzaChkZWNvZGVkUGFja2V0KTtcbiAgICAgICAgaWYgKGRlY29kZWRQYWNrZXQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFja2V0cztcbn07XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSgpIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybVN0cmVhbSh7XG4gICAgICAgIHRyYW5zZm9ybShwYWNrZXQsIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGVuY29kZVBhY2tldFRvQmluYXJ5KHBhY2tldCwgKGVuY29kZWRQYWNrZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gZW5jb2RlZFBhY2tldC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcjtcbiAgICAgICAgICAgICAgICAvLyBpbnNwaXJlZCBieSB0aGUgV2ViU29ja2V0IGZvcm1hdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldHNfQVBJL1dyaXRpbmdfV2ViU29ja2V0X3NlcnZlcnMjZGVjb2RpbmdfcGF5bG9hZF9sZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSgxKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFWaWV3KGhlYWRlci5idWZmZXIpLnNldFVpbnQ4KDAsIHBheWxvYWRMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoIDwgNjU1MzYpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoMCwgMTI2KTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoMSwgcGF5bG9hZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhoZWFkZXIuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OCgwLCAxMjcpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NCgxLCBCaWdJbnQocGF5bG9hZExlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmaXJzdCBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgcGxhaW4gdGV4dCAoMCkgb3IgYmluYXJ5ICgxKVxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiB0eXBlb2YgcGFja2V0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzBdIHw9IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShoZWFkZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShlbmNvZGVkUGFja2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxubGV0IFRFWFRfREVDT0RFUjtcbmZ1bmN0aW9uIHRvdGFsTGVuZ3RoKGNodW5rcykge1xuICAgIHJldHVybiBjaHVua3MucmVkdWNlKChhY2MsIGNodW5rKSA9PiBhY2MgKyBjaHVuay5sZW5ndGgsIDApO1xufVxuZnVuY3Rpb24gY29uY2F0Q2h1bmtzKGNodW5rcywgc2l6ZSkge1xuICAgIGlmIChjaHVua3NbMF0ubGVuZ3RoID09PSBzaXplKSB7XG4gICAgICAgIHJldHVybiBjaHVua3Muc2hpZnQoKTtcbiAgICB9XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgbGV0IGogPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgIGJ1ZmZlcltpXSA9IGNodW5rc1swXVtqKytdO1xuICAgICAgICBpZiAoaiA9PT0gY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgY2h1bmtzLnNoaWZ0KCk7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2h1bmtzLmxlbmd0aCAmJiBqIDwgY2h1bmtzWzBdLmxlbmd0aCkge1xuICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF0uc2xpY2Uoaik7XG4gICAgfVxuICAgIHJldHVybiBidWZmZXI7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbShtYXhQYXlsb2FkLCBiaW5hcnlUeXBlKSB7XG4gICAgaWYgKCFURVhUX0RFQ09ERVIpIHtcbiAgICAgICAgVEVYVF9ERUNPREVSID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgfVxuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGxldCBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgbGV0IGV4cGVjdGVkTGVuZ3RoID0gLTE7XG4gICAgbGV0IGlzQmluYXJ5ID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1TdHJlYW0oe1xuICAgICAgICB0cmFuc2Zvcm0oY2h1bmssIGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAwIC8qIFN0YXRlLlJFQURfSEVBREVSICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gY29uY2F0Q2h1bmtzKGNodW5rcywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlzQmluYXJ5ID0gKGhlYWRlclswXSAmIDB4ODApID09PSAweDgwO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IGhlYWRlclswXSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA8IDEyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfNjQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEgLyogU3RhdGUuUkVBRF9FWFRFTkRFRF9MRU5HVEhfMTYgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoKGNodW5rcykgPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJBcnJheSA9IGNvbmNhdENodW5rcyhjaHVua3MsIDIpO1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG5ldyBEYXRhVmlldyhoZWFkZXJBcnJheS5idWZmZXIsIGhlYWRlckFycmF5LmJ5dGVPZmZzZXQsIGhlYWRlckFycmF5Lmxlbmd0aCkuZ2V0VWludDE2KDApO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDMgLyogU3RhdGUuUkVBRF9QQVlMT0FEICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gMiAvKiBTdGF0ZS5SRUFEX0VYVEVOREVEX0xFTkdUSF82NCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxMZW5ndGgoY2h1bmtzKSA8IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckFycmF5ID0gY29uY2F0Q2h1bmtzKGNodW5rcywgOCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyQXJyYXkuYnVmZmVyLCBoZWFkZXJBcnJheS5ieXRlT2Zmc2V0LCBoZWFkZXJBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdmlldy5nZXRVaW50MzIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuID4gTWF0aC5wb3coMiwgNTMgLSAzMikgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWF4aW11bSBzYWZlIGludGVnZXIgaW4gSmF2YVNjcmlwdCBpcyAyXjUzIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZExlbmd0aCA9IG4gKiBNYXRoLnBvdygyLCAzMikgKyB2aWV3LmdldFVpbnQzMig0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIFN0YXRlLlJFQURfUEFZTE9BRCAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbExlbmd0aChjaHVua3MpIDwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb25jYXRDaHVua3MoY2h1bmtzLCBleHBlY3RlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShkZWNvZGVQYWNrZXQoaXNCaW5hcnkgPyBkYXRhIDogVEVYVF9ERUNPREVSLmRlY29kZShkYXRhKSwgYmluYXJ5VHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAgLyogU3RhdGUuUkVBRF9IRUFERVIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZExlbmd0aCA9PT0gMCB8fCBleHBlY3RlZExlbmd0aCA+IG1heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKEVSUk9SX1BBQ0tFVCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDQ7XG5leHBvcnQgeyBlbmNvZGVQYWNrZXQsIGVuY29kZVBheWxvYWQsIGRlY29kZVBhY2tldCwgZGVjb2RlUGF5bG9hZCwgfTtcbiIsICIvKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufVxuXG4vKipcbiAqIE1peGluIHRoZSBlbWl0dGVyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWl4aW4ob2JqKSB7XG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xuICAgIG9ialtrZXldID0gRW1pdHRlci5wcm90b3R5cGVba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIExpc3RlbiBvbiB0aGUgZ2l2ZW4gYGV2ZW50YCB3aXRoIGBmbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub24gPVxuRW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxuICAgIC5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxuICogdGltZSB0aGVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcbiAgZnVuY3Rpb24gb24oKSB7XG4gICAgdGhpcy5vZmYoZXZlbnQsIG9uKTtcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb24uZm4gPSBmbjtcbiAgdGhpcy5vbihldmVudCwgb24pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG5FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICAvLyBhbGxcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gIGlmICghY2FsbGJhY2tzKSByZXR1cm4gdGhpcztcblxuICAvLyByZW1vdmUgYWxsIGhhbmRsZXJzXG4gIGlmICgxID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHJlbW92ZSBzcGVjaWZpYyBoYW5kbGVyXG4gIHZhciBjYjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICBjYiA9IGNhbGxiYWNrc1tpXTtcbiAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBldmVudCBzcGVjaWZpYyBhcnJheXMgZm9yIGV2ZW50IHR5cGVzIHRoYXQgbm9cbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcblxuICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgfVxuXG4gIGlmIChjYWxsYmFja3MpIHtcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgY2FsbGJhY2tzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gYWxpYXMgdXNlZCBmb3IgcmVzZXJ2ZWQgZXZlbnRzIChwcm90ZWN0ZWQgbWV0aG9kKVxuRW1pdHRlci5wcm90b3R5cGUuZW1pdFJlc2VydmVkID0gRW1pdHRlci5wcm90b3R5cGUuZW1pdDtcblxuLyoqXG4gKiBSZXR1cm4gYXJyYXkgb2YgY2FsbGJhY2tzIGZvciBgZXZlbnRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xuICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBlbWl0dGVyIGhhcyBgZXZlbnRgIGhhbmRsZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICByZXR1cm4gISEgdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aDtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IG5leHRUaWNrID0gKCgpID0+IHtcbiAgICBjb25zdCBpc1Byb21pc2VBdmFpbGFibGUgPSB0eXBlb2YgUHJvbWlzZSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBQcm9taXNlLnJlc29sdmUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICBpZiAoaXNQcm9taXNlQXZhaWxhYmxlKSB7XG4gICAgICAgIHJldHVybiAoY2IpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChjYiwgc2V0VGltZW91dEZuKSA9PiBzZXRUaW1lb3V0Rm4oY2IsIDApO1xuICAgIH1cbn0pKCk7XG5leHBvcnQgY29uc3QgZ2xvYmFsVGhpc1NoaW0gPSAoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbiAgICB9XG59KSgpO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRCaW5hcnlUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvb2tpZUphcigpIHsgfVxuIiwgImltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCBmdW5jdGlvbiBwaWNrKG9iaiwgLi4uYXR0cikge1xuICAgIHJldHVybiBhdHRyLnJlZHVjZSgoYWNjLCBrKSA9PiB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgIGFjY1trXSA9IG9ialtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cbi8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgdGltZW91dCBmdW5jdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aGVuIG92ZXJyaWRkZW5cbmNvbnN0IE5BVElWRV9TRVRfVElNRU9VVCA9IGdsb2JhbFRoaXMuc2V0VGltZW91dDtcbmNvbnN0IE5BVElWRV9DTEVBUl9USU1FT1VUID0gZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFRpbWVyRnVuY3Rpb25zKG9iaiwgb3B0cykge1xuICAgIGlmIChvcHRzLnVzZU5hdGl2ZVRpbWVycykge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gTkFUSVZFX1NFVF9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IE5BVElWRV9DTEVBUl9USU1FT1VULmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmouc2V0VGltZW91dEZuID0gZ2xvYmFsVGhpcy5zZXRUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgICAgIG9iai5jbGVhclRpbWVvdXRGbiA9IGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0LmJpbmQoZ2xvYmFsVGhpcyk7XG4gICAgfVxufVxuLy8gYmFzZTY0IGVuY29kZWQgYnVmZmVycyBhcmUgYWJvdXQgMzMlIGJpZ2dlciAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0KVxuY29uc3QgQkFTRTY0X09WRVJIRUFEID0gMS4zMztcbi8vIHdlIGNvdWxkIGFsc28gaGF2ZSB1c2VkIGBuZXcgQmxvYihbb2JqXSkuc2l6ZWAsIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgaW4gSUU5XG5leHBvcnQgZnVuY3Rpb24gYnl0ZUxlbmd0aChvYmopIHtcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdXRmOExlbmd0aChvYmopO1xuICAgIH1cbiAgICAvLyBhcnJheWJ1ZmZlciBvciBibG9iXG4gICAgcmV0dXJuIE1hdGguY2VpbCgob2JqLmJ5dGVMZW5ndGggfHwgb2JqLnNpemUpICogQkFTRTY0X09WRVJIRUFEKTtcbn1cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgoc3RyKSB7XG4gICAgbGV0IGMgPSAwLCBsZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3RyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgbGVuZ3RoICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICAgICAgICBsZW5ndGggKz0gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGxlbmd0aCArPSA0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZW5ndGg7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSA4LWNoYXJhY3RlcnMgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICAgIHJldHVybiAoRGF0ZS5ub3coKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDMpICtcbiAgICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDUpKTtcbn1cbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9xdWVyeXN0cmluZ1xuLyoqXG4gKiBDb21waWxlcyBhIHF1ZXJ5c3RyaW5nXG4gKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShvYmopIHtcbiAgICBsZXQgc3RyID0gJyc7XG4gICAgZm9yIChsZXQgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgpXG4gICAgICAgICAgICAgICAgc3RyICs9ICcmJztcbiAgICAgICAgICAgIHN0ciArPSBlbmNvZGVVUklDb21wb25lbnQoaSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuLyoqXG4gKiBQYXJzZXMgYSBzaW1wbGUgcXVlcnlzdHJpbmcgaW50byBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHFzKSB7XG4gICAgbGV0IHFyeSA9IHt9O1xuICAgIGxldCBwYWlycyA9IHFzLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwYWlycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICBxcnlbZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHFyeTtcbn1cbiIsICJpbXBvcnQgeyBkZWNvZGVQYWNrZXQgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBpbnN0YWxsVGltZXJGdW5jdGlvbnMgfSBmcm9tIFwiLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBlbmNvZGUgfSBmcm9tIFwiLi9jb250cmliL3BhcnNlcXMuanNcIjtcbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFzb24sIGRlc2NyaXB0aW9uLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy50eXBlID0gXCJUcmFuc3BvcnRFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBUcmFuc3BvcnQgYWJzdHJhY3QgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5xdWVyeSA9IG9wdHMucXVlcnk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gb3B0cy5zb2NrZXQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSAhb3B0cy5mb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcmVhc29uXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIGNvbnRleHQgLSB0aGUgZXJyb3IgY29udGV4dFxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH0gZm9yIGNoYWluaW5nXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uRXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkge1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBuZXcgVHJhbnNwb3J0RXJyb3IocmVhc29uLCBkZXNjcmlwdGlvbiwgY29udGV4dCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydC5cbiAgICAgKi9cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5pbmdcIjtcbiAgICAgICAgdGhpcy5kb09wZW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgdHJhbnNwb3J0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5pbmdcIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmRvQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub25DbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBtdWx0aXBsZSBwYWNrZXRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFja2V0c1xuICAgICAqL1xuICAgIHNlbmQocGFja2V0cykge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgdGhpcy53cml0ZShwYWNrZXRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZSB0cmFuc3BvcnQgd2FzIHNpbGVudGx5IGNsb3NlZCBpbiB0aGUgYmVmb3JldW5sb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBvcGVuXG4gICAgICpcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgIHN1cGVyLmVtaXRSZXNlcnZlZChcIm9wZW5cIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGF0YVxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBwYWNrZXQgPSBkZWNvZGVQYWNrZXQoZGF0YSwgdGhpcy5zb2NrZXQuYmluYXJ5VHlwZSk7XG4gICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdpdGggYSBkZWNvZGVkIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvblBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwicGFja2V0XCIsIHBhY2tldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGNsb3NlLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG9uQ2xvc2UoZGV0YWlscykge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCBkZXRhaWxzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB0cmFuc3BvcnQsIGluIG9yZGVyIG5vdCB0byBsb3NlIHBhY2tldHMgZHVyaW5nIGFuIHVwZ3JhZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25QYXVzZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHsgfVxuICAgIGNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIChzY2hlbWEgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICB0aGlzLl9ob3N0bmFtZSgpICtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQoKSArXG4gICAgICAgICAgICB0aGlzLm9wdHMucGF0aCArXG4gICAgICAgICAgICB0aGlzLl9xdWVyeShxdWVyeSkpO1xuICAgIH1cbiAgICBfaG9zdG5hbWUoKSB7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gdGhpcy5vcHRzLmhvc3RuYW1lO1xuICAgICAgICByZXR1cm4gaG9zdG5hbWUuaW5kZXhPZihcIjpcIikgPT09IC0xID8gaG9zdG5hbWUgOiBcIltcIiArIGhvc3RuYW1lICsgXCJdXCI7XG4gICAgfVxuICAgIF9wb3J0KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnQgJiZcbiAgICAgICAgICAgICgodGhpcy5vcHRzLnNlY3VyZSAmJiBOdW1iZXIodGhpcy5vcHRzLnBvcnQgIT09IDQ0MykpIHx8XG4gICAgICAgICAgICAgICAgKCF0aGlzLm9wdHMuc2VjdXJlICYmIE51bWJlcih0aGlzLm9wdHMucG9ydCkgIT09IDgwKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIjpcIiArIHRoaXMub3B0cy5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3F1ZXJ5KHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRRdWVyeSA9IGVuY29kZShxdWVyeSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkUXVlcnkubGVuZ3RoID8gXCI/XCIgKyBlbmNvZGVkUXVlcnkgOiBcIlwiO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGF5bG9hZCwgZGVjb2RlUGF5bG9hZCB9IGZyb20gXCJlbmdpbmUuaW8tcGFyc2VyXCI7XG5leHBvcnQgY2xhc3MgUG9sbGluZyBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcInBvbGxpbmdcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIHNvY2tldCAodHJpZ2dlcnMgcG9sbGluZykuIFdlIHdyaXRlIGEgUElORyBtZXNzYWdlIHRvIGRldGVybWluZVxuICAgICAqIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGRvT3BlbigpIHtcbiAgICAgICAgdGhpcy5fcG9sbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgcG9sbGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uUGF1c2UgLSBjYWxsYmFjayB1cG9uIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgYW5kIHRyYW5zcG9ydCBpcyBwYXVzZWRcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIHBhdXNlKG9uUGF1c2UpIHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzaW5nXCI7XG4gICAgICAgIGNvbnN0IHBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJwYXVzZWRcIjtcbiAgICAgICAgICAgIG9uUGF1c2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuX3BvbGxpbmcgfHwgIXRoaXMud3JpdGFibGUpIHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5fcG9sbGluZykge1xuICAgICAgICAgICAgICAgIHRvdGFsKys7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLS10b3RhbCB8fCBwYXVzZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoXCJkcmFpblwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC0tdG90YWwgfHwgcGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHBvbGxpbmcgY3ljbGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wb2xsKCkge1xuICAgICAgICB0aGlzLl9wb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kb1BvbGwoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwb2xsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVybG9hZHMgb25EYXRhIHRvIGRldGVjdCBwYXlsb2Fkcy5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IChwYWNrZXQpID0+IHtcbiAgICAgICAgICAgIC8vIGlmIGl0cyB0aGUgZmlyc3QgbWVzc2FnZSB3ZSBjb25zaWRlciB0aGUgdHJhbnNwb3J0IG9wZW5cbiAgICAgICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIHBhY2tldC50eXBlID09PSBcIm9wZW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBpdHMgYSBjbG9zZSBwYWNrZXQsIHdlIGNsb3NlIHRoZSBvbmdvaW5nIHJlcXVlc3RzXG4gICAgICAgICAgICBpZiAoXCJjbG9zZVwiID09PSBwYWNrZXQudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZSh7IGRlc2NyaXB0aW9uOiBcInRyYW5zcG9ydCBjbG9zZWQgYnkgdGhlIHNlcnZlclwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBieXBhc3Mgb25EYXRhIGFuZCBoYW5kbGUgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMub25QYWNrZXQocGFja2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVjb2RlIHBheWxvYWRcbiAgICAgICAgZGVjb2RlUGF5bG9hZChkYXRhLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gaWYgYW4gZXZlbnQgZGlkIG5vdCB0cmlnZ2VyIGNsb3NpbmdcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgIT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gaWYgd2UgZ290IGRhdGEgd2UncmUgbm90IHBvbGxpbmdcbiAgICAgICAgICAgIHRoaXMuX3BvbGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9sbENvbXBsZXRlXCIpO1xuICAgICAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2xsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgcG9sbGluZywgc2VuZCBhIGNsb3NlIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUoW3sgdHlwZTogXCJjbG9zZVwiIH1dKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIGNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3JlIHRyeWluZyB0byBjbG9zZSB3aGlsZVxuICAgICAgICAgICAgLy8gaGFuZHNoYWtpbmcgaXMgaW4gcHJvZ3Jlc3MgKEdILTE2NClcbiAgICAgICAgICAgIHRoaXMub25jZShcIm9wZW5cIiwgY2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhY2tldHMgLSBkYXRhIHBhY2tldHNcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGVuY29kZVBheWxvYWQocGFja2V0cywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkcmFpblwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHVyaSBmb3IgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXJpKCkge1xuICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdHMuc2VjdXJlID8gXCJodHRwc1wiIDogXCJodHRwXCI7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcbiAgICAgICAgLy8gY2FjaGUgYnVzdGluZyBpcyBmb3JjZWRcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHNCaW5hcnkgJiYgIXF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgcXVlcnkuYjY0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcmkoc2NoZW1hLCBxdWVyeSk7XG4gICAgfVxufVxuIiwgIi8vIGltcG9ydGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvbmVudC9oYXMtY29yc1xubGV0IHZhbHVlID0gZmFsc2U7XG50cnkge1xuICAgIHZhbHVlID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbn1cbmNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiBYTUxIdHRwIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gSUUgdGhlbiBpdCB3aWxsIHRocm93XG4gICAgLy8gd2hlbiB0cnlpbmcgdG8gY3JlYXRlXG59XG5leHBvcnQgY29uc3QgaGFzQ09SUyA9IHZhbHVlO1xuIiwgImltcG9ydCB7IFBvbGxpbmcgfSBmcm9tIFwiLi9wb2xsaW5nLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgcGljayB9IGZyb20gXCIuLi91dGlsLmpzXCI7XG5pbXBvcnQgeyBnbG9iYWxUaGlzU2hpbSBhcyBnbG9iYWxUaGlzIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgaGFzQ09SUyB9IGZyb20gXCIuLi9jb250cmliL2hhcy1jb3JzLmpzXCI7XG5mdW5jdGlvbiBlbXB0eSgpIHsgfVxuZXhwb3J0IGNsYXNzIEJhc2VYSFIgZXh0ZW5kcyBQb2xsaW5nIHtcbiAgICAvKipcbiAgICAgKiBYSFIgUG9sbGluZyBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gICAgICogQHBhY2thZ2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjb25zdCBpc1NTTCA9IFwiaHR0cHM6XCIgPT09IGxvY2F0aW9uLnByb3RvY29sO1xuICAgICAgICAgICAgbGV0IHBvcnQgPSBsb2NhdGlvbi5wb3J0O1xuICAgICAgICAgICAgLy8gc29tZSB1c2VyIGFnZW50cyBoYXZlIGVtcHR5IGBsb2NhdGlvbi5wb3J0YFxuICAgICAgICAgICAgaWYgKCFwb3J0KSB7XG4gICAgICAgICAgICAgICAgcG9ydCA9IGlzU1NMID8gXCI0NDNcIiA6IFwiODBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMueGQgPVxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSAhPT0gbG9jYXRpb24uaG9zdG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHBvcnQgIT09IG9wdHMucG9ydDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsZWQgdXBvbiBmbHVzaC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGRvV3JpdGUoZGF0YSwgZm4pIHtcbiAgICAgICAgY29uc3QgcmVxID0gdGhpcy5yZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKFwic3VjY2Vzc1wiLCBmbik7XG4gICAgICAgIHJlcS5vbihcImVycm9yXCIsICh4aHJTdGF0dXMsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsIHhoclN0YXR1cywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBwb2xsIGN5Y2xlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkb1BvbGwoKSB7XG4gICAgICAgIGNvbnN0IHJlcSA9IHRoaXMucmVxdWVzdCgpO1xuICAgICAgICByZXEub24oXCJkYXRhXCIsIHRoaXMub25EYXRhLmJpbmQodGhpcykpO1xuICAgICAgICByZXEub24oXCJlcnJvclwiLCAoeGhyU3RhdHVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IoXCJ4aHIgcG9sbCBlcnJvclwiLCB4aHJTdGF0dXMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb2xsWGhyID0gcmVxO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNyZWF0ZVJlcXVlc3QsIHVyaSwgb3B0cykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0O1xuICAgICAgICBpbnN0YWxsVGltZXJGdW5jdGlvbnModGhpcywgb3B0cyk7XG4gICAgICAgIHRoaXMuX29wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLl9tZXRob2QgPSBvcHRzLm1ldGhvZCB8fCBcIkdFVFwiO1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB1bmRlZmluZWQgIT09IG9wdHMuZGF0YSA/IG9wdHMuZGF0YSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2NyZWF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBYSFIgb2JqZWN0IGFuZCBzZW5kcyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NyZWF0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvcHRzID0gcGljayh0aGlzLl9vcHRzLCBcImFnZW50XCIsIFwicGZ4XCIsIFwia2V5XCIsIFwicGFzc3BocmFzZVwiLCBcImNlcnRcIiwgXCJjYVwiLCBcImNpcGhlcnNcIiwgXCJyZWplY3RVbmF1dGhvcml6ZWRcIiwgXCJhdXRvVW5yZWZcIik7XG4gICAgICAgIG9wdHMueGRvbWFpbiA9ICEhdGhpcy5fb3B0cy54ZDtcbiAgICAgICAgY29uc3QgeGhyID0gKHRoaXMuX3hociA9IHRoaXMuY3JlYXRlUmVxdWVzdChvcHRzKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB4aHIub3Blbih0aGlzLl9tZXRob2QsIHRoaXMuX3VyaSwgdHJ1ZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXREaXNhYmxlSGVhZGVyQ2hlY2sgJiYgeGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLl9vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdHMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaSwgdGhpcy5fb3B0cy5leHRyYUhlYWRlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgaWYgKFwiUE9TVFwiID09PSB0aGlzLl9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLCBcIiovKlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMuX29wdHMuY29va2llSmFyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkQ29va2llcyh4aHIpO1xuICAgICAgICAgICAgLy8gaWU2IGNoZWNrXG4gICAgICAgICAgICBpZiAoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHIpIHtcbiAgICAgICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy5fb3B0cy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dCkge1xuICAgICAgICAgICAgICAgIHhoci50aW1lb3V0ID0gdGhpcy5fb3B0cy5yZXF1ZXN0VGltZW91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLl9vcHRzLmNvb2tpZUphcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcnNlQ29va2llcyhcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJzZXQtY29va2llXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDQgIT09IHhoci5yZWFkeVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0geGhyLnN0YXR1cyB8fCAxMjIzID09PSB4aHIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBgZXJyb3JgIGV2ZW50IGhhbmRsZXIgdGhhdCdzIHVzZXItc2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHRocm93IGluIHRoZSBzYW1lIHRpY2sgYW5kIGdldHMgY2F1Z2h0IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlb2YgeGhyLnN0YXR1cyA9PT0gXCJudW1iZXJcIiA/IHhoci5zdGF0dXMgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHhoci5zZW5kKHRoaXMuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGRlZmVyIHNpbmNlIC5jcmVhdGUoKSBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29uc3RydWN0b3JcbiAgICAgICAgICAgIC8vIGFuZCB0aHVzIHRoZSAnZXJyb3InIGV2ZW50IGNhbiBvbmx5IGJlIG9ubHkgYm91bmQgKmFmdGVyKiB0aGlzIGV4Y2VwdGlvblxuICAgICAgICAgICAgLy8gb2NjdXJzLiAgVGhlcmVmb3JlLCBhbHNvLCB3ZSBjYW5ub3QgdGhyb3cgaGVyZSBhdCBhbGwuXG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gUmVxdWVzdC5yZXF1ZXN0c0NvdW50Kys7XG4gICAgICAgICAgICBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vbkVycm9yKGVycikge1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVyciwgdGhpcy5feGhyKTtcbiAgICAgICAgdGhpcy5fY2xlYW51cCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGhvdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2xlYW51cChmcm9tRXJyb3IpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB0aGlzLl94aHIgfHwgbnVsbCA9PT0gdGhpcy5feGhyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGVtcHR5O1xuICAgICAgICBpZiAoZnJvbUVycm9yKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuX2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBsb2FkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25Mb2FkKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5feGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZGF0YVwiLCBkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFja2FnZVxuICAgICAqL1xuICAgIGFib3J0KCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgfVxufVxuUmVxdWVzdC5yZXF1ZXN0c0NvdW50ID0gMDtcblJlcXVlc3QucmVxdWVzdHMgPSB7fTtcbi8qKlxuICogQWJvcnRzIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB1bmxvYWRpbmcgdGhlIHdpbmRvdy4gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudFxuICogbWVtb3J5IGxlYWtzIChlLmcuIHdoZW4gdXNpbmcgSUUpIGFuZCB0byBlbnN1cmUgdGhhdCBubyBzcHVyaW91cyBlcnJvciBpc1xuICogZW1pdHRlZC5cbiAqL1xuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIGF0dGFjaEV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhdHRhY2hFdmVudChcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHRlcm1pbmF0aW9uRXZlbnQgPSBcIm9ucGFnZWhpZGVcIiBpbiBnbG9iYWxUaGlzID8gXCJwYWdlaGlkZVwiIDogXCJ1bmxvYWRcIjtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcih0ZXJtaW5hdGlvbkV2ZW50LCB1bmxvYWRIYW5kbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5sb2FkSGFuZGxlcigpIHtcbiAgICBmb3IgKGxldCBpIGluIFJlcXVlc3QucmVxdWVzdHMpIHtcbiAgICAgICAgaWYgKFJlcXVlc3QucmVxdWVzdHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIFJlcXVlc3QucmVxdWVzdHNbaV0uYWJvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGhhc1hIUjIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHhociA9IG5ld1JlcXVlc3Qoe1xuICAgICAgICB4ZG9tYWluOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4geGhyICYmIHhoci5yZXNwb25zZVR5cGUgIT09IG51bGw7XG59KSgpO1xuLyoqXG4gKiBIVFRQIGxvbmctcG9sbGluZyBiYXNlZCBvbiB0aGUgYnVpbHQtaW4gYFhNTEh0dHBSZXF1ZXN0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXJcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgWEhSIGV4dGVuZHMgQmFzZVhIUiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgY29uc3QgZm9yY2VCYXNlNjQgPSBvcHRzICYmIG9wdHMuZm9yY2VCYXNlNjQ7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNCaW5hcnkgPSBoYXNYSFIyICYmICFmb3JjZUJhc2U2NDtcbiAgICB9XG4gICAgcmVxdWVzdChvcHRzID0ge30pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRzLCB7IHhkOiB0aGlzLnhkIH0sIHRoaXMub3B0cyk7XG4gICAgICAgIHJldHVybiBuZXcgUmVxdWVzdChuZXdSZXF1ZXN0LCB0aGlzLnVyaSgpLCBvcHRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuZXdSZXF1ZXN0KG9wdHMpIHtcbiAgICBjb25zdCB4ZG9tYWluID0gb3B0cy54ZG9tYWluO1xuICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBvbiBJRVxuICAgIHRyeSB7XG4gICAgICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgKCF4ZG9tYWluIHx8IGhhc0NPUlMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHsgfVxuICAgIGlmICgheGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBnbG9iYWxUaGlzW1tcIkFjdGl2ZVwiXS5jb25jYXQoXCJPYmplY3RcIikuam9pbihcIlhcIildKFwiTWljcm9zb2Z0LlhNTEhUVFBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tIFwiLi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBwaWNrLCByYW5kb21TdHJpbmcgfSBmcm9tIFwiLi4vdXRpbC5qc1wiO1xuaW1wb3J0IHsgZW5jb2RlUGFja2V0IH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGdsb2JhbFRoaXNTaGltIGFzIGdsb2JhbFRoaXMsIG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuLy8gZGV0ZWN0IFJlYWN0TmF0aXZlIGVudmlyb25tZW50XG5jb25zdCBpc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIG5hdmlnYXRvci5wcm9kdWN0LnRvTG93ZXJDYXNlKCkgPT09IFwicmVhY3RuYXRpdmVcIjtcbmV4cG9ydCBjbGFzcyBCYXNlV1MgZXh0ZW5kcyBUcmFuc3BvcnQge1xuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gXCJ3ZWJzb2NrZXRcIjtcbiAgICB9XG4gICAgZG9PcGVuKCkge1xuICAgICAgICBjb25zdCB1cmkgPSB0aGlzLnVyaSgpO1xuICAgICAgICBjb25zdCBwcm90b2NvbHMgPSB0aGlzLm9wdHMucHJvdG9jb2xzO1xuICAgICAgICAvLyBSZWFjdCBOYXRpdmUgb25seSBzdXBwb3J0cyB0aGUgJ2hlYWRlcnMnIG9wdGlvbiwgYW5kIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIGFueXRoaW5nIGVsc2UgaXMgcGFzc2VkXG4gICAgICAgIGNvbnN0IG9wdHMgPSBpc1JlYWN0TmF0aXZlXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IHBpY2sodGhpcy5vcHRzLCBcImFnZW50XCIsIFwicGVyTWVzc2FnZURlZmxhdGVcIiwgXCJwZnhcIiwgXCJrZXlcIiwgXCJwYXNzcGhyYXNlXCIsIFwiY2VydFwiLCBcImNhXCIsIFwiY2lwaGVyc1wiLCBcInJlamVjdFVuYXV0aG9yaXplZFwiLCBcImxvY2FsQWRkcmVzc1wiLCBcInByb3RvY29sVmVyc2lvblwiLCBcIm9yaWdpblwiLCBcIm1heFBheWxvYWRcIiwgXCJmYW1pbHlcIiwgXCJjaGVja1NlcnZlcklkZW50aXR5XCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRzLmV4dHJhSGVhZGVycykge1xuICAgICAgICAgICAgb3B0cy5oZWFkZXJzID0gdGhpcy5vcHRzLmV4dHJhSGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53cyA9IHRoaXMuY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3MuYmluYXJ5VHlwZSA9IHRoaXMuc29ja2V0LmJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMud3MuX3NvY2tldC51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk9wZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHRoaXMub25DbG9zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiBjbG9zZWRcIixcbiAgICAgICAgICAgIGNvbnRleHQ6IGNsb3NlRXZlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChldikgPT4gdGhpcy5vbkRhdGEoZXYuZGF0YSk7XG4gICAgICAgIHRoaXMud3Mub25lcnJvciA9IChlKSA9PiB0aGlzLm9uRXJyb3IoXCJ3ZWJzb2NrZXQgZXJyb3JcIiwgZSk7XG4gICAgfVxuICAgIHdyaXRlKHBhY2tldHMpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyBlbmNvZGVQYWNrZXQgZWZmaWNpZW50IGFzIGl0IHVzZXMgV1MgZnJhbWluZ1xuICAgICAgICAvLyBubyBuZWVkIGZvciBlbmNvZGVQYXlsb2FkXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBlbmNvZGVQYWNrZXQocGFja2V0LCB0aGlzLnN1cHBvcnRzQmluYXJ5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB0aGUgd2Vic29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ1dCB0aGUgYnJvd3NlciBkaWRuJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY2hhbmNlIG9mIGluZm9ybWluZyB1cyBhYm91dCBpdCB5ZXQsIGluIHRoYXQgY2FzZSBzZW5kIHdpbGxcbiAgICAgICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9Xcml0ZShwYWNrZXQsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIGRyYWluXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRvIG5leHQgdGljayB0byBhbGxvdyBTb2NrZXQgdG8gY2xlYXIgd3JpdGVCdWZmZXJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImRyYWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9DbG9zZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLndzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLndzLm9uZXJyb3IgPSAoKSA9PiB7IH07XG4gICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLndzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgdXJpIGZvciBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cmkoKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMub3B0cy5zZWN1cmUgPyBcIndzc1wiIDogXCJ3c1wiO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG4gICAgICAgIC8vIGFwcGVuZCB0aW1lc3RhbXAgdG8gVVJJXG4gICAgICAgIGlmICh0aGlzLm9wdHMudGltZXN0YW1wUmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5W3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV0gPSByYW5kb21TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21tdW5pY2F0ZSBiaW5hcnkgc3VwcG9ydCBjYXBhYmlsaXRpZXNcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzQmluYXJ5KSB7XG4gICAgICAgICAgICBxdWVyeS5iNjQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVyaShzY2hlbWEsIHF1ZXJ5KTtcbiAgICB9XG59XG5jb25zdCBXZWJTb2NrZXRDdG9yID0gZ2xvYmFsVGhpcy5XZWJTb2NrZXQgfHwgZ2xvYmFsVGhpcy5Nb3pXZWJTb2NrZXQ7XG4vKipcbiAqIFdlYlNvY2tldCB0cmFuc3BvcnQgYmFzZWQgb24gdGhlIGJ1aWx0LWluIGBXZWJTb2NrZXRgIG9iamVjdC5cbiAqXG4gKiBVc2FnZTogYnJvd3NlciwgTm9kZS5qcyAoc2luY2UgdjIxKSwgRGVubywgQnVuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vbWRuLWFwaV93ZWJzb2NrZXRcbiAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9nbG9iYWxzLmh0bWwjd2Vic29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBXUyBleHRlbmRzIEJhc2VXUyB7XG4gICAgY3JlYXRlU29ja2V0KHVyaSwgcHJvdG9jb2xzLCBvcHRzKSB7XG4gICAgICAgIHJldHVybiAhaXNSZWFjdE5hdGl2ZVxuICAgICAgICAgICAgPyBwcm90b2NvbHNcbiAgICAgICAgICAgICAgICA/IG5ldyBXZWJTb2NrZXRDdG9yKHVyaSwgcHJvdG9jb2xzKVxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldEN0b3IodXJpKVxuICAgICAgICAgICAgOiBuZXcgV2ViU29ja2V0Q3Rvcih1cmksIHByb3RvY29scywgb3B0cyk7XG4gICAgfVxuICAgIGRvV3JpdGUoX3BhY2tldCwgZGF0YSkge1xuICAgICAgICB0aGlzLndzLnNlbmQoZGF0YSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFRyYW5zcG9ydCB9IGZyb20gXCIuLi90cmFuc3BvcnQuanNcIjtcbmltcG9ydCB7IG5leHRUaWNrIH0gZnJvbSBcIi4uL2dsb2JhbHMubm9kZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlUGFja2V0RGVjb2RlclN0cmVhbSwgY3JlYXRlUGFja2V0RW5jb2RlclN0cmVhbSwgfSBmcm9tIFwiZW5naW5lLmlvLXBhcnNlclwiO1xuLyoqXG4gKiBXZWJUcmFuc3BvcnQgdHJhbnNwb3J0IGJhc2VkIG9uIHRoZSBidWlsdC1pbiBgV2ViVHJhbnNwb3J0YCBvYmplY3QuXG4gKlxuICogVXNhZ2U6IGJyb3dzZXIsIE5vZGUuanMgKHdpdGggdGhlIGBAZmFpbHMtY29tcG9uZW50cy93ZWJ0cmFuc3BvcnRgIHBhY2thZ2UpXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViVHJhbnNwb3J0XG4gKiBAc2VlIGh0dHBzOi8vY2FuaXVzZS5jb20vd2VidHJhbnNwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBXVCBleHRlbmRzIFRyYW5zcG9ydCB7XG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBcIndlYnRyYW5zcG9ydFwiO1xuICAgIH1cbiAgICBkb09wZW4oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBuZXcgV2ViVHJhbnNwb3J0KHRoaXMuY3JlYXRlVXJpKFwiaHR0cHNcIiksIHRoaXMub3B0cy50cmFuc3BvcnRPcHRpb25zW3RoaXMubmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LmNsb3NlZFxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKFwid2VidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBub3RlOiB3ZSBjb3VsZCBoYXZlIHVzZWQgYXN5bmMvYXdhaXQsIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgc29tZSBhZGRpdGlvbmFsIHBvbHlmaWxsc1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQucmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnQuY3JlYXRlQmlkaXJlY3Rpb25hbFN0cmVhbSgpLnRoZW4oKHN0cmVhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZXJTdHJlYW0gPSBjcmVhdGVQYWNrZXREZWNvZGVyU3RyZWFtKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCB0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0ucmVhZGFibGUucGlwZVRocm91Z2goZGVjb2RlclN0cmVhbSkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlclN0cmVhbSA9IGNyZWF0ZVBhY2tldEVuY29kZXJTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICBlbmNvZGVyU3RyZWFtLnJlYWRhYmxlLnBpcGVUbyhzdHJlYW0ud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlciA9IGVuY29kZXJTdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QYWNrZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZWFkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0geyB0eXBlOiBcIm9wZW5cIiB9O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5LnNpZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWNrZXQuZGF0YSA9IGB7XCJzaWRcIjpcIiR7dGhpcy5xdWVyeS5zaWR9XCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVyLndyaXRlKHBhY2tldCkudGhlbigoKSA9PiB0aGlzLm9uT3BlbigpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd3JpdGUocGFja2V0cykge1xuICAgICAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gcGFja2V0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RQYWNrZXQgPSBpID09PSBwYWNrZXRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLl93cml0ZXIud3JpdGUocGFja2V0KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2V0VGltZW91dEZuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb0Nsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuX3RyYW5zcG9ydCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IFhIUiB9IGZyb20gXCIuL3BvbGxpbmcteGhyLm5vZGUuanNcIjtcbmltcG9ydCB7IFdTIH0gZnJvbSBcIi4vd2Vic29ja2V0Lm5vZGUuanNcIjtcbmltcG9ydCB7IFdUIH0gZnJvbSBcIi4vd2VidHJhbnNwb3J0LmpzXCI7XG5leHBvcnQgY29uc3QgdHJhbnNwb3J0cyA9IHtcbiAgICB3ZWJzb2NrZXQ6IFdTLFxuICAgIHdlYnRyYW5zcG9ydDogV1QsXG4gICAgcG9sbGluZzogWEhSLFxufTtcbiIsICIvLyBpbXBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nYWxrbi9wYXJzZXVyaVxuLyoqXG4gKiBQYXJzZXMgYSBVUklcbiAqXG4gKiBOb3RlOiB3ZSBjb3VsZCBhbHNvIGhhdmUgdXNlZCB0aGUgYnVpbHQtaW4gVVJMIG9iamVjdCwgYnV0IGl0IGlzbid0IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLlxuICpcbiAqIFNlZTpcbiAqIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTFxuICogLSBodHRwczovL2Nhbml1c2UuY29tL3VybFxuICogLSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKlxuICogSGlzdG9yeSBvZiB0aGUgcGFyc2UoKSBtZXRob2Q6XG4gKiAtIGZpcnN0IGNvbW1pdDogaHR0cHM6Ly9naXRodWIuY29tL3NvY2tldGlvL3NvY2tldC5pby1jbGllbnQvY29tbWl0LzRlZTFkNWQ5NGIzOTA2YTljMDUyYjQ1OWYxYTgxOGIxNWYzOGY5MWNcbiAqIC0gZXhwb3J0IGludG8gaXRzIG93biBtb2R1bGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NrZXRpby9lbmdpbmUuaW8tY2xpZW50L2NvbW1pdC9kZTJjNTYxZTQ1NjRlZmViNzhmMWJkYjFiYTM5ZWY4MWIyODIyY2IzXG4gKiAtIHJlaW1wb3J0OiBodHRwczovL2dpdGh1Yi5jb20vc29ja2V0aW8vZW5naW5lLmlvLWNsaWVudC9jb21taXQvZGYzMjI3N2MzZjZkNjIyZWVjNWVkMDlmNDkzY2FlM2YzMzkxZDI0MlxuICpcbiAqIEBhdXRob3IgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+IChNSVQgbGljZW5zZSlcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5jb25zdCByZSA9IC9eKD86KD8hW146QFxcLz8jXSs6W146QFxcL10qQCkoaHR0cHxodHRwc3x3c3x3c3MpOlxcL1xcLyk/KCg/OigoW146QFxcLz8jXSopKD86OihbXjpAXFwvPyNdKikpPyk/QCk/KCg/OlthLWYwLTldezAsNH06KXsyLDd9W2EtZjAtOV17MCw0fXxbXjpcXC8/I10qKSg/OjooXFxkKikpPykoKChcXC8oPzpbXj8jXSg/IVtePyNcXC9dKlxcLltePyNcXC8uXSsoPzpbPyNdfCQpKSkqXFwvPyk/KFtePyNcXC9dKikpKD86XFw/KFteI10qKSk/KD86IyguKikpPykvO1xuY29uc3QgcGFydHMgPSBbXG4gICAgJ3NvdXJjZScsICdwcm90b2NvbCcsICdhdXRob3JpdHknLCAndXNlckluZm8nLCAndXNlcicsICdwYXNzd29yZCcsICdob3N0JywgJ3BvcnQnLCAncmVsYXRpdmUnLCAncGF0aCcsICdkaXJlY3RvcnknLCAnZmlsZScsICdxdWVyeScsICdhbmNob3InXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoID4gODAwMCkge1xuICAgICAgICB0aHJvdyBcIlVSSSB0b28gbG9uZ1wiO1xuICAgIH1cbiAgICBjb25zdCBzcmMgPSBzdHIsIGIgPSBzdHIuaW5kZXhPZignWycpLCBlID0gc3RyLmluZGV4T2YoJ10nKTtcbiAgICBpZiAoYiAhPSAtMSAmJiBlICE9IC0xKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgYikgKyBzdHIuc3Vic3RyaW5nKGIsIGUpLnJlcGxhY2UoLzovZywgJzsnKSArIHN0ci5zdWJzdHJpbmcoZSwgc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCBtID0gcmUuZXhlYyhzdHIgfHwgJycpLCB1cmkgPSB7fSwgaSA9IDE0O1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdXJpW3BhcnRzW2ldXSA9IG1baV0gfHwgJyc7XG4gICAgfVxuICAgIGlmIChiICE9IC0xICYmIGUgIT0gLTEpIHtcbiAgICAgICAgdXJpLnNvdXJjZSA9IHNyYztcbiAgICAgICAgdXJpLmhvc3QgPSB1cmkuaG9zdC5zdWJzdHJpbmcoMSwgdXJpLmhvc3QubGVuZ3RoIC0gMSkucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuYXV0aG9yaXR5ID0gdXJpLmF1dGhvcml0eS5yZXBsYWNlKCdbJywgJycpLnJlcGxhY2UoJ10nLCAnJykucmVwbGFjZSgvOy9nLCAnOicpO1xuICAgICAgICB1cmkuaXB2NnVyaSA9IHRydWU7XG4gICAgfVxuICAgIHVyaS5wYXRoTmFtZXMgPSBwYXRoTmFtZXModXJpLCB1cmlbJ3BhdGgnXSk7XG4gICAgdXJpLnF1ZXJ5S2V5ID0gcXVlcnlLZXkodXJpLCB1cmlbJ3F1ZXJ5J10pO1xuICAgIHJldHVybiB1cmk7XG59XG5mdW5jdGlvbiBwYXRoTmFtZXMob2JqLCBwYXRoKSB7XG4gICAgY29uc3QgcmVneCA9IC9cXC97Miw5fS9nLCBuYW1lcyA9IHBhdGgucmVwbGFjZShyZWd4LCBcIi9cIikuc3BsaXQoXCIvXCIpO1xuICAgIGlmIChwYXRoLnNsaWNlKDAsIDEpID09ICcvJyB8fCBwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuYW1lcy5zcGxpY2UoMCwgMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PSAnLycpIHtcbiAgICAgICAgbmFtZXMuc3BsaWNlKG5hbWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXM7XG59XG5mdW5jdGlvbiBxdWVyeUtleSh1cmksIHF1ZXJ5KSB7XG4gICAgY29uc3QgZGF0YSA9IHt9O1xuICAgIHF1ZXJ5LnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLCBmdW5jdGlvbiAoJDAsICQxLCAkMikge1xuICAgICAgICBpZiAoJDEpIHtcbiAgICAgICAgICAgIGRhdGFbJDFdID0gJDI7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cbiIsICJpbXBvcnQgeyB0cmFuc3BvcnRzIGFzIERFRkFVTFRfVFJBTlNQT1JUUyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmltcG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucywgYnl0ZUxlbmd0aCB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmltcG9ydCB7IGRlY29kZSB9IGZyb20gXCIuL2NvbnRyaWIvcGFyc2Vxcy5qc1wiO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiLi9jb250cmliL3BhcnNldXJpLmpzXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmltcG9ydCB7IHByb3RvY29sIH0gZnJvbSBcImVuZ2luZS5pby1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZUNvb2tpZUphciwgZGVmYXVsdEJpbmFyeVR5cGUsIG5leHRUaWNrLCB9IGZyb20gXCIuL2dsb2JhbHMubm9kZS5qc1wiO1xuY29uc3Qgd2l0aEV2ZW50TGlzdGVuZXJzID0gdHlwZW9mIGFkZEV2ZW50TGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiByZW1vdmVFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBPRkZMSU5FX0VWRU5UX0xJU1RFTkVSUyA9IFtdO1xuaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgIC8vIHdpdGhpbiBhIFNlcnZpY2VXb3JrZXIsIGFueSBldmVudCBoYW5kbGVyIGZvciB0aGUgJ29mZmxpbmUnIGV2ZW50IG11c3QgYmUgYWRkZWQgb24gdGhlIGluaXRpYWwgZXZhbHVhdGlvbiBvZiB0aGVcbiAgICAvLyBzY3JpcHQsIHNvIHdlIGNyZWF0ZSBvbmUgc2luZ2xlIGV2ZW50IGxpc3RlbmVyIGhlcmUgd2hpY2ggd2lsbCBmb3J3YXJkIHRoZSBldmVudCB0byB0aGUgc29ja2V0IGluc3RhbmNlc1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsICgpID0+IHtcbiAgICAgICAgT0ZGTElORV9FVkVOVF9MSVNURU5FUlMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgIH0sIGZhbHNlKTtcbn1cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIFdlYlNvY2tldC1saWtlIGludGVyZmFjZSB0byBjb25uZWN0IHRvIGFuIEVuZ2luZS5JTyBzZXJ2ZXIuIFRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZXN0YWJsaXNoZWRcbiAqIHdpdGggb25lIG9mIHRoZSBhdmFpbGFibGUgbG93LWxldmVsIHRyYW5zcG9ydHMsIGxpa2UgSFRUUCBsb25nLXBvbGxpbmcsIFdlYlNvY2tldCBvciBXZWJUcmFuc3BvcnQuXG4gKlxuICogVGhpcyBjbGFzcyBjb21lcyB3aXRob3V0IHVwZ3JhZGUgbWVjaGFuaXNtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwga2VlcCB0aGUgZmlyc3QgbG93LWxldmVsIHRyYW5zcG9ydCB0aGF0XG4gKiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogSW4gb3JkZXIgdG8gYWxsb3cgdHJlZS1zaGFraW5nLCB0aGVyZSBhcmUgbm8gdHJhbnNwb3J0cyBpbmNsdWRlZCwgdGhhdCdzIHdoeSB0aGUgYHRyYW5zcG9ydHNgIG9wdGlvbiBpcyBtYW5kYXRvcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldFdpdGhvdXRVcGdyYWRlLCBXZWJTb2NrZXQgfSBmcm9tIFwiZW5naW5lLmlvLWNsaWVudFwiO1xuICpcbiAqIGNvbnN0IHNvY2tldCA9IG5ldyBTb2NrZXRXaXRob3V0VXBncmFkZSh7XG4gKiAgIHRyYW5zcG9ydHM6IFtXZWJTb2NrZXRdXG4gKiB9KTtcbiAqXG4gKiBzb2NrZXQub24oXCJvcGVuXCIsICgpID0+IHtcbiAqICAgc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAqIH0pO1xuICpcbiAqIEBzZWUgU29ja2V0V2l0aFVwZ3JhZGVcbiAqIEBzZWUgU29ja2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXRXaXRob3V0VXBncmFkZSBleHRlbmRzIEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIFNvY2tldCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdXJpIC0gdXJpIG9yIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5iaW5hcnlUeXBlID0gZGVmYXVsdEJpbmFyeVR5cGU7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fcHJldkJ1ZmZlckxlbiA9IDA7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IC0xO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLl9tYXhQYXlsb2FkID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZXhwaXJhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIHtAbGluayBfcGluZ1RpbWVvdXRUaW1lcn0gb2JqZWN0IGlzIHRyYWNrZWQsIGluIGNhc2UgdGhlIHRpbWVyIGlzIHRocm90dGxlZCBhbmQgdGhlXG4gICAgICAgICAqIGNhbGxiYWNrIGlzIG5vdCBmaXJlZCBvbiB0aW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIGV4YW1wbGUgd2hlbiBhIGxhcHRvcCBpcyBzdXNwZW5kZWQgb3Igd2hlbiBhIHBob25lIGlzIGxvY2tlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IEluZmluaXR5O1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVyaSA9IHBhcnNlKHVyaSk7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2VkVXJpLmhvc3Q7XG4gICAgICAgICAgICBvcHRzLnNlY3VyZSA9XG4gICAgICAgICAgICAgICAgcGFyc2VkVXJpLnByb3RvY29sID09PSBcImh0dHBzXCIgfHwgcGFyc2VkVXJpLnByb3RvY29sID09PSBcIndzc1wiO1xuICAgICAgICAgICAgb3B0cy5wb3J0ID0gcGFyc2VkVXJpLnBvcnQ7XG4gICAgICAgICAgICBpZiAocGFyc2VkVXJpLnF1ZXJ5KVxuICAgICAgICAgICAgICAgIG9wdHMucXVlcnkgPSBwYXJzZWRVcmkucXVlcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5ob3N0KSB7XG4gICAgICAgICAgICBvcHRzLmhvc3RuYW1lID0gcGFyc2Uob3B0cy5ob3N0KS5ob3N0O1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUaW1lckZ1bmN0aW9ucyh0aGlzLCBvcHRzKTtcbiAgICAgICAgdGhpcy5zZWN1cmUgPVxuICAgICAgICAgICAgbnVsbCAhPSBvcHRzLnNlY3VyZVxuICAgICAgICAgICAgICAgID8gb3B0cy5zZWN1cmVcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcImh0dHBzOlwiID09PSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgICAgaWYgKG9wdHMuaG9zdG5hbWUgJiYgIW9wdHMucG9ydCkge1xuICAgICAgICAgICAgLy8gaWYgbm8gcG9ydCBpcyBzcGVjaWZpZWQgbWFudWFsbHksIHVzZSB0aGUgcHJvdG9jb2wgZGVmYXVsdFxuICAgICAgICAgICAgb3B0cy5wb3J0ID0gdGhpcy5zZWN1cmUgPyBcIjQ0M1wiIDogXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPVxuICAgICAgICAgICAgb3B0cy5ob3N0bmFtZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhdGlvbi5ob3N0bmFtZSA6IFwibG9jYWxob3N0XCIpO1xuICAgICAgICB0aGlzLnBvcnQgPVxuICAgICAgICAgICAgb3B0cy5wb3J0IHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBsb2NhdGlvbi5wb3J0XG4gICAgICAgICAgICAgICAgICAgID8gbG9jYXRpb24ucG9ydFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VjdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiNDQzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCI4MFwiKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRzID0gW107XG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydHNCeU5hbWUgPSB7fTtcbiAgICAgICAgb3B0cy50cmFuc3BvcnRzLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydE5hbWUgPSB0LnByb3RvdHlwZS5uYW1lO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRzLnB1c2godHJhbnNwb3J0TmFtZSk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc3BvcnRzQnlOYW1lW3RyYW5zcG9ydE5hbWVdID0gdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgcGF0aDogXCIvZW5naW5lLmlvXCIsXG4gICAgICAgICAgICBhZ2VudDogZmFsc2UsXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcFBhcmFtOiBcInRcIixcbiAgICAgICAgICAgIHJlbWVtYmVyVXBncmFkZTogZmFsc2UsXG4gICAgICAgICAgICBhZGRUcmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IHtcbiAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhbnNwb3J0T3B0aW9uczoge30sXG4gICAgICAgICAgICBjbG9zZU9uQmVmb3JldW5sb2FkOiBmYWxzZSxcbiAgICAgICAgfSwgb3B0cyk7XG4gICAgICAgIHRoaXMub3B0cy5wYXRoID1cbiAgICAgICAgICAgIHRoaXMub3B0cy5wYXRoLnJlcGxhY2UoL1xcLyQvLCBcIlwiKSArXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0cy5hZGRUcmFpbGluZ1NsYXNoID8gXCIvXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMucXVlcnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWVyeSA9IGRlY29kZSh0aGlzLm9wdHMucXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRoRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdHMuY2xvc2VPbkJlZm9yZXVubG9hZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggY2xvc2VzIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIFwiYmVmb3JldW5sb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBidXQgbm90IENocm9tZS4gVGhpcyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZXMgZXZlcnkgYnJvd3NlciBiZWhhdmVzIHRoZSBzYW1lIChubyBcImRpc2Nvbm5lY3RcIiBldmVudCBhdCB0aGUgU29ja2V0LklPIGxldmVsIHdoZW4gdGhlIHBhZ2UgaXNcbiAgICAgICAgICAgICAgICAvLyBjbG9zZWQvcmVsb2FkZWQpXG4gICAgICAgICAgICAgICAgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWxlbnRseSBjbG9zZSB0aGUgdHJhbnNwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vZmZsaW5lRXZlbnRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJuZXR3b3JrIGNvbm5lY3Rpb24gbG9zdFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnB1c2godGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9jb29raWVKYXIgPSBjcmVhdGVDb29raWVKYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcGVuKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdHJhbnNwb3J0IG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSB0cmFuc3BvcnQgbmFtZVxuICAgICAqIEByZXR1cm4ge1RyYW5zcG9ydH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNyZWF0ZVRyYW5zcG9ydChuYW1lKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLnF1ZXJ5KTtcbiAgICAgICAgLy8gYXBwZW5kIGVuZ2luZS5pbyBwcm90b2NvbCBpZGVudGlmaWVyXG4gICAgICAgIHF1ZXJ5LkVJTyA9IHByb3RvY29sO1xuICAgICAgICAvLyB0cmFuc3BvcnQgbmFtZVxuICAgICAgICBxdWVyeS50cmFuc3BvcnQgPSBuYW1lO1xuICAgICAgICAvLyBzZXNzaW9uIGlkIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmVcbiAgICAgICAgaWYgKHRoaXMuaWQpXG4gICAgICAgICAgICBxdWVyeS5zaWQgPSB0aGlzLmlkO1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHNvY2tldDogdGhpcyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB0aGlzLmhvc3RuYW1lLFxuICAgICAgICAgICAgc2VjdXJlOiB0aGlzLnNlY3VyZSxcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgICAgfSwgdGhpcy5vcHRzLnRyYW5zcG9ydE9wdGlvbnNbbmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMuX3RyYW5zcG9ydHNCeU5hbWVbbmFtZV0ob3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRyYW5zcG9ydCB0byB1c2UgYW5kIHN0YXJ0cyBwcm9iZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBFbWl0IGVycm9yIG9uIG5leHQgdGljayBzbyBpdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc3BvcnROYW1lID0gdGhpcy5vcHRzLnJlbWVtYmVyVXBncmFkZSAmJlxuICAgICAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuaW5kZXhPZihcIndlYnNvY2tldFwiKSAhPT0gLTFcbiAgICAgICAgICAgID8gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zcG9ydHNbMF07XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwib3BlbmluZ1wiO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmNyZWF0ZVRyYW5zcG9ydCh0cmFuc3BvcnROYW1lKTtcbiAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTtcbiAgICAgICAgdGhpcy5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCB0cmFuc3BvcnQuIERpc2FibGVzIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldFRyYW5zcG9ydCh0cmFuc3BvcnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuICAgICAgICAvLyBzZXQgdXAgdHJhbnNwb3J0IGxpc3RlbmVyc1xuICAgICAgICB0cmFuc3BvcnRcbiAgICAgICAgICAgIC5vbihcImRyYWluXCIsIHRoaXMuX29uRHJhaW4uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIC5vbihcInBhY2tldFwiLCB0aGlzLl9vblBhY2tldC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKFwiY2xvc2VcIiwgKHJlYXNvbikgPT4gdGhpcy5fb25DbG9zZShcInRyYW5zcG9ydCBjbG9zZVwiLCByZWFzb24pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBkZWVtZWQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25PcGVuKCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID1cbiAgICAgICAgICAgIFwid2Vic29ja2V0XCIgPT09IHRoaXMudHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwib3BlblwiKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25QYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcIm9wZW5cIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8XG4gICAgICAgICAgICBcImNsb3NpbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgLy8gU29ja2V0IGlzIGxpdmUgLSBhbnkgcGFja2V0IGNvdW50c1xuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoZWFydGJlYXRcIik7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhY2tldC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkhhbmRzaGFrZShKU09OLnBhcnNlKHBhY2tldC5kYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRQYWNrZXQoXCJwb25nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicG9uZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFwic2VydmVyIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gcGFja2V0LmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkYXRhXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJtZXNzYWdlXCIsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gaGFuZHNoYWtlIGNvbXBsZXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIGhhbmRzaGFrZSBvYmpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJoYW5kc2hha2VcIiwgZGF0YSk7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLnNpZDtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQucXVlcnkuc2lkID0gZGF0YS5zaWQ7XG4gICAgICAgIHRoaXMuX3BpbmdJbnRlcnZhbCA9IGRhdGEucGluZ0ludGVydmFsO1xuICAgICAgICB0aGlzLl9waW5nVGltZW91dCA9IGRhdGEucGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX21heFBheWxvYWQgPSBkYXRhLm1heFBheWxvYWQ7XG4gICAgICAgIHRoaXMub25PcGVuKCk7XG4gICAgICAgIC8vIEluIGNhc2Ugb3BlbiBoYW5kbGVyIGNsb3NlcyBzb2NrZXRcbiAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fcmVzZXRQaW5nVGltZW91dCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGFuZCByZXNldHMgcGluZyB0aW1lb3V0IHRpbWVyIGJhc2VkIG9uIHNlcnZlciBwaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Jlc2V0UGluZ1RpbWVvdXQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGhpcy5fcGluZ1RpbWVvdXRUaW1lcik7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5fcGluZ0ludGVydmFsICsgdGhpcy5fcGluZ1RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZSA9IERhdGUubm93KCkgKyBkZWxheTtcbiAgICAgICAgdGhpcy5fcGluZ1RpbWVvdXRUaW1lciA9IHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3BpbmdUaW1lb3V0VGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgb24gYGRyYWluYCBldmVudFxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfb25EcmFpbigpIHtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCwgdGhpcy5fcHJldkJ1ZmZlckxlbik7XG4gICAgICAgIC8vIHNldHRpbmcgcHJldkJ1ZmZlckxlbiA9IDAgaXMgdmVyeSBpbXBvcnRhbnRcbiAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gdXBncmFkaW5nLCB1cGdyYWRlIHBhY2tldCBpcyBzZW50IG92ZXIsXG4gICAgICAgIC8vIGFuZCBhIG5vbnplcm8gcHJldkJ1ZmZlckxlbiBjb3VsZCBjYXVzZSBwcm9ibGVtcyBvbiBgZHJhaW5gXG4gICAgICAgIHRoaXMuX3ByZXZCdWZmZXJMZW4gPSAwO1xuICAgICAgICBpZiAoMCA9PT0gdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwiZHJhaW5cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRmx1c2ggd3JpdGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmIChcImNsb3NlZFwiICE9PSB0aGlzLnJlYWR5U3RhdGUgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRhYmxlICYmXG4gICAgICAgICAgICAhdGhpcy51cGdyYWRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrZXRzID0gdGhpcy5fZ2V0V3JpdGFibGVQYWNrZXRzKCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kKHBhY2tldHMpO1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBjdXJyZW50IGxlbmd0aCBvZiB3cml0ZUJ1ZmZlclxuICAgICAgICAgICAgLy8gc3BsaWNlIHdyaXRlQnVmZmVyIGFuZCBjYWxsYmFja0J1ZmZlciBvbiBgZHJhaW5gXG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gcGFja2V0cy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImZsdXNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZSB0aGUgZW5jb2RlZCBzaXplIG9mIHRoZSB3cml0ZUJ1ZmZlciBpcyBiZWxvdyB0aGUgbWF4UGF5bG9hZCB2YWx1ZSBzZW50IGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgZm9yIEhUVFBcbiAgICAgKiBsb25nLXBvbGxpbmcpXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRXcml0YWJsZVBhY2tldHMoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZENoZWNrUGF5bG9hZFNpemUgPSB0aGlzLl9tYXhQYXlsb2FkICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5uYW1lID09PSBcInBvbGxpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPiAxO1xuICAgICAgICBpZiAoIXNob3VsZENoZWNrUGF5bG9hZFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndyaXRlQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkU2l6ZSA9IDE7IC8vIGZpcnN0IHBhY2tldCB0eXBlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMud3JpdGVCdWZmZXJbaV0uZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgKz0gYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gMCAmJiBwYXlsb2FkU2l6ZSA+IHRoaXMuX21heFBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI7IC8vIHNlcGFyYXRvciArIHBhY2tldCB0eXBlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGVCdWZmZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBoZWFydGJlYXQgdGltZXIgaGFzIGV4cGlyZWQgYnV0IHRoZSBzb2NrZXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RpZmllZC5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIHByaXZhdGUgZm9yIG5vdyBiZWNhdXNlIGl0IGRvZXMgbm90IHJlYWxseSBmaXQgdGhlIFdlYlNvY2tldCBBUEksIGJ1dCBpZiB3ZSBwdXQgaXQgaW4gdGhlXG4gICAgICogYHdyaXRlKClgIG1ldGhvZCB0aGVuIHRoZSBtZXNzYWdlIHdvdWxkIG5vdCBiZSBidWZmZXJlZCBieSB0aGUgU29ja2V0LklPIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICAvKiBwcml2YXRlICovIF9oYXNQaW5nRXhwaXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9waW5nVGltZW91dFRpbWUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzRXhwaXJlZCA9IERhdGUubm93KCkgPiB0aGlzLl9waW5nVGltZW91dFRpbWU7XG4gICAgICAgIGlmIChoYXNFeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nVGltZW91dFRpbWUgPSAwO1xuICAgICAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoXCJwaW5nIHRpbWVvdXRcIik7XG4gICAgICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0V4cGlyZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybiB7U29ja2V0fSBmb3IgY2hhaW5pbmcuXG4gICAgICovXG4gICAgd3JpdGUobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZS4gQWxpYXMgb2Yge0BsaW5rIFNvY2tldCN3cml0ZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm4ge1NvY2tldH0gZm9yIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHNlbmQobXNnLCBvcHRpb25zLCBmbikge1xuICAgICAgICB0aGlzLl9zZW5kUGFja2V0KFwibWVzc2FnZVwiLCBtc2csIG9wdGlvbnMsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGU6IHBhY2tldCB0eXBlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc2VuZFBhY2tldCh0eXBlLCBkYXRhLCBvcHRpb25zLCBmbikge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGF0YSkge1xuICAgICAgICAgICAgZm4gPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgZm4gPSBvcHRpb25zO1xuICAgICAgICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwiY2xvc2luZ1wiID09PSB0aGlzLnJlYWR5U3RhdGUgfHwgXCJjbG9zZWRcIiA9PT0gdGhpcy5yZWFkeVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29tcHJlc3MgPSBmYWxzZSAhPT0gb3B0aW9ucy5jb21wcmVzcztcbiAgICAgICAgY29uc3QgcGFja2V0ID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldENyZWF0ZVwiLCBwYWNrZXQpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtcbiAgICAgICAgaWYgKGZuKVxuICAgICAgICAgICAgdGhpcy5vbmNlKFwiZmx1c2hcIiwgZm4pO1xuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vbkNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnQuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cEFuZENsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRlXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcInVwZ3JhZGVFcnJvclwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd2FpdEZvclVwZ3JhZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyB3YWl0IGZvciB1cGdyYWRlIHRvIGZpbmlzaCBzaW5jZSB3ZSBjYW4ndCBzZW5kIHBhY2tldHMgd2hpbGUgcGF1c2luZyBhIHRyYW5zcG9ydFxuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZVwiLCBjbGVhbnVwQW5kQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vbmNlKFwidXBncmFkZUVycm9yXCIsIGNsZWFudXBBbmRDbG9zZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChcIm9wZW5pbmdcIiA9PT0gdGhpcy5yZWFkeVN0YXRlIHx8IFwib3BlblwiID09PSB0aGlzLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFwiY2xvc2luZ1wiO1xuICAgICAgICAgICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKFwiZHJhaW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JVcGdyYWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uRXJyb3IoZXJyKSB7XG4gICAgICAgIFNvY2tldFdpdGhvdXRVcGdyYWRlLnByaW9yV2Vic29ja2V0U3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRyeUFsbFRyYW5zcG9ydHMgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0cy5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFwib3BlbmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICB0aGlzLl9vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsIGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHRyYW5zcG9ydCBjbG9zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uQ2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBpZiAoXCJvcGVuaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSB8fFxuICAgICAgICAgICAgXCJjbG9zaW5nXCIgPT09IHRoaXMucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgLy8gY2xlYXIgdGltZXJzXG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dEZuKHRoaXMuX3BpbmdUaW1lb3V0VGltZXIpO1xuICAgICAgICAgICAgLy8gc3RvcCBldmVudCBmcm9tIGZpcmluZyBhZ2FpbiBmb3IgdHJhbnNwb3J0XG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0cmFuc3BvcnQgd29uJ3Qgc3RheSBvcGVuXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydC5jbG9zZSgpO1xuICAgICAgICAgICAgLy8gaWdub3JlIGZ1cnRoZXIgdHJhbnNwb3J0IGNvbW11bmljYXRpb25cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgaWYgKHdpdGhFdmVudExpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iZWZvcmV1bmxvYWRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgdGhpcy5fYmVmb3JldW5sb2FkRXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLmluZGV4T2YodGhpcy5fb2ZmbGluZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxJTkVfRVZFTlRfTElTVEVORVJTLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCByZWFkeSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gXCJjbG9zZWRcIjtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNlc3Npb24gaWRcbiAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuICAgICAgICAgICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjbG9zZVwiLCByZWFzb24sIGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIC8vIGNsZWFuIGJ1ZmZlcnMgYWZ0ZXIsIHNvIHVzZXJzIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZ3JhYiB0aGUgYnVmZmVycyBvbiBgY2xvc2VgIGV2ZW50XG4gICAgICAgICAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgICAgICAgICB0aGlzLl9wcmV2QnVmZmVyTGVuID0gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cblNvY2tldFdpdGhvdXRVcGdyYWRlLnByb3RvY29sID0gcHJvdG9jb2w7XG4vKipcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBXZWJTb2NrZXQtbGlrZSBpbnRlcmZhY2UgdG8gY29ubmVjdCB0byBhbiBFbmdpbmUuSU8gc2VydmVyLiBUaGUgY29ubmVjdGlvbiB3aWxsIGJlIGVzdGFibGlzaGVkXG4gKiB3aXRoIG9uZSBvZiB0aGUgYXZhaWxhYmxlIGxvdy1sZXZlbCB0cmFuc3BvcnRzLCBsaWtlIEhUVFAgbG9uZy1wb2xsaW5nLCBXZWJTb2NrZXQgb3IgV2ViVHJhbnNwb3J0LlxuICpcbiAqIFRoaXMgY2xhc3MgY29tZXMgd2l0aCBhbiB1cGdyYWRlIG1lY2hhbmlzbSwgd2hpY2ggbWVhbnMgdGhhdCBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIGZpcnN0XG4gKiBsb3ctbGV2ZWwgdHJhbnNwb3J0LCBpdCB3aWxsIHRyeSB0byB1cGdyYWRlIHRvIGEgYmV0dGVyIHRyYW5zcG9ydC5cbiAqXG4gKiBJbiBvcmRlciB0byBhbGxvdyB0cmVlLXNoYWtpbmcsIHRoZXJlIGFyZSBubyB0cmFuc3BvcnRzIGluY2x1ZGVkLCB0aGF0J3Mgd2h5IHRoZSBgdHJhbnNwb3J0c2Agb3B0aW9uIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgU29ja2V0V2l0aFVwZ3JhZGUsIFdlYlNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldFdpdGhVcGdyYWRlKHtcbiAqICAgdHJhbnNwb3J0czogW1dlYlNvY2tldF1cbiAqIH0pO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2tldFdpdGhVcGdyYWRlIGV4dGVuZHMgU29ja2V0V2l0aG91dFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl91cGdyYWRlcyA9IFtdO1xuICAgIH1cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiB0aGlzLm9wdHMudXBncmFkZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl91cGdyYWRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2JlKHRoaXMuX3VwZ3JhZGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9iZXMgYSB0cmFuc3BvcnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIHRyYW5zcG9ydCBuYW1lXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcHJvYmUobmFtZSkge1xuICAgICAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5jcmVhdGVUcmFuc3BvcnQobmFtZSk7XG4gICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgU29ja2V0V2l0aG91dFVwZ3JhZGUucHJpb3JXZWJzb2NrZXRTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9uVHJhbnNwb3J0T3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJwaW5nXCIsIGRhdGE6IFwicHJvYmVcIiB9XSk7XG4gICAgICAgICAgICB0cmFuc3BvcnQub25jZShcInBhY2tldFwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChcInBvbmdcIiA9PT0gbXNnLnR5cGUgJiYgXCJwcm9iZVwiID09PSBtc2cuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkaW5nXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBTb2NrZXRXaXRob3V0VXBncmFkZS5wcmlvcldlYnNvY2tldFN1Y2Nlc3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWJzb2NrZXRcIiA9PT0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0LnBhdXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiY2xvc2VkXCIgPT09IHRoaXMucmVhZHlTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LnNlbmQoW3sgdHlwZTogXCJ1cGdyYWRlXCIgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJ1cGdyYWRlXCIsIHRyYW5zcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJwcm9iZSBlcnJvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBlcnIudHJhbnNwb3J0ID0gdHJhbnNwb3J0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwidXBncmFkZUVycm9yXCIsIGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpIHtcbiAgICAgICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gQW55IGNhbGxiYWNrIGNhbGxlZCBieSB0cmFuc3BvcnQgc2hvdWxkIGJlIGlnbm9yZWQgc2luY2Ugbm93XG4gICAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgICAgICAgICB0cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBhbnkgZXJyb3IgdGhhdCBoYXBwZW5zIHdoaWxlIHByb2JpbmdcbiAgICAgICAgY29uc3Qgb25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVycm9yLnRyYW5zcG9ydCA9IHRyYW5zcG9ydC5uYW1lO1xuICAgICAgICAgICAgZnJlZXplVHJhbnNwb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInVwZ3JhZGVFcnJvclwiLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIG9uVHJhbnNwb3J0Q2xvc2UoKSB7XG4gICAgICAgICAgICBvbmVycm9yKFwidHJhbnNwb3J0IGNsb3NlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkIHdoaWxlIHdlJ3JlIHByb2JpbmdcbiAgICAgICAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICAgICAgICAgIG9uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlIHNvY2tldCBpcyB1cGdyYWRlZCB3aGlsZSB3ZSdyZSBwcm9iaW5nXG4gICAgICAgIGZ1bmN0aW9uIG9udXBncmFkZSh0bykge1xuICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAmJiB0by5uYW1lICE9PSB0cmFuc3BvcnQubmFtZSkge1xuICAgICAgICAgICAgICAgIGZyZWV6ZVRyYW5zcG9ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIG9uIHRoZSB0cmFuc3BvcnQgYW5kIG9uIHNlbGZcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcIm9wZW5cIiwgb25UcmFuc3BvcnRPcGVuKTtcbiAgICAgICAgICAgIHRyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIG9uZXJyb3IpO1xuICAgICAgICAgICAgdHJhbnNwb3J0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLm9mZihcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5vZmYoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsIG9uVHJhbnNwb3J0T3Blbik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiZXJyb3JcIiwgb25lcnJvcik7XG4gICAgICAgIHRyYW5zcG9ydC5vbmNlKFwiY2xvc2VcIiwgb25UcmFuc3BvcnRDbG9zZSk7XG4gICAgICAgIHRoaXMub25jZShcImNsb3NlXCIsIG9uY2xvc2UpO1xuICAgICAgICB0aGlzLm9uY2UoXCJ1cGdyYWRpbmdcIiwgb251cGdyYWRlKTtcbiAgICAgICAgaWYgKHRoaXMuX3VwZ3JhZGVzLmluZGV4T2YoXCJ3ZWJ0cmFuc3BvcnRcIikgIT09IC0xICYmXG4gICAgICAgICAgICBuYW1lICE9PSBcIndlYnRyYW5zcG9ydFwiKSB7XG4gICAgICAgICAgICAvLyBmYXZvciBXZWJUcmFuc3BvcnRcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dEZuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSGFuZHNoYWtlKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fdXBncmFkZXMgPSB0aGlzLl9maWx0ZXJVcGdyYWRlcyhkYXRhLnVwZ3JhZGVzKTtcbiAgICAgICAgc3VwZXIub25IYW5kc2hha2UoZGF0YSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdXBncmFkZXMsIHJldHVybmluZyBvbmx5IHRob3NlIG1hdGNoaW5nIGNsaWVudCB0cmFuc3BvcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdXBncmFkZXMgLSBzZXJ2ZXIgdXBncmFkZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maWx0ZXJVcGdyYWRlcyh1cGdyYWRlcykge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZFVwZ3JhZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBncmFkZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh+dGhpcy50cmFuc3BvcnRzLmluZGV4T2YodXBncmFkZXNbaV0pKVxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkVXBncmFkZXM7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgV2ViU29ja2V0LWxpa2UgaW50ZXJmYWNlIHRvIGNvbm5lY3QgdG8gYW4gRW5naW5lLklPIHNlcnZlci4gVGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZFxuICogd2l0aCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBsb3ctbGV2ZWwgdHJhbnNwb3J0cywgbGlrZSBIVFRQIGxvbmctcG9sbGluZywgV2ViU29ja2V0IG9yIFdlYlRyYW5zcG9ydC5cbiAqXG4gKiBUaGlzIGNsYXNzIGNvbWVzIHdpdGggYW4gdXBncmFkZSBtZWNoYW5pc20sIHdoaWNoIG1lYW5zIHRoYXQgb25jZSB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCB3aXRoIHRoZSBmaXJzdFxuICogbG93LWxldmVsIHRyYW5zcG9ydCwgaXQgd2lsbCB0cnkgdG8gdXBncmFkZSB0byBhIGJldHRlciB0cmFuc3BvcnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFNvY2tldCB9IGZyb20gXCJlbmdpbmUuaW8tY2xpZW50XCI7XG4gKlxuICogY29uc3Qgc29ja2V0ID0gbmV3IFNvY2tldCgpO1xuICpcbiAqIHNvY2tldC5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICogICBzb2NrZXQuc2VuZChcImhlbGxvXCIpO1xuICogfSk7XG4gKlxuICogQHNlZSBTb2NrZXRXaXRob3V0VXBncmFkZVxuICogQHNlZSBTb2NrZXRXaXRoVXBncmFkZVxuICovXG5leHBvcnQgY2xhc3MgU29ja2V0IGV4dGVuZHMgU29ja2V0V2l0aFVwZ3JhZGUge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0eXBlb2YgdXJpID09PSBcIm9iamVjdFwiID8gdXJpIDogb3B0cztcbiAgICAgICAgaWYgKCFvLnRyYW5zcG9ydHMgfHxcbiAgICAgICAgICAgIChvLnRyYW5zcG9ydHMgJiYgdHlwZW9mIG8udHJhbnNwb3J0c1swXSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgIG8udHJhbnNwb3J0cyA9IChvLnRyYW5zcG9ydHMgfHwgW1wicG9sbGluZ1wiLCBcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSlcbiAgICAgICAgICAgICAgICAubWFwKCh0cmFuc3BvcnROYW1lKSA9PiBERUZBVUxUX1RSQU5TUE9SVFNbdHJhbnNwb3J0TmFtZV0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigodCkgPT4gISF0KTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmksIG8pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbmV4cG9ydCB7IFNvY2tldCB9O1xuZXhwb3J0IHsgU29ja2V0V2l0aG91dFVwZ3JhZGUsIFNvY2tldFdpdGhVcGdyYWRlLCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuZXhwb3J0IGNvbnN0IHByb3RvY29sID0gU29ja2V0LnByb3RvY29sO1xuZXhwb3J0IHsgVHJhbnNwb3J0LCBUcmFuc3BvcnRFcnJvciB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuZXhwb3J0IHsgdHJhbnNwb3J0cyB9IGZyb20gXCIuL3RyYW5zcG9ydHMvaW5kZXguanNcIjtcbmV4cG9ydCB7IGluc3RhbGxUaW1lckZ1bmN0aW9ucyB9IGZyb20gXCIuL3V0aWwuanNcIjtcbmV4cG9ydCB7IHBhcnNlIH0gZnJvbSBcIi4vY29udHJpYi9wYXJzZXVyaS5qc1wiO1xuZXhwb3J0IHsgbmV4dFRpY2sgfSBmcm9tIFwiLi9nbG9iYWxzLm5vZGUuanNcIjtcbmV4cG9ydCB7IEZldGNoIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLWZldGNoLmpzXCI7XG5leHBvcnQgeyBYSFIgYXMgTm9kZVhIUiB9IGZyb20gXCIuL3RyYW5zcG9ydHMvcG9sbGluZy14aHIubm9kZS5qc1wiO1xuZXhwb3J0IHsgWEhSIH0gZnJvbSBcIi4vdHJhbnNwb3J0cy9wb2xsaW5nLXhoci5qc1wiO1xuZXhwb3J0IHsgV1MgYXMgTm9kZVdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0Lm5vZGUuanNcIjtcbmV4cG9ydCB7IFdTIGFzIFdlYlNvY2tldCB9IGZyb20gXCIuL3RyYW5zcG9ydHMvd2Vic29ja2V0LmpzXCI7XG5leHBvcnQgeyBXVCBhcyBXZWJUcmFuc3BvcnQgfSBmcm9tIFwiLi90cmFuc3BvcnRzL3dlYnRyYW5zcG9ydC5qc1wiO1xuIiwgImltcG9ydCB7IHBhcnNlIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbi8qKlxuICogVVJMIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gdXJpIC0gdXJsXG4gKiBAcGFyYW0gcGF0aCAtIHRoZSByZXF1ZXN0IHBhdGggb2YgdGhlIGNvbm5lY3Rpb25cbiAqIEBwYXJhbSBsb2MgLSBBbiBvYmplY3QgbWVhbnQgdG8gbWltaWMgd2luZG93LmxvY2F0aW9uLlxuICogICAgICAgIERlZmF1bHRzIHRvIHdpbmRvdy5sb2NhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybCh1cmksIHBhdGggPSBcIlwiLCBsb2MpIHtcbiAgICBsZXQgb2JqID0gdXJpO1xuICAgIC8vIGRlZmF1bHQgdG8gd2luZG93LmxvY2F0aW9uXG4gICAgbG9jID0gbG9jIHx8ICh0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgJiYgbG9jYXRpb24pO1xuICAgIGlmIChudWxsID09IHVyaSlcbiAgICAgICAgdXJpID0gbG9jLnByb3RvY29sICsgXCIvL1wiICsgbG9jLmhvc3Q7XG4gICAgLy8gcmVsYXRpdmUgcGF0aCBzdXBwb3J0XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKFwiL1wiID09PSB1cmkuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBpZiAoXCIvXCIgPT09IHVyaS5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MuaG9zdCArIHVyaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIS9eKGh0dHBzP3x3c3M/KTpcXC9cXC8vLnRlc3QodXJpKSkge1xuICAgICAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2MpIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBsb2MucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSBcImh0dHBzOi8vXCIgKyB1cmk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFyc2VcbiAgICAgICAgb2JqID0gcGFyc2UodXJpKTtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIHRyZWF0IGBsb2NhbGhvc3Q6ODBgIGFuZCBgbG9jYWxob3N0YCBlcXVhbGx5XG4gICAgaWYgKCFvYmoucG9ydCkge1xuICAgICAgICBpZiAoL14oaHR0cHx3cykkLy50ZXN0KG9iai5wcm90b2NvbCkpIHtcbiAgICAgICAgICAgIG9iai5wb3J0ID0gXCI4MFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9eKGh0dHB8d3MpcyQvLnRlc3Qob2JqLnByb3RvY29sKSkge1xuICAgICAgICAgICAgb2JqLnBvcnQgPSBcIjQ0M1wiO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9iai5wYXRoID0gb2JqLnBhdGggfHwgXCIvXCI7XG4gICAgY29uc3QgaXB2NiA9IG9iai5ob3N0LmluZGV4T2YoXCI6XCIpICE9PSAtMTtcbiAgICBjb25zdCBob3N0ID0gaXB2NiA/IFwiW1wiICsgb2JqLmhvc3QgKyBcIl1cIiA6IG9iai5ob3N0O1xuICAgIC8vIGRlZmluZSB1bmlxdWUgaWRcbiAgICBvYmouaWQgPSBvYmoucHJvdG9jb2wgKyBcIjovL1wiICsgaG9zdCArIFwiOlwiICsgb2JqLnBvcnQgKyBwYXRoO1xuICAgIC8vIGRlZmluZSBocmVmXG4gICAgb2JqLmhyZWYgPVxuICAgICAgICBvYmoucHJvdG9jb2wgK1xuICAgICAgICAgICAgXCI6Ly9cIiArXG4gICAgICAgICAgICBob3N0ICtcbiAgICAgICAgICAgIChsb2MgJiYgbG9jLnBvcnQgPT09IG9iai5wb3J0ID8gXCJcIiA6IFwiOlwiICsgb2JqLnBvcnQpO1xuICAgIHJldHVybiBvYmo7XG59XG4iLCAiaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc29ja2V0LmlvL2NvbXBvbmVudC1lbWl0dGVyXCI7XG5pbXBvcnQgeyBkZWNvbnN0cnVjdFBhY2tldCwgcmVjb25zdHJ1Y3RQYWNrZXQgfSBmcm9tIFwiLi9iaW5hcnkuanNcIjtcbmltcG9ydCB7IGlzQmluYXJ5LCBoYXNCaW5hcnkgfSBmcm9tIFwiLi9pcy1iaW5hcnkuanNcIjtcbi8qKlxuICogVGhlc2Ugc3RyaW5ncyBtdXN0IG5vdCBiZSB1c2VkIGFzIGV2ZW50IG5hbWVzLCBhcyB0aGV5IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcuXG4gKi9cbmNvbnN0IFJFU0VSVkVEX0VWRU5UUyA9IFtcbiAgICBcImNvbm5lY3RcIixcbiAgICBcImNvbm5lY3RfZXJyb3JcIixcbiAgICBcImRpc2Nvbm5lY3RcIixcbiAgICBcImRpc2Nvbm5lY3RpbmdcIixcbiAgICBcIm5ld0xpc3RlbmVyXCIsXG4gICAgXCJyZW1vdmVMaXN0ZW5lclwiLCAvLyB1c2VkIGJ5IHRoZSBOb2RlLmpzIEV2ZW50RW1pdHRlclxuXTtcbi8qKlxuICogUHJvdG9jb2wgdmVyc2lvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm90b2NvbCA9IDU7XG5leHBvcnQgdmFyIFBhY2tldFR5cGU7XG4oZnVuY3Rpb24gKFBhY2tldFR5cGUpIHtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUXCJdID0gMF0gPSBcIkNPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJESVNDT05ORUNUXCJdID0gMV0gPSBcIkRJU0NPTk5FQ1RcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJFVkVOVFwiXSA9IDJdID0gXCJFVkVOVFwiO1xuICAgIFBhY2tldFR5cGVbUGFja2V0VHlwZVtcIkFDS1wiXSA9IDNdID0gXCJBQ0tcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJDT05ORUNUX0VSUk9SXCJdID0gNF0gPSBcIkNPTk5FQ1RfRVJST1JcIjtcbiAgICBQYWNrZXRUeXBlW1BhY2tldFR5cGVbXCJCSU5BUllfRVZFTlRcIl0gPSA1XSA9IFwiQklOQVJZX0VWRU5UXCI7XG4gICAgUGFja2V0VHlwZVtQYWNrZXRUeXBlW1wiQklOQVJZX0FDS1wiXSA9IDZdID0gXCJCSU5BUllfQUNLXCI7XG59KShQYWNrZXRUeXBlIHx8IChQYWNrZXRUeXBlID0ge30pKTtcbi8qKlxuICogQSBzb2NrZXQuaW8gRW5jb2RlciBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgRW5jb2RlciB7XG4gICAgLyoqXG4gICAgICogRW5jb2RlciBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVwbGFjZXIgLSBjdXN0b20gcmVwbGFjZXIgdG8gcGFzcyBkb3duIHRvIEpTT04ucGFyc2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihyZXBsYWNlcikge1xuICAgICAgICB0aGlzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBhIHBhY2tldCBhcyBhIHNpbmdsZSBzdHJpbmcgaWYgbm9uLWJpbmFyeSwgb3IgYXMgYVxuICAgICAqIGJ1ZmZlciBzZXF1ZW5jZSwgZGVwZW5kaW5nIG9uIHBhY2tldCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIHBhY2tldCBvYmplY3RcbiAgICAgKi9cbiAgICBlbmNvZGUob2JqKSB7XG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5FVkVOVCB8fCBvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5BQ0spIHtcbiAgICAgICAgICAgIGlmIChoYXNCaW5hcnkob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZUFzQmluYXJ5KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogb2JqLnR5cGUgPT09IFBhY2tldFR5cGUuRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gUGFja2V0VHlwZS5CSU5BUllfRVZFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUGFja2V0VHlwZS5CSU5BUllfQUNLLFxuICAgICAgICAgICAgICAgICAgICBuc3A6IG9iai5uc3AsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9iai5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogb2JqLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy5lbmNvZGVBc1N0cmluZyhvYmopXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIHBhY2tldCBhcyBzdHJpbmcuXG4gICAgICovXG4gICAgZW5jb2RlQXNTdHJpbmcob2JqKSB7XG4gICAgICAgIC8vIGZpcnN0IGlzIHR5cGVcbiAgICAgICAgbGV0IHN0ciA9IFwiXCIgKyBvYmoudHlwZTtcbiAgICAgICAgLy8gYXR0YWNobWVudHMgaWYgd2UgaGF2ZSB0aGVtXG4gICAgICAgIGlmIChvYmoudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQgfHxcbiAgICAgICAgICAgIG9iai50eXBlID09PSBQYWNrZXRUeXBlLkJJTkFSWV9BQ0spIHtcbiAgICAgICAgICAgIHN0ciArPSBvYmouYXR0YWNobWVudHMgKyBcIi1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbmFtZXNwYWNlIG90aGVyIHRoYW4gYC9gXG4gICAgICAgIC8vIHdlIGFwcGVuZCBpdCBmb2xsb3dlZCBieSBhIGNvbW1hIGAsYFxuICAgICAgICBpZiAob2JqLm5zcCAmJiBcIi9cIiAhPT0gb2JqLm5zcCkge1xuICAgICAgICAgICAgc3RyICs9IG9iai5uc3AgKyBcIixcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgaWRcbiAgICAgICAgaWYgKG51bGwgIT0gb2JqLmlkKSB7XG4gICAgICAgICAgICBzdHIgKz0gb2JqLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGpzb24gZGF0YVxuICAgICAgICBpZiAobnVsbCAhPSBvYmouZGF0YSkge1xuICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KG9iai5kYXRhLCB0aGlzLnJlcGxhY2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgcGFja2V0IGFzICdidWZmZXIgc2VxdWVuY2UnIGJ5IHJlbW92aW5nIGJsb2JzLCBhbmRcbiAgICAgKiBkZWNvbnN0cnVjdGluZyBwYWNrZXQgaW50byBvYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMgYW5kXG4gICAgICogYSBsaXN0IG9mIGJ1ZmZlcnMuXG4gICAgICovXG4gICAgZW5jb2RlQXNCaW5hcnkob2JqKSB7XG4gICAgICAgIGNvbnN0IGRlY29uc3RydWN0aW9uID0gZGVjb25zdHJ1Y3RQYWNrZXQob2JqKTtcbiAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuZW5jb2RlQXNTdHJpbmcoZGVjb25zdHJ1Y3Rpb24ucGFja2V0KTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7XG4gICAgICAgIGJ1ZmZlcnMudW5zaGlmdChwYWNrKTsgLy8gYWRkIHBhY2tldCBpbmZvIHRvIGJlZ2lubmluZyBvZiBkYXRhIGxpc3RcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcnM7IC8vIHdyaXRlIGFsbCB0aGUgYnVmZmVyc1xuICAgIH1cbn1cbi8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTExMjgxL2NoZWNrLWlmLWEtdmFsdWUtaXMtYW4tb2JqZWN0LWluLWphdmFzY3JpcHRcbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG59XG4vKipcbiAqIEEgc29ja2V0LmlvIERlY29kZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGRlY29kZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29kZXIgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWNvZGVyIGNvbnN0cnVjdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXZpdmVyIC0gY3VzdG9tIHJldml2ZXIgdG8gcGFzcyBkb3duIHRvIEpTT04uc3RyaW5naWZ5XG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmV2aXZlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgcGFja2V0IHN0cmluZyBpbnRvIHBhY2tldCBKU09OLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG9iaiAtIGVuY29kZWQgcGFja2V0XG4gICAgICovXG4gICAgYWRkKG9iaikge1xuICAgICAgICBsZXQgcGFja2V0O1xuICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImdvdCBwbGFpbnRleHQgZGF0YSB3aGVuIHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5kZWNvZGVTdHJpbmcob2JqKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQmluYXJ5RXZlbnQgPSBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfRVZFTlQ7XG4gICAgICAgICAgICBpZiAoaXNCaW5hcnlFdmVudCB8fCBwYWNrZXQudHlwZSA9PT0gUGFja2V0VHlwZS5CSU5BUllfQUNLKSB7XG4gICAgICAgICAgICAgICAgcGFja2V0LnR5cGUgPSBpc0JpbmFyeUV2ZW50ID8gUGFja2V0VHlwZS5FVkVOVCA6IFBhY2tldFR5cGUuQUNLO1xuICAgICAgICAgICAgICAgIC8vIGJpbmFyeSBwYWNrZXQncyBqc29uXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbmV3IEJpbmFyeVJlY29uc3RydWN0b3IocGFja2V0KTtcbiAgICAgICAgICAgICAgICAvLyBubyBhdHRhY2htZW50cywgbGFiZWxlZCBiaW5hcnkgYnV0IG5vIGJpbmFyeSBkYXRhIHRvIGZvbGxvd1xuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuYXR0YWNobWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vbi1iaW5hcnkgZnVsbCBwYWNrZXRcbiAgICAgICAgICAgICAgICBzdXBlci5lbWl0UmVzZXJ2ZWQoXCJkZWNvZGVkXCIsIHBhY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkob2JqKSB8fCBvYmouYmFzZTY0KSB7XG4gICAgICAgICAgICAvLyByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ290IGJpbmFyeSBkYXRhIHdoZW4gbm90IHJlY29uc3RydWN0aW5nIGEgcGFja2V0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG9iaik7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCBmaW5hbCBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdFJlc2VydmVkKFwiZGVjb2RlZFwiLCBwYWNrZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdHlwZTogXCIgKyBvYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBhIHBhY2tldCBTdHJpbmcgKEpTT04gZGF0YSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHBhY2tldFxuICAgICAqL1xuICAgIGRlY29kZVN0cmluZyhzdHIpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvLyBsb29rIHVwIHR5cGVcbiAgICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgICAgIHR5cGU6IE51bWJlcihzdHIuY2hhckF0KDApKSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKFBhY2tldFR5cGVbcC50eXBlXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHBhY2tldCB0eXBlIFwiICsgcC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGF0dGFjaG1lbnRzIGlmIHR5cGUgYmluYXJ5XG4gICAgICAgIGlmIChwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0VWRU5UIHx8XG4gICAgICAgICAgICBwLnR5cGUgPT09IFBhY2tldFR5cGUuQklOQVJZX0FDSykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChzdHIuY2hhckF0KCsraSkgIT09IFwiLVwiICYmIGkgIT0gc3RyLmxlbmd0aCkgeyB9XG4gICAgICAgICAgICBjb25zdCBidWYgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChidWYgIT0gTnVtYmVyKGJ1ZikgfHwgc3RyLmNoYXJBdChpKSAhPT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGF0dGFjaG1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5hdHRhY2htZW50cyA9IE51bWJlcihidWYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb2sgdXAgbmFtZXNwYWNlIChpZiBhbnkpXG4gICAgICAgIGlmIChcIi9cIiA9PT0gc3RyLmNoYXJBdChpICsgMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKFwiLFwiID09PSBjKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLm5zcCA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcC5uc3AgPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29rIHVwIGlkXG4gICAgICAgIGNvbnN0IG5leHQgPSBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKFwiXCIgIT09IG5leHQgJiYgTnVtYmVyKG5leHQpID09IG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYyB8fCBOdW1iZXIoYykgIT0gYykge1xuICAgICAgICAgICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3RyLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLmlkID0gTnVtYmVyKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9vayB1cCBqc29uIGRhdGFcbiAgICAgICAgaWYgKHN0ci5jaGFyQXQoKytpKSkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudHJ5UGFyc2Uoc3RyLnN1YnN0cihpKSk7XG4gICAgICAgICAgICBpZiAoRGVjb2Rlci5pc1BheWxvYWRWYWxpZChwLnR5cGUsIHBheWxvYWQpKSB7XG4gICAgICAgICAgICAgICAgcC5kYXRhID0gcGF5bG9hZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF5bG9hZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgdHJ5UGFyc2Uoc3RyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIsIHRoaXMucmV2aXZlcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgaXNQYXlsb2FkVmFsaWQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBpc09iamVjdChwYXlsb2FkKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgfHwgaXNPYmplY3QocGF5bG9hZCk7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHBheWxvYWRbMF0gPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgcGF5bG9hZFswXSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0VWRU5UUy5pbmRleE9mKHBheWxvYWRbMF0pID09PSAtMSkpKTtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5BQ0s6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0FDSzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWFsbG9jYXRlcyBhIHBhcnNlcidzIHJlc291cmNlc1xuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLnJlY29uc3RydWN0b3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIG1hbmFnZXIgb2YgYSBiaW5hcnkgZXZlbnQncyAnYnVmZmVyIHNlcXVlbmNlJy4gU2hvdWxkXG4gKiBiZSBjb25zdHJ1Y3RlZCB3aGVuZXZlciBhIHBhY2tldCBvZiB0eXBlIEJJTkFSWV9FVkVOVCBpc1xuICogZGVjb2RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0XG4gKiBAcmV0dXJuIHtCaW5hcnlSZWNvbnN0cnVjdG9yfSBpbml0aWFsaXplZCByZWNvbnN0cnVjdG9yXG4gKi9cbmNsYXNzIEJpbmFyeVJlY29uc3RydWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhY2tldCkge1xuICAgICAgICB0aGlzLnBhY2tldCA9IHBhY2tldDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gcGFja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gYmluYXJ5IGRhdGEgcmVjZWl2ZWQgZnJvbSBjb25uZWN0aW9uXG4gICAgICogYWZ0ZXIgYSBCSU5BUllfRVZFTlQgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheUJ1ZmZlcn0gYmluRGF0YSAtIHRoZSByYXcgYmluYXJ5IGRhdGEgcmVjZWl2ZWRcbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgT2JqZWN0fSByZXR1cm5zIG51bGwgaWYgbW9yZSBiaW5hcnkgZGF0YSBpcyBleHBlY3RlZCBvclxuICAgICAqICAgYSByZWNvbnN0cnVjdGVkIHBhY2tldCBvYmplY3QgaWYgYWxsIGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHRha2VCaW5hcnlEYXRhKGJpbkRhdGEpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goYmluRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcnMubGVuZ3RoID09PSB0aGlzLnJlY29uUGFjay5hdHRhY2htZW50cykge1xuICAgICAgICAgICAgLy8gZG9uZSB3aXRoIGJ1ZmZlciBsaXN0XG4gICAgICAgICAgICBjb25zdCBwYWNrZXQgPSByZWNvbnN0cnVjdFBhY2tldCh0aGlzLnJlY29uUGFjaywgdGhpcy5idWZmZXJzKTtcbiAgICAgICAgICAgIHRoaXMuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHBhY2tldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYW5zIHVwIGJpbmFyeSBwYWNrZXQgcmVjb25zdHJ1Y3Rpb24gdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVjb25QYWNrID0gbnVsbDtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgfVxufVxuIiwgImNvbnN0IHdpdGhOYXRpdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiO1xuY29uc3QgaXNWaWV3ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKVxuICAgICAgICA6IG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn07XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCB3aXRoTmF0aXZlQmxvYiA9IHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEJsb2IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChCbG9iKSA9PT0gXCJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl1cIik7XG5jb25zdCB3aXRoTmF0aXZlRmlsZSA9IHR5cGVvZiBGaWxlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdG9TdHJpbmcuY2FsbChGaWxlKSA9PT0gXCJbb2JqZWN0IEZpbGVDb25zdHJ1Y3Rvcl1cIik7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBvYmogaXMgYSBCdWZmZXIsIGFuIEFycmF5QnVmZmVyLCBhIEJsb2Igb3IgYSBGaWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeShvYmopIHtcbiAgICByZXR1cm4gKCh3aXRoTmF0aXZlQXJyYXlCdWZmZXIgJiYgKG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IGlzVmlldyhvYmopKSkgfHxcbiAgICAgICAgKHdpdGhOYXRpdmVCbG9iICYmIG9iaiBpbnN0YW5jZW9mIEJsb2IpIHx8XG4gICAgICAgICh3aXRoTmF0aXZlRmlsZSAmJiBvYmogaW5zdGFuY2VvZiBGaWxlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGFzQmluYXJ5KG9iaiwgdG9KU09OKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmluYXJ5KG9ialtpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc0JpbmFyeShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAob2JqLnRvSlNPTiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLnRvSlNPTiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmFyeShvYmoudG9KU09OKCksIHRydWUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgJiYgaGFzQmluYXJ5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwgImltcG9ydCB7IGlzQmluYXJ5IH0gZnJvbSBcIi4vaXMtYmluYXJ5LmpzXCI7XG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IEJ1ZmZlciB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgaW4gcGFja2V0IHdpdGggYSBudW1iZXJlZCBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gc29ja2V0LmlvIGV2ZW50IHBhY2tldFxuICogQHJldHVybiB7T2JqZWN0fSB3aXRoIGRlY29uc3RydWN0ZWQgcGFja2V0IGFuZCBsaXN0IG9mIGJ1ZmZlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29uc3RydWN0UGFja2V0KHBhY2tldCkge1xuICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICBjb25zdCBwYWNrZXREYXRhID0gcGFja2V0LmRhdGE7XG4gICAgY29uc3QgcGFjayA9IHBhY2tldDtcbiAgICBwYWNrLmRhdGEgPSBfZGVjb25zdHJ1Y3RQYWNrZXQocGFja2V0RGF0YSwgYnVmZmVycyk7XG4gICAgcGFjay5hdHRhY2htZW50cyA9IGJ1ZmZlcnMubGVuZ3RoOyAvLyBudW1iZXIgb2YgYmluYXJ5ICdhdHRhY2htZW50cydcbiAgICByZXR1cm4geyBwYWNrZXQ6IHBhY2ssIGJ1ZmZlcnM6IGJ1ZmZlcnMgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvbnN0cnVjdFBhY2tldChkYXRhLCBidWZmZXJzKSB7XG4gICAgaWYgKCFkYXRhKVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICBpZiAoaXNCaW5hcnkoZGF0YSkpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB7IF9wbGFjZWhvbGRlcjogdHJ1ZSwgbnVtOiBidWZmZXJzLmxlbmd0aCB9O1xuICAgICAgICBidWZmZXJzLnB1c2goZGF0YSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXdEYXRhW2ldID0gX2RlY29uc3RydWN0UGFja2V0KGRhdGFbaV0sIGJ1ZmZlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAhKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSkge1xuICAgICAgICAgICAgICAgIG5ld0RhdGFba2V5XSA9IF9kZWNvbnN0cnVjdFBhY2tldChkYXRhW2tleV0sIGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdEYXRhO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cbi8qKlxuICogUmVjb25zdHJ1Y3RzIGEgYmluYXJ5IHBhY2tldCBmcm9tIGl0cyBwbGFjZWhvbGRlciBwYWNrZXQgYW5kIGJ1ZmZlcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFja2V0IC0gZXZlbnQgcGFja2V0IHdpdGggcGxhY2Vob2xkZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBidWZmZXJzIC0gYmluYXJ5IGJ1ZmZlcnMgdG8gcHV0IGluIHBsYWNlaG9sZGVyIHBvc2l0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fSByZWNvbnN0cnVjdGVkIHBhY2tldFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LCBidWZmZXJzKSB7XG4gICAgcGFja2V0LmRhdGEgPSBfcmVjb25zdHJ1Y3RQYWNrZXQocGFja2V0LmRhdGEsIGJ1ZmZlcnMpO1xuICAgIGRlbGV0ZSBwYWNrZXQuYXR0YWNobWVudHM7IC8vIG5vIGxvbmdlciB1c2VmdWxcbiAgICByZXR1cm4gcGFja2V0O1xufVxuZnVuY3Rpb24gX3JlY29uc3RydWN0UGFja2V0KGRhdGEsIGJ1ZmZlcnMpIHtcbiAgICBpZiAoIWRhdGEpXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuX3BsYWNlaG9sZGVyID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXhWYWxpZCA9IHR5cGVvZiBkYXRhLm51bSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPj0gMCAmJlxuICAgICAgICAgICAgZGF0YS5udW0gPCBidWZmZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzSW5kZXhWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbZGF0YS5udW1dOyAvLyBhcHByb3ByaWF0ZSBidWZmZXIgKHNob3VsZCBiZSBuYXR1cmFsIG9yZGVyIGFueXdheSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgYXR0YWNobWVudHNcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSwgYnVmZmVycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtrZXldID0gX3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSwgYnVmZmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG9uKG9iaiwgZXYsIGZuKSB7XG4gICAgb2JqLm9uKGV2LCBmbik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHN1YkRlc3Ryb3koKSB7XG4gICAgICAgIG9iai5vZmYoZXYsIGZuKTtcbiAgICB9O1xufVxuIiwgImltcG9ydCB7IFBhY2tldFR5cGUgfSBmcm9tIFwic29ja2V0LmlvLXBhcnNlclwiO1xuaW1wb3J0IHsgb24gfSBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHsgRW1pdHRlciwgfSBmcm9tIFwiQHNvY2tldC5pby9jb21wb25lbnQtZW1pdHRlclwiO1xuLyoqXG4gKiBJbnRlcm5hbCBldmVudHMuXG4gKiBUaGVzZSBldmVudHMgY2FuJ3QgYmUgZW1pdHRlZCBieSB0aGUgdXNlci5cbiAqL1xuY29uc3QgUkVTRVJWRURfRVZFTlRTID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY29ubmVjdDogMSxcbiAgICBjb25uZWN0X2Vycm9yOiAxLFxuICAgIGRpc2Nvbm5lY3Q6IDEsXG4gICAgZGlzY29ubmVjdGluZzogMSxcbiAgICAvLyBFdmVudEVtaXR0ZXIgcmVzZXJ2ZWQgZXZlbnRzOiBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19ldmVudF9uZXdsaXN0ZW5lclxuICAgIG5ld0xpc3RlbmVyOiAxLFxuICAgIHJlbW92ZUxpc3RlbmVyOiAxLFxufSk7XG4vKipcbiAqIEEgU29ja2V0IGlzIHRoZSBmdW5kYW1lbnRhbCBjbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2VydmVyLlxuICpcbiAqIEEgU29ja2V0IGJlbG9uZ3MgdG8gYSBjZXJ0YWluIE5hbWVzcGFjZSAoYnkgZGVmYXVsdCAvKSBhbmQgdXNlcyBhbiB1bmRlcmx5aW5nIHtAbGluayBNYW5hZ2VyfSB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAqXG4gKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJjb25uZWN0ZWRcIik7XG4gKiB9KTtcbiAqXG4gKiAvLyBzZW5kIGFuIGV2ZW50IHRvIHRoZSBzZXJ2ZXJcbiAqIHNvY2tldC5lbWl0KFwiZm9vXCIsIFwiYmFyXCIpO1xuICpcbiAqIHNvY2tldC5vbihcImZvb2JhclwiLCAoKSA9PiB7XG4gKiAgIC8vIGFuIGV2ZW50IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqIH0pO1xuICpcbiAqIC8vIHVwb24gZGlzY29ubmVjdGlvblxuICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBkaXNjb25uZWN0ZWQgZHVlIHRvICR7cmVhc29ufWApO1xuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTb2NrZXQgZXh0ZW5kcyBFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBgU29ja2V0YCBjb25zdHJ1Y3Rvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpbywgbnNwLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAgICAgKlxuICAgICAgICAgKiBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuY29ubmVjdGVkKTsgLy8gdHJ1ZVxuICAgICAgICAgKiB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmNvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gc3RhdGUgd2FzIHJlY292ZXJlZCBhZnRlciBhIHRlbXBvcmFyeSBkaXNjb25uZWN0aW9uLiBJbiB0aGF0IGNhc2UsIGFueSBtaXNzZWQgcGFja2V0cyB3aWxsXG4gICAgICAgICAqIGJlIHRyYW5zbWl0dGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHJlY2VpdmVkIGJlZm9yZSB0aGUgQ09OTkVDVCBwYWNrZXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVmZmVyIGZvciBwYWNrZXRzIHRoYXQgd2lsbCBiZSBzZW50IG9uY2UgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VuZEJ1ZmZlciA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHF1ZXVlIG9mIHBhY2tldHMgdG8gYmUgc2VudCB3aXRoIHJldHJ5IGluIGNhc2Ugb2YgZmFpbHVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogUGFja2V0cyBhcmUgc2VudCBvbmUgYnkgb25lLCBlYWNoIHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VtZW50LCBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhlIGRlbGl2ZXJ5IG9yZGVyLlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcXVldWUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgc2VxdWVuY2UgdG8gZ2VuZXJhdGUgdGhlIElEIG9mIHRoZSB7QGxpbmsgUXVldWVkUGFja2V0fS5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3F1ZXVlU2VxID0gMDtcbiAgICAgICAgdGhpcy5pZHMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBtYXAgY29udGFpbmluZyBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgd2l0aEVycm9yYCBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGhhbmRsZXJzIHRoYXQgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50OlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGBzb2NrZXQuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYCB3aXRoIGBhY2tUaW1lb3V0YCBvcHRpb25cbiAgICAgICAgICogLSBgc29ja2V0LnRpbWVvdXQoNTAwMCkuZW1pdChcInRlc3RcIiwgKGVyciwgdmFsdWUpID0+IHsgLi4uIH0pYFxuICAgICAgICAgKiAtIGBjb25zdCB2YWx1ZSA9IGF3YWl0IHNvY2tldC5lbWl0V2l0aEFjayhcInRlc3RcIilgXG4gICAgICAgICAqXG4gICAgICAgICAqIEZyb20gdGhvc2UgdGhhdCBkb24ndDpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgc29ja2V0LmVtaXQoXCJ0ZXN0XCIsICh2YWx1ZSkgPT4geyAuLi4gfSk7YFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4gZXJyb3Igd2hlbjpcbiAgICAgICAgICpcbiAgICAgICAgICogLSB0aGUgdGltZW91dCBpcyByZWFjaGVkXG4gICAgICAgICAqIC0gdGhlIHNvY2tldCBnZXRzIGRpc2Nvbm5lY3RlZFxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBoYW5kbGVycyB3aWxsIGJlIHNpbXBseSBkaXNjYXJkZWQgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZVxuICAgICAgICAgKiBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hY2tzID0ge307XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5pbyA9IGlvO1xuICAgICAgICB0aGlzLm5zcCA9IG5zcDtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5hdXRoKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSBvcHRzLmF1dGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMpO1xuICAgICAgICBpZiAodGhpcy5pby5fYXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgc29ja2V0IGlzIGN1cnJlbnRseSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc29ja2V0ID0gaW8oKTtcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coc29ja2V0LmRpc2Nvbm5lY3RlZCk7IC8vIGZhbHNlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHNvY2tldC5kaXNjb25uZWN0ZWQpOyAvLyB0cnVlXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZ2V0IGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIG9wZW4sIGNsb3NlIGFuZCBwYWNrZXQgZXZlbnRzXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YkV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VicylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaW8gPSB0aGlzLmlvO1xuICAgICAgICB0aGlzLnN1YnMgPSBbXG4gICAgICAgICAgICBvbihpbywgXCJvcGVuXCIsIHRoaXMub25vcGVuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgb24oaW8sIFwicGFja2V0XCIsIHRoaXMub25wYWNrZXQuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJlcnJvclwiLCB0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBvbihpbywgXCJjbG9zZVwiLCB0aGlzLm9uY2xvc2UuYmluZCh0aGlzKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIFNvY2tldCB3aWxsIHRyeSB0byByZWNvbm5lY3Qgd2hlbiBpdHMgTWFuYWdlciBjb25uZWN0cyBvciByZWNvbm5lY3RzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coc29ja2V0LmFjdGl2ZSk7IC8vIHRydWVcbiAgICAgKlxuICAgICAqIHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKHJlYXNvbikgPT4ge1xuICAgICAqICAgaWYgKHJlYXNvbiA9PT0gXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKSB7XG4gICAgICogICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uIHdhcyBpbml0aWF0ZWQgYnkgdGhlIHNlcnZlciwgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVjb25uZWN0XG4gICAgICogICAgIGNvbnNvbGUubG9nKHNvY2tldC5hY3RpdmUpOyAvLyBmYWxzZVxuICAgICAqICAgfVxuICAgICAqICAgLy8gZWxzZSB0aGUgc29ja2V0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcmVjb25uZWN0XG4gICAgICogICBjb25zb2xlLmxvZyhzb2NrZXQuYWN0aXZlKTsgLy8gdHJ1ZVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldCBhY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VicztcbiAgICB9XG4gICAgLyoqXG4gICAgICogXCJPcGVuc1wiIHRoZSBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvY2tldCA9IGlvKHtcbiAgICAgKiAgIGF1dG9Db25uZWN0OiBmYWxzZVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc29ja2V0LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5zdWJFdmVudHMoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlvW1wiX3JlY29ubmVjdGluZ1wiXSlcbiAgICAgICAgICAgIHRoaXMuaW8ub3BlbigpOyAvLyBlbnN1cmUgb3BlblxuICAgICAgICBpZiAoXCJvcGVuXCIgPT09IHRoaXMuaW8uX3JlYWR5U3RhdGUpXG4gICAgICAgICAgICB0aGlzLm9ub3BlbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBjb25uZWN0KCl9LlxuICAgICAqL1xuICAgIG9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBgbWVzc2FnZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtaW1pY3MgdGhlIFdlYlNvY2tldC5zZW5kKCkgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViU29ja2V0L3NlbmRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnNlbmQoXCJoZWxsb1wiKTtcbiAgICAgKlxuICAgICAqIC8vIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAqIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIGBlbWl0YC5cbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgaW4gYGV2ZW50c2AsIGl0J3MgZW1pdHRlZCBub3JtYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gYWxsIHNlcmlhbGl6YWJsZSBkYXRhc3RydWN0dXJlcyBhcmUgc3VwcG9ydGVkIChubyBuZWVkIHRvIGNhbGwgSlNPTi5zdHJpbmdpZnkpXG4gICAgICogc29ja2V0LmVtaXQoXCJoZWxsb1wiLCAxLCBcIjJcIiwgeyAzOiBbXCI0XCJdLCA1OiBVaW50OEFycmF5LmZyb20oWzZdKSB9KTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGggYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlclxuICAgICAqIHNvY2tldC5lbWl0KFwiaGVsbG9cIiwgXCJ3b3JsZFwiLCAodmFsKSA9PiB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgIGlmIChSRVNFUlZFRF9FVkVOVFMuaGFzT3duUHJvcGVydHkoZXYpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGV2LnRvU3RyaW5nKCkgKyAnXCIgaXMgYSByZXNlcnZlZCBldmVudCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy51bnNoaWZ0KGV2KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdHMucmV0cmllcyAmJiAhdGhpcy5mbGFncy5mcm9tUXVldWUgJiYgIXRoaXMuZmxhZ3Mudm9sYXRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUXVldWUoYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkVWRU5ULFxuICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgfTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMgPSB7fTtcbiAgICAgICAgcGFja2V0Lm9wdGlvbnMuY29tcHJlc3MgPSB0aGlzLmZsYWdzLmNvbXByZXNzICE9PSBmYWxzZTtcbiAgICAgICAgLy8gZXZlbnQgYWNrIGNhbGxiYWNrXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZHMrKztcbiAgICAgICAgICAgIGNvbnN0IGFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFja0NhbGxiYWNrKGlkLCBhY2spO1xuICAgICAgICAgICAgcGFja2V0LmlkID0gaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNUcmFuc3BvcnRXcml0YWJsZSA9IChfYiA9IChfYSA9IHRoaXMuaW8uZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHJhbnNwb3J0KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iud3JpdGFibGU7XG4gICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdGhpcy5jb25uZWN0ZWQgJiYgISgoX2MgPSB0aGlzLmlvLmVuZ2luZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLl9oYXNQaW5nRXhwaXJlZCgpKTtcbiAgICAgICAgY29uc3QgZGlzY2FyZFBhY2tldCA9IHRoaXMuZmxhZ3Mudm9sYXRpbGUgJiYgIWlzVHJhbnNwb3J0V3JpdGFibGU7XG4gICAgICAgIGlmIChkaXNjYXJkUGFja2V0KSB7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KTtcbiAgICAgICAgICAgIHRoaXMucGFja2V0KHBhY2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRCdWZmZXIucHVzaChwYWNrZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlZ2lzdGVyQWNrQ2FsbGJhY2soaWQsIGFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSAoX2EgPSB0aGlzLmZsYWdzLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuX29wdHMuYWNrVGltZW91dDtcbiAgICAgICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hY2tzW2lkXSA9IGFjaztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5pby5zZXRUaW1lb3V0Rm4oKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWNrc1tpZF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VuZEJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbmRCdWZmZXJbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEJ1ZmZlci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNrLmNhbGwodGhpcywgbmV3IEVycm9yKFwib3BlcmF0aW9uIGhhcyB0aW1lZCBvdXRcIikpO1xuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5pby5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICBhY2suYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGZuLndpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuYWNrc1tpZF0gPSBmbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgYW5kIHdhaXRzIGZvciBhbiBhY2tub3dsZWRnZW1lbnRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gd2l0aG91dCB0aW1lb3V0XG4gICAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQuZW1pdFdpdGhBY2soXCJoZWxsb1wiLCBcIndvcmxkXCIpO1xuICAgICAqXG4gICAgICogLy8gd2l0aCBhIHNwZWNpZmljIHRpbWVvdXRcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzb2NrZXQudGltZW91dCgxMDAwKS5lbWl0V2l0aEFjayhcImhlbGxvXCIsIFwid29ybGRcIik7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2hlbiB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgZXZlbnRcbiAgICAgKi9cbiAgICBlbWl0V2l0aEFjayhldiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcmcxID8gcmVqZWN0KGFyZzEpIDogcmVzb2x2ZShhcmcyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmbi53aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgYXJncy5wdXNoKGZuKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChldiwgLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgdGhlIHBhY2tldCB0byB0aGUgcXVldWUuXG4gICAgICogQHBhcmFtIGFyZ3NcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUb1F1ZXVlKGFyZ3MpIHtcbiAgICAgICAgbGV0IGFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYWNrID0gYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fcXVldWVTZXErKyxcbiAgICAgICAgICAgIHRyeUNvdW50OiAwLFxuICAgICAgICAgICAgcGVuZGluZzogZmFsc2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZmxhZ3M6IE9iamVjdC5hc3NpZ24oeyBmcm9tUXVldWU6IHRydWUgfSwgdGhpcy5mbGFncyksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCAuLi5yZXNwb25zZUFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmIChwYWNrZXQgIT09IHRoaXMuX3F1ZXVlWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHBhY2tldCBoYXMgYWxyZWFkeSBiZWVuIGFja25vd2xlZGdlZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gZXJyICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhY2tldC50cnlDb3VudCA+IHRoaXMuX29wdHMucmV0cmllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGFjaykge1xuICAgICAgICAgICAgICAgICAgICBhY2sobnVsbCwgLi4ucmVzcG9uc2VBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrZXQucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWluUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFja2V0KTtcbiAgICAgICAgdGhpcy5fZHJhaW5RdWV1ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlLCBhbmQgd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIHNlcnZlci5cbiAgICAgKiBAcGFyYW0gZm9yY2UgLSB3aGV0aGVyIHRvIHJlc2VuZCBhIHBhY2tldCB0aGF0IGhhcyBub3QgYmVlbiBhY2tub3dsZWRnZWQgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9kcmFpblF1ZXVlKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrZXQgPSB0aGlzLl9xdWV1ZVswXTtcbiAgICAgICAgaWYgKHBhY2tldC5wZW5kaW5nICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhY2tldC5wZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgcGFja2V0LnRyeUNvdW50Kys7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBwYWNrZXQuZmxhZ3M7XG4gICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBwYWNrZXQuYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcGFja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcGFja2V0KHBhY2tldCkge1xuICAgICAgICBwYWNrZXQubnNwID0gdGhpcy5uc3A7XG4gICAgICAgIHRoaXMuaW8uX3BhY2tldChwYWNrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYG9wZW5gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbm9wZW4oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdXRoID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5hdXRoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbm5lY3RQYWNrZXQoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb25uZWN0UGFja2V0KHRoaXMuYXV0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBDT05ORUNUIHBhY2tldCB0byBpbml0aWF0ZSB0aGUgU29ja2V0LklPIHNlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3NlbmRDb25uZWN0UGFja2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5wYWNrZXQoe1xuICAgICAgICAgICAgdHlwZTogUGFja2V0VHlwZS5DT05ORUNULFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fcGlkXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHsgcGlkOiB0aGlzLl9waWQsIG9mZnNldDogdGhpcy5fbGFzdE9mZnNldCB9LCBkYXRhKVxuICAgICAgICAgICAgICAgIDogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGVuZ2luZSBvciBtYW5hZ2VyIGBlcnJvcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmVycm9yKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBlbmdpbmUgYGNsb3NlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFzb25cbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uY2xvc2UocmVhc29uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5pZDtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJkaXNjb25uZWN0XCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLl9jbGVhckFja3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBhY2tub3dsZWRnZW1lbnQgaGFuZGxlcnMgdXBvbiBkaXNjb25uZWN0aW9uLCBzaW5jZSB0aGUgY2xpZW50IHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbVxuICAgICAqIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9jbGVhckFja3MoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYWNrcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQnVmZmVyZWQgPSB0aGlzLnNlbmRCdWZmZXIuc29tZSgocGFja2V0KSA9PiBTdHJpbmcocGFja2V0LmlkKSA9PT0gaWQpO1xuICAgICAgICAgICAgaWYgKCFpc0J1ZmZlcmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90ZTogaGFuZGxlcnMgdGhhdCBkbyBub3QgYWNjZXB0IGFuIGVycm9yIGFzIGZpcnN0IGFyZ3VtZW50IGFyZSBpZ25vcmVkIGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBhY2sgPSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChhY2sud2l0aEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjay5jYWxsKHRoaXMsIG5ldyBFcnJvcihcInNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aXRoIHNvY2tldCBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbnBhY2tldChwYWNrZXQpIHtcbiAgICAgICAgY29uc3Qgc2FtZU5hbWVzcGFjZSA9IHBhY2tldC5uc3AgPT09IHRoaXMubnNwO1xuICAgICAgICBpZiAoIXNhbWVOYW1lc3BhY2UpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN3aXRjaCAocGFja2V0LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5DT05ORUNUOlxuICAgICAgICAgICAgICAgIGlmIChwYWNrZXQuZGF0YSAmJiBwYWNrZXQuZGF0YS5zaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNvbm5lY3QocGFja2V0LmRhdGEuc2lkLCBwYWNrZXQuZGF0YS5waWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0X2Vycm9yXCIsIG5ldyBFcnJvcihcIkl0IHNlZW1zIHlvdSBhcmUgdHJ5aW5nIHRvIHJlYWNoIGEgU29ja2V0LklPIHNlcnZlciBpbiB2Mi54IHdpdGggYSB2My54IGNsaWVudCwgYnV0IHRoZXkgYXJlIG5vdCBjb21wYXRpYmxlIChtb3JlIGluZm9ybWF0aW9uIGhlcmU6IGh0dHBzOi8vc29ja2V0LmlvL2RvY3MvdjMvbWlncmF0aW5nLWZyb20tMi14LXRvLTMtMC8pXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuRVZFTlQ6XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQklOQVJZX0VWRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMub25ldmVudChwYWNrZXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQYWNrZXRUeXBlLkFDSzpcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5CSU5BUllfQUNLOlxuICAgICAgICAgICAgICAgIHRoaXMub25hY2socGFja2V0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGFja2V0VHlwZS5ESVNDT05ORUNUOlxuICAgICAgICAgICAgICAgIHRoaXMub25kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBhY2tldFR5cGUuQ09OTkVDVF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IocGFja2V0LmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGVyci5kYXRhID0gcGFja2V0LmRhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZXZlbnQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBwYWNrZXQuZGF0YSB8fCBbXTtcbiAgICAgICAgaWYgKG51bGwgIT0gcGFja2V0LmlkKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5hY2socGFja2V0LmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXRFdmVudChhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKE9iamVjdC5mcmVlemUoYXJncykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXRFdmVudChhcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlMaXN0ZW5lcnMgJiYgdGhpcy5fYW55TGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLmVtaXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIGlmICh0aGlzLl9waWQgJiYgYXJncy5sZW5ndGggJiYgdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5fbGFzdE9mZnNldCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhbiBhY2sgY2FsbGJhY2sgdG8gZW1pdCB3aXRoIGFuIGV2ZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhY2soaWQpIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBzZW50ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3VibGUgY2FsbGJhY2tzXG4gICAgICAgICAgICBpZiAoc2VudClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBzZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNlbGYucGFja2V0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBQYWNrZXRUeXBlLkFDSyxcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHNlcnZlciBhY2tub3dsZWRnZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFja2V0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmFjayhwYWNrZXQpIHtcbiAgICAgICAgY29uc3QgYWNrID0gdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIGlmICh0eXBlb2YgYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF07XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUUgYWNrIGlzIGluY29ycmVjdGx5IGluZmVycmVkIGFzICduZXZlcidcbiAgICAgICAgaWYgKGFjay53aXRoRXJyb3IpIHtcbiAgICAgICAgICAgIHBhY2tldC5kYXRhLnVuc2hpZnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhY2suYXBwbHkodGhpcywgcGFja2V0LmRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBzZXJ2ZXIgY29ubmVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jb25uZWN0KGlkLCBwaWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnJlY292ZXJlZCA9IHBpZCAmJiB0aGlzLl9waWQgPT09IHBpZDtcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkOyAvLyBkZWZpbmVkIG9ubHkgaWYgY29ubmVjdGlvbiBzdGF0ZSByZWNvdmVyeSBpcyBlbmFibGVkXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0QnVmZmVyZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJjb25uZWN0XCIpO1xuICAgICAgICB0aGlzLl9kcmFpblF1ZXVlKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGJ1ZmZlcmVkIGV2ZW50cyAocmVjZWl2ZWQgYW5kIGVtaXR0ZWQpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlbWl0QnVmZmVyZWQoKSB7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5mb3JFYWNoKChhcmdzKSA9PiB0aGlzLmVtaXRFdmVudChhcmdzKSk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaCgocGFja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeU91dGdvaW5nTGlzdGVuZXJzKHBhY2tldCk7XG4gICAgICAgICAgICB0aGlzLnBhY2tldChwYWNrZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNlcnZlciBkaXNjb25uZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gZm9yY2VkIGNsaWVudC9zZXJ2ZXIgc2lkZSBkaXNjb25uZWN0aW9ucyxcbiAgICAgKiB0aGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBtYW5hZ2VyIHN0b3BzIHRyYWNraW5nIHVzIGFuZFxuICAgICAqIHRoYXQgcmVjb25uZWN0aW9ucyBkb24ndCBnZXQgdHJpZ2dlcmVkIGZvciB0aGlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zdWJzKSB7XG4gICAgICAgICAgICAvLyBjbGVhbiBzdWJzY3JpcHRpb25zIHRvIGF2b2lkIHJlY29ubmVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWJEZXN0cm95KSA9PiBzdWJEZXN0cm95KCkpO1xuICAgICAgICAgICAgdGhpcy5zdWJzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW9bXCJfZGVzdHJveVwiXSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdHMgdGhlIHNvY2tldCBtYW51YWxseS4gSW4gdGhhdCBjYXNlLCB0aGUgc29ja2V0IHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGFjdGl2ZSBTb2NrZXQgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBNYW5hZ2VyfSwgdGhlIGxvdy1sZXZlbCBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb2NrZXQgPSBpbygpO1xuICAgICAqXG4gICAgICogc29ja2V0Lm9uKFwiZGlzY29ubmVjdFwiLCAocmVhc29uKSA9PiB7XG4gICAgICogICAvLyBjb25zb2xlLmxvZyhyZWFzb24pOyBwcmludHMgXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzb2NrZXQuZGlzY29ubmVjdCgpO1xuICAgICAqXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tldCh7IHR5cGU6IFBhY2tldFR5cGUuRElTQ09OTkVDVCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgc29ja2V0IGZyb20gcG9vbFxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAvLyBmaXJlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwiaW8gY2xpZW50IGRpc2Nvbm5lY3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgZGlzY29ubmVjdCgpfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXByZXNzIGZsYWcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5jb21wcmVzcyhmYWxzZSkuZW1pdChcImhlbGxvXCIpO1xuICAgICAqXG4gICAgICogQHBhcmFtIGNvbXByZXNzIC0gaWYgYHRydWVgLCBjb21wcmVzc2VzIHRoZSBzZW5kaW5nIGRhdGFcbiAgICAgKiBAcmV0dXJuIHNlbGZcbiAgICAgKi9cbiAgICBjb21wcmVzcyhjb21wcmVzcykge1xuICAgICAgICB0aGlzLmZsYWdzLmNvbXByZXNzID0gY29tcHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBldmVudCBtZXNzYWdlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoaXMgc29ja2V0IGlzIG5vdFxuICAgICAqIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC52b2xhdGlsZS5lbWl0KFwiaGVsbG9cIik7IC8vIHRoZSBzZXJ2ZXIgbWF5IG9yIG1heSBub3QgcmVjZWl2ZSBpdFxuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIGdldCB2b2xhdGlsZSgpIHtcbiAgICAgICAgdGhpcy5mbGFncy52b2xhdGlsZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgbW9kaWZpZXIgZm9yIGEgc3Vic2VxdWVudCBldmVudCBlbWlzc2lvbiB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgICogZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgd2l0aG91dCBhbiBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgc2VydmVyOlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQudGltZW91dCg1MDAwKS5lbWl0KFwibXktZXZlbnRcIiwgKGVycikgPT4ge1xuICAgICAqICAgaWYgKGVycikge1xuICAgICAqICAgICAvLyB0aGUgc2VydmVyIGRpZCBub3QgYWNrbm93bGVkZ2UgdGhlIGV2ZW50IGluIHRoZSBnaXZlbiBkZWxheVxuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHJldHVybnMgc2VsZlxuICAgICAqL1xuICAgIHRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLmZsYWdzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzb2NrZXQub25BbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBvbkFueShsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlMaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0LnByZXBlbmRBbnkoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgZ290IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXJcbiAgICAgKi9cbiAgICBwcmVwZW5kQW55KGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICAgICAgdGhpcy5fYW55TGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBnb3QgZXZlbnQgJHtldmVudH1gKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBzb2NrZXQub25BbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnkoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyBvciByZW1vdmUgYWxsIGxpc3RlbmVyc1xuICAgICAqIHNvY2tldC5vZmZBbnkoKTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lclxuICAgICAqL1xuICAgIG9mZkFueShsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2FueUxpc3RlbmVycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9hbnlMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yIGFueSBldmVudCB0aGF0IGlzIHNwZWNpZmllZC4gVGhpcyBhcnJheSBjYW4gYmUgbWFuaXB1bGF0ZWQsXG4gICAgICogZS5nLiB0byByZW1vdmUgbGlzdGVuZXJzLlxuICAgICAqL1xuICAgIGxpc3RlbmVyc0FueSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FueUxpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGFueSBldmVudCBpcyBlbWl0dGVkLiBUaGUgZXZlbnQgbmFtZSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZVxuICAgICAqIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogTm90ZTogYWNrbm93bGVkZ2VtZW50cyBzZW50IHRvIHRoZSBzZXJ2ZXIgYXJlIG5vdCBpbmNsdWRlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgb25BbnlPdXRnb2luZyhsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgZmlyZWQgd2hlbiBhbnkgZXZlbnQgaXMgZW1pdHRlZC4gVGhlIGV2ZW50IG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVcbiAgICAgKiBjYWxsYmFjay4gVGhlIGxpc3RlbmVyIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RlbmVycyBhcnJheS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGFja25vd2xlZGdlbWVudHMgc2VudCB0byB0aGUgc2VydmVyIGFyZSBub3QgaW5jbHVkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHNvY2tldC5wcmVwZW5kQW55T3V0Z29pbmcoKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc2VudCBldmVudCAke2V2ZW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHBhcmFtIGxpc3RlbmVyXG4gICAgICovXG4gICAgcHJlcGVuZEFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMgfHwgW107XG4gICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gYW55IGV2ZW50IGlzIGVtaXR0ZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhdGNoQWxsTGlzdGVuZXIgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBzZW50IGV2ZW50ICR7ZXZlbnR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogc29ja2V0Lm9uQW55T3V0Z29pbmcoY2F0Y2hBbGxMaXN0ZW5lcik7XG4gICAgICpcbiAgICAgKiAvLyByZW1vdmUgYSBzcGVjaWZpYyBsaXN0ZW5lclxuICAgICAqIHNvY2tldC5vZmZBbnlPdXRnb2luZyhjYXRjaEFsbExpc3RlbmVyKTtcbiAgICAgKlxuICAgICAqIC8vIG9yIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgICogc29ja2V0Lm9mZkFueU91dGdvaW5nKCk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0gW2xpc3RlbmVyXSAtIHRoZSBjYXRjaC1hbGwgbGlzdGVuZXIgKG9wdGlvbmFsKVxuICAgICAqL1xuICAgIG9mZkFueU91dGdvaW5nKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fYW55T3V0Z29pbmdMaXN0ZW5lcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PT0gbGlzdGVuZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbGlzdGVuZXJzIHRoYXQgYXJlIGxpc3RlbmluZyBmb3IgYW55IGV2ZW50IHRoYXQgaXMgc3BlY2lmaWVkLiBUaGlzIGFycmF5IGNhbiBiZSBtYW5pcHVsYXRlZCxcbiAgICAgKiBlLmcuIHRvIHJlbW92ZSBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbGlzdGVuZXJzQW55T3V0Z29pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyB8fCBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90aWZ5IHRoZSBsaXN0ZW5lcnMgZm9yIGVhY2ggcGFja2V0IHNlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbm90aWZ5T3V0Z29pbmdMaXN0ZW5lcnMocGFja2V0KSB7XG4gICAgICAgIGlmICh0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycyAmJiB0aGlzLl9hbnlPdXRnb2luZ0xpc3RlbmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2FueU91dGdvaW5nTGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIHBhY2tldC5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEluaXRpYWxpemUgYmFja29mZiB0aW1lciB3aXRoIGBvcHRzYC5cbiAqXG4gKiAtIGBtaW5gIGluaXRpYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgWzEwMF1cbiAqIC0gYG1heGAgbWF4IHRpbWVvdXQgWzEwMDAwXVxuICogLSBgaml0dGVyYCBbMF1cbiAqIC0gYGZhY3RvcmAgWzJdXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCYWNrb2ZmKG9wdHMpIHtcbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICB0aGlzLm1zID0gb3B0cy5taW4gfHwgMTAwO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXggfHwgMTAwMDA7XG4gICAgdGhpcy5mYWN0b3IgPSBvcHRzLmZhY3RvciB8fCAyO1xuICAgIHRoaXMuaml0dGVyID0gb3B0cy5qaXR0ZXIgPiAwICYmIG9wdHMuaml0dGVyIDw9IDEgPyBvcHRzLmppdHRlciA6IDA7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDA7XG59XG4vKipcbiAqIFJldHVybiB0aGUgYmFja29mZiBkdXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbXMgPSB0aGlzLm1zICogTWF0aC5wb3codGhpcy5mYWN0b3IsIHRoaXMuYXR0ZW1wdHMrKyk7XG4gICAgaWYgKHRoaXMuaml0dGVyKSB7XG4gICAgICAgIHZhciByYW5kID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgdmFyIGRldmlhdGlvbiA9IE1hdGguZmxvb3IocmFuZCAqIHRoaXMuaml0dGVyICogbXMpO1xuICAgICAgICBtcyA9IChNYXRoLmZsb29yKHJhbmQgKiAxMCkgJiAxKSA9PSAwID8gbXMgLSBkZXZpYXRpb24gOiBtcyArIGRldmlhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKG1zLCB0aGlzLm1heCkgfCAwO1xufTtcbi8qKlxuICogUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cy5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbn07XG4vKipcbiAqIFNldCB0aGUgbWluaW11bSBkdXJhdGlvblxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbkJhY2tvZmYucHJvdG90eXBlLnNldE1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICB0aGlzLm1zID0gbWluO1xufTtcbi8qKlxuICogU2V0IHRoZSBtYXhpbXVtIGR1cmF0aW9uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQmFja29mZi5wcm90b3R5cGUuc2V0TWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgIHRoaXMubWF4ID0gbWF4O1xufTtcbi8qKlxuICogU2V0IHRoZSBqaXR0ZXJcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5CYWNrb2ZmLnByb3RvdHlwZS5zZXRKaXR0ZXIgPSBmdW5jdGlvbiAoaml0dGVyKSB7XG4gICAgdGhpcy5qaXR0ZXIgPSBqaXR0ZXI7XG59O1xuIiwgImltcG9ydCB7IFNvY2tldCBhcyBFbmdpbmUsIGluc3RhbGxUaW1lckZ1bmN0aW9ucywgbmV4dFRpY2ssIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbmltcG9ydCB7IFNvY2tldCB9IGZyb20gXCIuL3NvY2tldC5qc1wiO1xuaW1wb3J0ICogYXMgcGFyc2VyIGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG5pbXBvcnQgeyBvbiB9IGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgeyBCYWNrb2ZmIH0gZnJvbSBcIi4vY29udHJpYi9iYWNrbzIuanNcIjtcbmltcG9ydCB7IEVtaXR0ZXIsIH0gZnJvbSBcIkBzb2NrZXQuaW8vY29tcG9uZW50LWVtaXR0ZXJcIjtcbmV4cG9ydCBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uc3BzID0ge307XG4gICAgICAgIHRoaXMuc3VicyA9IFtdO1xuICAgICAgICBpZiAodXJpICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1cmkpIHtcbiAgICAgICAgICAgIG9wdHMgPSB1cmk7XG4gICAgICAgICAgICB1cmkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIG9wdHMucGF0aCA9IG9wdHMucGF0aCB8fCBcIi9zb2NrZXQuaW9cIjtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgaW5zdGFsbFRpbWVyRnVuY3Rpb25zKHRoaXMsIG9wdHMpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbihvcHRzLnJlY29ubmVjdGlvbiAhPT0gZmFsc2UpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkF0dGVtcHRzKG9wdHMucmVjb25uZWN0aW9uQXR0ZW1wdHMgfHwgSW5maW5pdHkpO1xuICAgICAgICB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KG9wdHMucmVjb25uZWN0aW9uRGVsYXkgfHwgMTAwMCk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heCB8fCA1MDAwKTtcbiAgICAgICAgdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKChfYSA9IG9wdHMucmFuZG9taXphdGlvbkZhY3RvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMC41KTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmID0gbmV3IEJhY2tvZmYoe1xuICAgICAgICAgICAgbWluOiB0aGlzLnJlY29ubmVjdGlvbkRlbGF5KCksXG4gICAgICAgICAgICBtYXg6IHRoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgoKSxcbiAgICAgICAgICAgIGppdHRlcjogdGhpcy5yYW5kb21pemF0aW9uRmFjdG9yKCksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRpbWVvdXQobnVsbCA9PSBvcHRzLnRpbWVvdXQgPyAyMDAwMCA6IG9wdHMudGltZW91dCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLnVyaSA9IHVyaTtcbiAgICAgICAgY29uc3QgX3BhcnNlciA9IG9wdHMucGFyc2VyIHx8IHBhcnNlcjtcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gbmV3IF9wYXJzZXIuRW5jb2RlcigpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgX3BhcnNlci5EZWNvZGVyKCk7XG4gICAgICAgIHRoaXMuX2F1dG9Db25uZWN0ID0gb3B0cy5hdXRvQ29ubmVjdCAhPT0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9hdXRvQ29ubmVjdClcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb24odikge1xuICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gPSAhIXY7XG4gICAgICAgIGlmICghdikge1xuICAgICAgICAgICAgdGhpcy5za2lwUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVjb25uZWN0aW9uQXR0ZW1wdHModikge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cyA9IHY7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheSh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheTtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXkgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNaW4odik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByYW5kb21pemF0aW9uRmFjdG9yKHYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I7XG4gICAgICAgIHRoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3IgPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRKaXR0ZXIodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZWNvbm5lY3Rpb25EZWxheU1heCh2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDtcbiAgICAgICAgdGhpcy5fcmVjb25uZWN0aW9uRGVsYXlNYXggPSB2O1xuICAgICAgICAoX2EgPSB0aGlzLmJhY2tvZmYpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRNYXgodik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aW1lb3V0KHYpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVvdXQ7XG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSB2O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyeWluZyB0byByZWNvbm5lY3QgaWYgcmVjb25uZWN0aW9uIGlzIGVuYWJsZWQgYW5kIHdlIGhhdmUgbm90XG4gICAgICogc3RhcnRlZCByZWNvbm5lY3RpbmcgeWV0XG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG1heWJlUmVjb25uZWN0T25PcGVuKCkge1xuICAgICAgICAvLyBPbmx5IHRyeSB0byByZWNvbm5lY3QgaWYgaXQncyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjb25uZWN0aW5nXG4gICAgICAgIGlmICghdGhpcy5fcmVjb25uZWN0aW5nICYmXG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3Rpb24gJiZcbiAgICAgICAgICAgIHRoaXMuYmFja29mZi5hdHRlbXB0cyA9PT0gMCkge1xuICAgICAgICAgICAgLy8ga2VlcHMgcmVjb25uZWN0aW9uIGZyb20gZmlyaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZWNvbm5lY3Rpb24gbG9vcFxuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBgc29ja2V0YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gb3B0aW9uYWwsIGNhbGxiYWNrXG4gICAgICogQHJldHVybiBzZWxmXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG9wZW4oZm4pIHtcbiAgICAgICAgaWYgKH50aGlzLl9yZWFkeVN0YXRlLmluZGV4T2YoXCJvcGVuXCIpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSh0aGlzLnVyaSwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yZWFkeVN0YXRlID0gXCJvcGVuaW5nXCI7XG4gICAgICAgIHRoaXMuc2tpcFJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAvLyBlbWl0IGBvcGVuYFxuICAgICAgICBjb25zdCBvcGVuU3ViRGVzdHJveSA9IG9uKHNvY2tldCwgXCJvcGVuXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYub25vcGVuKCk7XG4gICAgICAgICAgICBmbiAmJiBmbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFwiY2xvc2VkXCI7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImVycm9yXCIsIGVycik7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgICBmbihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZXJlIGlzIG5vIGZuIHRvIGhhbmRsZSB0aGUgZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLm1heWJlUmVjb25uZWN0T25PcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVtaXQgYGVycm9yYFxuICAgICAgICBjb25zdCBlcnJvclN1YiA9IG9uKHNvY2tldCwgXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGZhbHNlICE9PSB0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5fdGltZW91dDtcbiAgICAgICAgICAgIC8vIHNldCB0aW1lclxuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb3BlblN1YkRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKG5ldyBFcnJvcihcInRpbWVvdXRcIikpO1xuICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmF1dG9VbnJlZikge1xuICAgICAgICAgICAgICAgIHRpbWVyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1YnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGbih0aW1lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN1YnMucHVzaChvcGVuU3ViRGVzdHJveSk7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBvcGVuKClcbiAgICAgKlxuICAgICAqIEByZXR1cm4gc2VsZlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBjb25uZWN0KGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW4oZm4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiB0cmFuc3BvcnQgb3Blbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25vcGVuKCkge1xuICAgICAgICAvLyBjbGVhciBvbGQgc3Vic1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgLy8gbWFyayBhcyBvcGVuXG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcIm9wZW5cIjtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJvcGVuXCIpO1xuICAgICAgICAvLyBhZGQgbmV3IHN1YnNcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpcy5lbmdpbmU7XG4gICAgICAgIHRoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCwgXCJwaW5nXCIsIHRoaXMub25waW5nLmJpbmQodGhpcykpLCBvbihzb2NrZXQsIFwiZGF0YVwiLCB0aGlzLm9uZGF0YS5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImVycm9yXCIsIHRoaXMub25lcnJvci5iaW5kKHRoaXMpKSwgb24oc29ja2V0LCBcImNsb3NlXCIsIHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSwgXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgb24odGhpcy5kZWNvZGVyLCBcImRlY29kZWRcIiwgdGhpcy5vbmRlY29kZWQuYmluZCh0aGlzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgdXBvbiBhIHBpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucGluZygpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJwaW5nXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2l0aCBkYXRhLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBvbmRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVyLmFkZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbmNsb3NlKFwicGFyc2UgZXJyb3JcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gcGFyc2VyIGZ1bGx5IGRlY29kZXMgYSBwYWNrZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9uZGVjb2RlZChwYWNrZXQpIHtcbiAgICAgICAgLy8gdGhlIG5leHRUaWNrIGNhbGwgcHJldmVudHMgYW4gZXhjZXB0aW9uIGluIGEgdXNlci1wcm92aWRlZCBldmVudCBsaXN0ZW5lciBmcm9tIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0aW9uIGR1ZSB0byBhIFwicGFyc2UgZXJyb3JcIlxuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInBhY2tldFwiLCBwYWNrZXQpO1xuICAgICAgICB9LCB0aGlzLnNldFRpbWVvdXRGbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIHNvY2tldCBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25lcnJvcihlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHNvY2tldCBmb3IgdGhlIGdpdmVuIGBuc3BgLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U29ja2V0fVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBzb2NrZXQobnNwLCBvcHRzKSB7XG4gICAgICAgIGxldCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQodGhpcywgbnNwLCBvcHRzKTtcbiAgICAgICAgICAgIHRoaXMubnNwc1tuc3BdID0gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2F1dG9Db25uZWN0ICYmICFzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICBzb2NrZXQuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB1cG9uIGEgc29ja2V0IGNsb3NlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Rlc3Ryb3koc29ja2V0KSB7XG4gICAgICAgIGNvbnN0IG5zcHMgPSBPYmplY3Qua2V5cyh0aGlzLm5zcHMpO1xuICAgICAgICBmb3IgKGNvbnN0IG5zcCBvZiBuc3BzKSB7XG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzLm5zcHNbbnNwXTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHBhY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWNrZXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wYWNrZXQocGFja2V0KSB7XG4gICAgICAgIGNvbnN0IGVuY29kZWRQYWNrZXRzID0gdGhpcy5lbmNvZGVyLmVuY29kZShwYWNrZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuY29kZWRQYWNrZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmVuZ2luZS53cml0ZShlbmNvZGVkUGFja2V0c1tpXSwgcGFja2V0Lm9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIHRyYW5zcG9ydCBzdWJzY3JpcHRpb25zIGFuZCBwYWNrZXQgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICB0aGlzLnN1YnMuZm9yRWFjaCgoc3ViRGVzdHJveSkgPT4gc3ViRGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZGVjb2Rlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nsb3NlKCkge1xuICAgICAgICB0aGlzLnNraXBSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbmNsb3NlKFwiZm9yY2VkIGNsb3NlXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgY2xvc2UoKVxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW46XG4gICAgICpcbiAgICAgKiAtIHRoZSBsb3ctbGV2ZWwgZW5naW5lIGlzIGNsb3NlZFxuICAgICAqIC0gdGhlIHBhcnNlciBlbmNvdW50ZXJlZCBhIGJhZGx5IGZvcm1hdHRlZCBwYWNrZXRcbiAgICAgKiAtIGFsbCBzb2NrZXRzIGFyZSBkaXNjb25uZWN0ZWRcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgb25jbG9zZShyZWFzb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIChfYSA9IHRoaXMuZW5naW5lKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3JlYWR5U3RhdGUgPSBcImNsb3NlZFwiO1xuICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcImNsb3NlXCIsIHJlYXNvbiwgZGVzY3JpcHRpb24pO1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW9uICYmICF0aGlzLnNraXBSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVjb25uZWN0aW5nIHx8IHRoaXMuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuYmFja29mZi5hdHRlbXB0cyA+PSB0aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXNlcnZlZChcInJlY29ubmVjdF9mYWlsZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5iYWNrb2ZmLmR1cmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnNldFRpbWVvdXRGbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuc2tpcFJlY29ubmVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0X2F0dGVtcHRcIiwgc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBmb3IgdGhlIGNhc2Ugc29ja2V0IGNsb3NlZCBpbiBhYm92ZSBldmVudHNcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5za2lwUmVjb25uZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc2VsZi5vcGVuKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0UmVzZXJ2ZWQoXCJyZWNvbm5lY3RfZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5hdXRvVW5yZWYpIHtcbiAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm4odGltZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHVwb24gc3VjY2Vzc2Z1bCByZWNvbm5lY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIG9ucmVjb25uZWN0KCkge1xuICAgICAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5iYWNrb2ZmLmF0dGVtcHRzO1xuICAgICAgICB0aGlzLl9yZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5iYWNrb2ZmLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW1pdFJlc2VydmVkKFwicmVjb25uZWN0XCIsIGF0dGVtcHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyB1cmwgfSBmcm9tIFwiLi91cmwuanNcIjtcbmltcG9ydCB7IE1hbmFnZXIgfSBmcm9tIFwiLi9tYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTb2NrZXQgfSBmcm9tIFwiLi9zb2NrZXQuanNcIjtcbi8qKlxuICogTWFuYWdlcnMgY2FjaGUuXG4gKi9cbmNvbnN0IGNhY2hlID0ge307XG5mdW5jdGlvbiBsb29rdXAodXJpLCBvcHRzKSB7XG4gICAgaWYgKHR5cGVvZiB1cmkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgb3B0cyA9IHVyaTtcbiAgICAgICAgdXJpID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBwYXJzZWQgPSB1cmwodXJpLCBvcHRzLnBhdGggfHwgXCIvc29ja2V0LmlvXCIpO1xuICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlZC5zb3VyY2U7XG4gICAgY29uc3QgaWQgPSBwYXJzZWQuaWQ7XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRoO1xuICAgIGNvbnN0IHNhbWVOYW1lc3BhY2UgPSBjYWNoZVtpZF0gJiYgcGF0aCBpbiBjYWNoZVtpZF1bXCJuc3BzXCJdO1xuICAgIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBvcHRzLmZvcmNlTmV3IHx8XG4gICAgICAgIG9wdHNbXCJmb3JjZSBuZXcgY29ubmVjdGlvblwiXSB8fFxuICAgICAgICBmYWxzZSA9PT0gb3B0cy5tdWx0aXBsZXggfHxcbiAgICAgICAgc2FtZU5hbWVzcGFjZTtcbiAgICBsZXQgaW87XG4gICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgaW8gPSBuZXcgTWFuYWdlcihzb3VyY2UsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjYWNoZVtpZF0pIHtcbiAgICAgICAgICAgIGNhY2hlW2lkXSA9IG5ldyBNYW5hZ2VyKHNvdXJjZSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaW8gPSBjYWNoZVtpZF07XG4gICAgfVxuICAgIGlmIChwYXJzZWQucXVlcnkgJiYgIW9wdHMucXVlcnkpIHtcbiAgICAgICAgb3B0cy5xdWVyeSA9IHBhcnNlZC5xdWVyeUtleTtcbiAgICB9XG4gICAgcmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCwgb3B0cyk7XG59XG4vLyBzbyB0aGF0IFwibG9va3VwXCIgY2FuIGJlIHVzZWQgYm90aCBhcyBhIGZ1bmN0aW9uIChlLmcuIGBpbyguLi4pYCkgYW5kIGFzIGFcbi8vIG5hbWVzcGFjZSAoZS5nLiBgaW8uY29ubmVjdCguLi4pYCksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5PYmplY3QuYXNzaWduKGxvb2t1cCwge1xuICAgIE1hbmFnZXIsXG4gICAgU29ja2V0LFxuICAgIGlvOiBsb29rdXAsXG4gICAgY29ubmVjdDogbG9va3VwLFxufSk7XG4vKipcbiAqIFByb3RvY29sIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBwcm90b2NvbCB9IGZyb20gXCJzb2NrZXQuaW8tcGFyc2VyXCI7XG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMgZm9yIHN0YW5kYWxvbmUgYnVpbGQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgeyBNYW5hZ2VyLCBTb2NrZXQsIGxvb2t1cCBhcyBpbywgbG9va3VwIGFzIGNvbm5lY3QsIGxvb2t1cCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgRmV0Y2gsIE5vZGVYSFIsIFhIUiwgTm9kZVdlYlNvY2tldCwgV2ViU29ja2V0LCBXZWJUcmFuc3BvcnQsIH0gZnJvbSBcImVuZ2luZS5pby1jbGllbnRcIjtcbiIsICJpbXBvcnQgeyBpbywgU29ja2V0IH0gZnJvbSAnc29ja2V0LmlvLWNsaWVudCc7XHJcbmltcG9ydCB7IEV2ZW50QnVzIH0gZnJvbSAnLi9FdmVudEJ1cyc7XHJcblxyXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0U2VydmljZSB7XHJcblx0cHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xyXG5cdHByaXZhdGUgZXZlbnRCdXM6IEV2ZW50QnVzO1xyXG5cdHByaXZhdGUgYXBpQmFzZVVybDogc3RyaW5nO1xyXG5cdC8vcHJpdmF0ZSByZWNlaXZlZEV2ZW50czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7IC8vIFx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzhcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdC8vcHJpdmF0ZSByZWNvbm5lY3RBdHRlbXB0cyA9IDA7XHJcblx0cHJpdmF0ZSBtYXhSZWNvbm5lY3RBdHRlbXB0cyA9IDEwO1xyXG5cdHByaXZhdGUgcGluZ0ludGVydmFsSWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihldmVudEJ1czogRXZlbnRCdXMsIGFwaUJhc2VVcmw6IHN0cmluZykge1xyXG5cdFx0dGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xyXG5cdFx0dGhpcy5hcGlCYXNlVXJsID0gYXBpQmFzZVVybDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0EgV2ViU29ja2V0IFx1MDQ0MVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0M1xyXG5cdCAqL1xyXG5cdGNvbm5lY3QoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCkge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnV2ViU29ja2V0IFx1MDQ0M1x1MDQzNlx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0QnKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFx1MDQxOFx1MDQzN1x1MDQzMlx1MDQzQlx1MDQzNVx1MDQzQVx1MDQzMFx1MDQzNVx1MDQzQyBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgVVJMIFx1MDQzMVx1MDQzNVx1MDQzNyAvYXBpXHJcblx0XHRjb25zdCB3c1VybCA9IHRoaXMuYXBpQmFzZVVybC5yZXBsYWNlKCcvYXBpJywgJycpO1xyXG5cdFx0Y29uc29sZS5sb2coJ1x1RDgzRFx1REQwQyBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNBIFdlYlNvY2tldDonLCB3c1VybCk7XHJcblxyXG5cdFx0dGhpcy5zb2NrZXQgPSBpbyh3c1VybCwge1xyXG5cdFx0XHR0cmFuc3BvcnRzOiBbJ3dlYnNvY2tldCcsICdwb2xsaW5nJ10sXHJcblx0XHRcdHJlY29ubmVjdGlvbjogdHJ1ZSxcclxuXHRcdFx0cmVjb25uZWN0aW9uRGVsYXk6IDEwMDAsXHJcblx0XHRcdHJlY29ubmVjdGlvbkRlbGF5TWF4OiA1MDAwLFxyXG5cdFx0XHRyZWNvbm5lY3Rpb25BdHRlbXB0czogdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyxcclxuXHRcdFx0dGltZW91dDogMjAwMDAsXHJcblx0XHRcdGZvcmNlTmV3OiBmYWxzZSxcclxuXHRcdFx0dXBncmFkZTogdHJ1ZSxcclxuXHRcdFx0Ly8gXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzNFx1MDQzRVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0VcdTA0M0ZcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMVx1MDQzOFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzOFxyXG5cdFx0XHRhdXRvQ29ubmVjdDogdHJ1ZSxcclxuXHRcdFx0cmVtZW1iZXJVcGdyYWRlOiB0cnVlLFxyXG5cdFx0XHRyZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xyXG5cdFx0dGhpcy5zdGFydFByb2FjdGl2ZVBpbmcoKTsgLy8gXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0MzhcdTA0M0RcdTA0MzNcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0FcdTA0MzggV2ViU29ja2V0IFx1MDQ0MVx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzOVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdjb25uZWN0JywgKCkgPT4ge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXHUyNzA1IFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0QnKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdkaXNjb25uZWN0JywgKHJlYXNvbikgPT4ge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnXHUyNzRDIFdlYlNvY2tldCBcdTA0M0VcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0Q6JywgcmVhc29uKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKCdjb25uZWN0X2Vycm9yJywgKGVycm9yKSA9PiB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ1x1MDQxRVx1MDQ0OFx1MDQzOFx1MDQzMVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgV2ViU29ja2V0OicsIGVycm9yKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5vZGVzIFVwZGF0ZSBFdmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cdFx0dGhpcy5zb2NrZXQub24oXHJcblx0XHRcdCdub2RlX3R5cGVfY2hhbmdlZCcsXHJcblx0XHRcdChkYXRhOiB7IGdyYXBoX2lkOiBzdHJpbmc7IG5vZGVfaWQ6IHN0cmluZzsgbm9kZV90eXBlOiBzdHJpbmcgfSwgY2FsbGJhY2s/OiAocmVzcG9uc2U6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gdm9pZCkgPT4ge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdcdUQ4M0RcdURDRTEgV2ViU29ja2V0IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzRTogbm9kZV90eXBlX2NoYW5nZWQnLCBkYXRhKTtcclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLW5vZGUtdHlwZS1jaGFuZ2VkJywge1xyXG5cdFx0XHRcdFx0Z3JhcGhJZDogZGF0YS5ncmFwaF9pZCxcclxuXHRcdFx0XHRcdG5vZGVJZDogZGF0YS5ub2RlX2lkLFxyXG5cdFx0XHRcdFx0bm9kZVR5cGU6IGRhdGEubm9kZV90eXBlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0XHRjYWxsYmFjayh7IHN0YXR1czogJ29rJyB9KTsgLy8gXHUwNDFFXHUwNDQyXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM1XHUwNDNDIFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnNvY2tldC5vbihcclxuXHRcdFx0J2dyYXBoX3RpdGxlX3VwZGF0ZWQnLFxyXG5cdFx0XHQoZGF0YTogeyBncmFwaF9pZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0sIGNhbGxiYWNrPzogKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHZvaWQpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnXHVEODNEXHVEQ0UxIFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0U6IGdyYXBoX3RpdGxlX3VwZGF0ZWQnLCBkYXRhKTtcclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLWdyYXBoLXRpdGxlLXVwZGF0ZWQnLCBkYXRhKTtcclxuXHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGNhbGxiYWNrKHsgc3RhdHVzOiAnb2snIH0pOyAvLyBcdTA0MUVcdTA0NDJcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM0XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc29ja2V0Lm9uKFxyXG5cdFx0XHQnbm9kZV90aXRsZV91cGRhdGVkJyxcclxuXHRcdFx0KGRhdGE6IHsgZ3JhcGhfaWQ6IHN0cmluZzsgbm9kZV9pZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH0sIGNhbGxiYWNrPzogKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHZvaWQpID0+IHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnXHVEODNEXHVEQ0UxIFdlYlNvY2tldCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0M0U6IG5vZGVfdGl0bGVfdXBkYXRlZCcsIGRhdGEpO1xyXG5cclxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLmVtaXQoJ3dzLW5vZGUtdGl0bGUtdXBkYXRlZCcsIGRhdGEpO1xyXG5cdFx0XHRcdGlmIChjYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2soeyBzdGF0dXM6ICdvaycgfSk7IC8vIFx1MDQxRVx1MDQ0Mlx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQzQyBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcdTA0MUVcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzBcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDNFXHUwNDQyIFdlYlNvY2tldCBcdTA0NDFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzBcclxuXHQgKi9cclxuXHRkaXNjb25uZWN0KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuc29ja2V0KSB7XHJcblx0XHRcdHRoaXMuc29ja2V0LmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0dGhpcy5zb2NrZXQgPSBudWxsO1xyXG5cdFx0XHRjb25zb2xlLmxvZygnV2ViU29ja2V0IFx1MDQzRVx1MDQ0Mlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRCcpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zdG9wUHJvYWN0aXZlUGluZygpOyAvLyBcdTA0MUVcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzRlx1MDQzOFx1MDQzRFx1MDQzM1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDRGXHUwNDM1XHUwNDQyIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQ0M1x1MDQ0MSBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcclxuXHQgKi9cclxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLnNvY2tldD8uY29ubmVjdGVkID8/IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0MzhcdTA0M0RcdTA0MzMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzQVx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0MzVcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYuXHJcblx0ICovXHJcbiAgICBwcml2YXRlIHN0YXJ0UHJvYWN0aXZlUGluZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3BQcm9hY3RpdmVQaW5nKCk7IC8vIFx1MDQyM1x1MDQzMVx1MDQzNVx1MDQzNFx1MDQzOFx1MDQzQ1x1MDQ0MVx1MDQ0RiwgXHUwNDQ3XHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Qlx1MDQzNFx1MDQ0M1x1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0MzhcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzBcdTA0M0IgXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHJcbiAgICAgICAgdGhpcy5waW5nSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LmNvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NsaWVudCBzZW5kaW5nIHByb2FjdGl2ZSBwaW5nLi4uJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2xpZW50OiBObyBwb25nIHJlc3BvbnNlIHJlY2VpdmVkIGZvciBwcm9hY3RpdmUgcGluZyB3aXRoaW4gdGltZW91dC4gRm9yY2luZyByZWNvbm5lY3QuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9LCAzMDAwKTsgLy8gXHUwNDIyXHUwNDMwXHUwNDM5XHUwNDNDXHUwNDMwXHUwNDQzXHUwNDQyIFx1MDQzRVx1MDQzNlx1MDQzOFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzAgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQzOFx1MDQzRFx1MDQzMyBcdTA0M0VcdTA0NDIgXHUwNDQxXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDMwICgzIFx1MDQ0MVx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQzRFx1MDQzNFx1MDQ0QilcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzVcdTA0M0MgY2FsbGJhY2sgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzRcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzRcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNFXHUwNDQyIFx1MDQ0MVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzMFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnY2xpZW50X3Byb2FjdGl2ZV9waW5nJywgKHJlc3BvbnNlOiB7IHN0YXR1czogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWNrVGltZW91dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gJ3BvbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgcmVjZWl2ZWQgcHJvYWN0aXZlIHBvbmcuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDbGllbnQ6IEludmFsaWQgcG9uZyByZXNwb25zZSBvciBubyByZXNwb25zZSBmb3IgcHJvYWN0aXZlIHBpbmcuIEZvcmNpbmcgcmVjb25uZWN0LicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb2NrZXQgJiYgIXRoaXMuc29ja2V0LmNvbm5lY3RlZCkgeyAvLyBcdTA0MTdcdTA0MzRcdTA0MzVcdTA0NDFcdTA0NEMgXHUwNDQzXHUwNDMxXHUwNDM4XHUwNDQwXHUwNDMwXHUwNDM1XHUwNDNDICcmJiAhdGhpcy5zb2NrZXQuY29ubmVjdGluZydcclxuICAgICAgICAgICAgICAgIC8vIFx1MDQxNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0M0VcdTA0M0FcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRCwgU29ja2V0LklPIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0NDFcdTA0MzBcdTA0M0MgXHUwNDQzXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzRlx1MDQzRVx1MDQzNFx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQzQyxcclxuICAgICAgICAgICAgICAgIC8vIFx1MDQ0Mlx1MDQzMFx1MDQzQSBcdTA0M0FcdTA0MzBcdTA0M0EgcmVjb25uZWN0aW9uOiB0cnVlLiBcdTA0MjBcdTA0NDNcdTA0NDdcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDMyXHUwNDRCXHUwNDM3XHUwNDNFXHUwNDMyIGNvbm5lY3QoKSBcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDIgXHUwNDMxXHUwNDRCXHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQzN1x1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQzQy5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgcHJvYWN0aXZlIHBpbmc6IFNvY2tldCBub3QgY29ubmVjdGVkLiBSZWx5aW5nIG9uIFNvY2tldC5JT1xcJ3MgYXV0by1yZWNvbm5lY3QgbG9naWMuJyk7XHJcbiAgICAgICAgICAgICAgICAvLyBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDMyXHUwNDRCIFx1MDQzMlx1MDQ0MVx1MDQzNSBcdTA0MzZcdTA0MzUgXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDM4XHUwNDQyXHUwNDM1IFx1MDQzMFx1MDQzM1x1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0MVx1MDQzOFx1MDQzMlx1MDQzRFx1MDQzRSBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgdGhpcy5jb25uZWN0KCkgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzQyBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzggXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGLFxyXG4gICAgICAgICAgICAgICAgLy8gXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDRDXHUwNDQyXHUwNDM1IFx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMDApOyAvLyBcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NEZcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDRCXHUwNDM1IDUgXHUwNDQxXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDNEXHUwNDM0XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFx1MDQxRVx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0MzJcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDM4XHUwNDNEXHUwNDMzLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcFByb2FjdGl2ZVBpbmcoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5waW5nSW50ZXJ2YWxJZCkge1xyXG5cdFx0XHRjbGVhckludGVydmFsKHRoaXMucGluZ0ludGVydmFsSWQpO1xyXG5cdFx0XHR0aGlzLnBpbmdJbnRlcnZhbElkID0gbnVsbDtcclxuXHRcdFx0Y29uc29sZS5sb2coJ1Byb2FjdGl2ZSBwaW5nIHN0b3BwZWQuJyk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHlEQUFBQSxTQUFBO0FBQUE7QUFZQSxRQUFJLE1BQXVDO0FBQ3pDLE9BQUMsV0FBVztBQUVKO0FBR1YsWUFDRSxPQUFPLG1DQUFtQyxlQUMxQyxPQUFPLCtCQUErQixnQ0FDcEMsWUFDRjtBQUNBLHlDQUErQiw0QkFBNEIsSUFBSSxNQUFNLENBQUM7QUFBQSxR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LGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQTtBQUFBLFVBRU4sT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsY0FBYztBQUFBLFVBQ2QsWUFBWTtBQUFBLFVBQ1osV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2YsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsZUFBZTtBQUFBLFVBQ2YsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsT0FBTztBQUFBLFVBQ1Asb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsMkJBQTJCO0FBQUEsVUFDM0IsK0JBQStCO0FBQUEsVUFDL0IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsVUFBVTtBQUFBLFVBQ1YsWUFBWTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsaUJBQWlCO0FBQUEsVUFDakIsV0FBVztBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osVUFBVTtBQUFBLFVBQ1YsV0FBVztBQUFBLFVBQ1gsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsS0FBSztBQUFBLFVBQ0wsVUFBVTtBQUFBLFVBQ1YsMkJBQTJCO0FBQUEsVUFDM0IsTUFBTTtBQUFBLFVBQ04sYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsNEJBQTRCO0FBQUEsVUFDNUIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsOEJBQThCO0FBQUEsVUFDOUIsVUFBVTtBQUFBLFVBQ1YsbUJBQW1CO0FBQUEsVUFDbkIsZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsZUFBZTtBQUFBLFVBQ2YsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsS0FBSztBQUFBLFVBQ0wsSUFBSTtBQUFBLFVBQ0osUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsV0FBVztBQUFBLFVBQ1gsWUFBWTtBQUFBLFVBQ1osVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsY0FBYztBQUFBLFVBQ2QsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFVBQ04sa0JBQWtCO0FBQUEsVUFDbEIsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsTUFBTTtBQUFBLFVBQ04sWUFBWTtBQUFBLFVBQ1osUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsUUFBUTtBQUFBLFVBQ1IsVUFBVTtBQUFBLFVBQ1Ysa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1oscUJBQXFCO0FBQUEsVUFDckIsa0JBQWtCO0FBQUEsVUFDbEIsY0FBYztBQUFBLFVBQ2QsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsZUFBZTtBQUFBLFVBQ2YscUJBQXFCO0FBQUEsVUFDckIsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsR0FBRztBQUFBLFVBQ0gsUUFBUTtBQUFBLFVBQ1IsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04saUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsVUFBVTtBQUFBLFVBQ1YsTUFBTTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIsa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYTtBQUFBLFVBQ2IsV0FBVztBQUFBLFVBQ1gsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsdUJBQXVCO0FBQUEsVUFDdkIsMEJBQTBCO0FBQUEsVUFDMUIsd0JBQXdCO0FBQUEsVUFDeEIsMkJBQTJCO0FBQUEsVUFDM0IsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFVBQ1IsaUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsa0JBQWtCO0FBQUEsVUFDbEIscUJBQXFCO0FBQUEsVUFDckIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsZ0NBQWdDO0FBQUEsVUFDaEMsMEJBQTBCO0FBQUEsVUFDMUIsY0FBYztBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsbUJBQW1CO0FBQUEsVUFDbkIsWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsSUFBSTtBQUFBLFVBQ0osV0FBVztBQUFBLFVBQ1gsUUFBUTtBQUFBLFVBQ1IsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsc0JBQXNCO0FBQUEsVUFDdEIsb0JBQW9CO0FBQUEsVUFDcEIsdUJBQXVCO0FBQUEsVUFDdkIsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsWUFBWTtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsUUFBUTtBQUFBLFVBQ1IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsVUFBVTtBQUFBLFVBQ1YsYUFBYTtBQUFBLFVBQ2IsY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FBQUEsVUFDakIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osWUFBWTtBQUFBLFVBQ1osZUFBZTtBQUFBLFVBQ2Ysa0JBQWtCO0FBQUEsVUFDbEIsT0FBTztBQUFBLFVBQ1AsUUFBUTtBQUFBLFVBQ1IsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsYUFBYTtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsSUFBSTtBQUFBLFVBQ0osSUFBSTtBQUFBLFVBQ0osR0FBRztBQUFBLFVBQ0gsa0JBQWtCO0FBQUEsVUFDbEIsU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osY0FBYztBQUFBLFVBQ2QsaUJBQWlCO0FB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RUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVBRUo7QUFBQTtBQUNBLFlBQUk7QUFBQTtBQUFBLFVB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QSxFQUNmLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLGdCQUFnQjtBQUFBLEVBQ2hCLFlBQVk7QUFBQSxFQUNaLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxFQUNULFlBQVk7QUFBQSxFQUNaLGNBQWM7QUFBQSxFQUNkLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxFQUNULFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLGFBQWE7QUFBQSxFQUNiLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFVBQVU7QUFBQSxFQUNWLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFFBQVE7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLHNCQUFzQjtBQUFBLEVBQ3RCLFdBQVc7QUFBQSxFQUNYLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLGVBQWU7QUFBQSxFQUNmLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGdCQUFnQjtBQUFBLEVBQ2hCLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULFFBQVE7QUFBQSxFQUNSLGtCQUFrQjtBQUFBLEVBQ2xCLFlBQVk7QUFBQSxFQUNaLGNBQWM7QUFBQSxFQUNkLGNBQWM7QUFBQSxFQUNkLGdCQUFnQjtBQUFBLEVBQ2hCLGlCQUFpQjtBQUFBLEVBQ2pCLG1CQUFtQjtBQUFBLEVBQ25CLGlCQUFpQjtBQUFBLEVBQ2pCLGlCQUFpQjtBQUFBLEVBQ2pCLGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFBQSxFQUNULE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQSxFQUNYLFFBQVE7QUFBQSxFQUNSLFdBQVc7QUFBQSxFQUNYLFFBQVE7QUFBQSxFQUNSLGVBQWU7QUFBQSxFQUNmLFdBQVc7QUFBQSxFQUNYLGVBQWU7QUFBQSxFQUNmLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFFBQVE7QUFBQSxFQUNSLGVBQWU7QUFBQSxFQUNmLEtBQUs7QUFBQSxFQUNMLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFBQSxFQUNiLFFBQVE7QUFBQSxFQUNSLFlBQVk7QUFBQSxFQUNaLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLFFBQVE7QUFBQSxFQUNSLFFBQVE7QUFBQSxFQUNSLFNBQVM7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLFdBQVc7QUFBQSxFQUNYLE1BQU07QUFBQSxFQUNOLGFBQWE7QUFBQSxFQUNiLFdBQVc7QUFBQSxFQUNYLEtBQUs7QUFBQSxFQUNMLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFBQSxFQUNULFFBQVE7QUFBQSxFQUNSLFdBQVc7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QUFLLElBQUlBO0FBQzlDLGdCQUFNLEtBQUssT0FBTyxhQUFhO0FBRS9CLGVBQUssT0FBTyxTQUFTLEtBQUssa0JBQWtCO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0gsQ0FBQyxFQUNBLGVBQWUsQ0FBQyxXQUFXO0FBQzNCLGVBQ0UsUUFBUSxHQUFHLEVBQ1gsV0FBVywyRUFBZSxFQUMxQixRQUFRLFlBQVk7QUFDcEIsZUFBSyxPQUFPLFNBQVMsZ0JBQWdCLE9BQU8sT0FBTyxDQUFDO0FBQ3BELGdCQUFNLEtBQUssT0FBTyxhQUFhO0FBQy9CLGVBQUssUUFBUTtBQUViLGVBQUssT0FBTyxTQUFTLEtBQUssa0JBQWtCO0FBQUEsUUFDN0MsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFFBQUksMEJBQVEsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXO0FBQzlDLGFBQ0UsY0FBYyxpRkFBZ0IsRUFDOUIsUUFBUSxNQUFNLEVBQ2QsUUFBUSxZQUFZO0FBQ3BCLGFBQUssT0FBTyxTQUFTLGdCQUFnQixLQUFLLEVBQUU7QUFDNUMsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUMvQixhQUFLLFFBQVE7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNGO0FBQ0Q7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJSZWFjdERlYnVnQ3VycmVudEZyYW1lIiwgInZhbHVlIiwgImluaXQiLCAic2VsZiIsICJjcmVhdGVFbGVtZW50IiwgImNoaWxkcmVuIiwgIlNFUEFSQVRPUiIsICJhcnJheSIsICJ0b0FycmF5IiwgImNyZWF0ZUNvbnRleHQiLCAibW9kdWxlT2JqZWN0IiwgImVycm9yIiwgImZvcndhcmRSZWYiLCAibWVtbyIsICJ1c2VDb250ZXh0IiwgInVzZVN0YXRlIiwgImluaXRpYWxTdGF0ZSIsICJ1c2VSZWYiLCAidXNlRWZmZWN0IiwgImNyZWF0ZSIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZURlYnVnVmFsdWUiLCAiZnJhbWUiLCAiQ29tcG9uZW50IiwgImxvY2F0aW9uIiwgInJldHVyblZhbHVlIiwgIm1vZHVsZSIsICJ0aW1lciIsICJpbml0aWFsVGltZSIsICJzdGFydFRpbWUiLCAidGltZW91dCIsICJtb2R1bGUiLCAiUmVhY3QiLCAiUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSIsICJGcmFnbWVudCIsICJ2YWx1ZSIsICJwcmVmaXgiLCAic2FuaXRpemVVUkwiLCAidXJsIiwgImZyYW1lIiwgImluaXQiLCAid29ya0luUHJvZ3Jlc3MiLCAidG9TdHJpbmciLCAiZ2V0IiwgInNldCIsICJpc0h5ZHJhdGluZyIsICJvcHRpb25zIiwgImNoaWxkcmVuIiwgInN2Z05vZGUiLCAic3R5bGVWYWx1ZSIsICJzdHlsZSIsICJyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzIiwgInBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMiLCAiZXJyb3IiLCAiY2FsbENhbGxiYWNrIiwgImN1cnJlbnQiLCAibm93IiwgInJvb3QiLCAiaW5kZXgiLCAicmVuZGVyTGFuZXMiLCAicXVldWVkRXZlbnQiLCAiZGlzcGF0Y2hFdmVudCIsICJzdGFydCIsICJjaGFycyIsICJzZWxlY3Rpb24iLCAicHJlZml4ZXMiLCAibm9vcCIsICJjcmVhdGVFbGVtZW50IiwgImxvY2F0aW9uIiwgImhhcyIsICJpZCIsICJhcnJheSIsICJ1cGRhdGVGcmFnbWVudCIsICJjaGlsZCIsICJyZWNvbmNpbGVDaGlsZEZpYmVycyIsICJpbml0aWFsU3RhdGUiLCAiZGlzcGF0Y2giLCAiY3JlYXRlIiwgImVycm9yJDEiLCAicmVuZGVyIiwgInN1YnRyZWVSZW5kZXJMYW5lcyIsICJoYXNDb250ZXh0Q2hhbmdlZCIsICJjb21taXRUaW1lIiwgInRyYW5zaXRpb24iLCAic2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyIiwgImh5ZHJhdGUiLCAiY3JlYXRlUG9ydGFsIiwgImN1cnJlbnRIb29rIiwgIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiLCAiY3JlYXRlUm9vdCIsICJwcm90b2NvbCIsICJtb2R1bGUiLCAiUmVhY3QiLCAidmFsdWUiLCAidXNlU3RhdGUiLCAidXNlRWZmZWN0IiwgInVzZURlYnVnVmFsdWUiLCAibW9kdWxlIiwgIlJlYWN0IiwgInVzZVJlZiIsICJ1c2VFZmZlY3QiLCAidXNlTWVtbyIsICJ1c2VEZWJ1Z1ZhbHVlIiwgInNlbGVjdG9yIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInJvb3QiLCAibW9kdWxlIiwgInJvb3QiLCAiU3ltYm9sIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgInZhbHVlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAicm9vdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJyb290IiwgIk1hcCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIk1hcCIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIk1hcCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJCdWZmZXIiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidHJhbnNmb3JtIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyb290IiwgIkJ1ZmZlciIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgImFycmF5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJhcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJEYXRhVmlldyIsICJtb2R1bGUiLCAicm9vdCIsICJQcm9taXNlIiwgIm1vZHVsZSIsICJyb290IiwgIlNldCIsICJtb2R1bGUiLCAicm9vdCIsICJXZWFrTWFwIiwgIm1vZHVsZSIsICJEYXRhVmlldyIsICJNYXAiLCAiUHJvbWlzZSIsICJTZXQiLCAiV2Vha01hcCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgInJvb3QiLCAiVWludDhBcnJheSIsICJtb2R1bGUiLCAiVWludDhBcnJheSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJTeW1ib2wiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAia2V5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAidmFsdWUiLCAibW9kdWxlIiwgImlkZW50aXR5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgImNvbGxlY3Rpb24iLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJjYWNoZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAib3RoVmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJzZXQiLCAidmFsdWUiLCAibW9kdWxlIiwgIlN5bWJvbCIsICJVaW50OEFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiY2FjaGUiLCAibW9kdWxlIiwgImNhY2hlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgIlN5bWJvbCIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidG9TdHJpbmciLCAidmFsdWUiLCAibW9kdWxlIiwgInRvU3RyaW5nIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImdldCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZ2V0IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpZGVudGl0eSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiZmlsdGVyIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAidmFsdWUiLCAiY29sbGVjdGlvbiIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJjb2xsZWN0aW9uIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidHJhbnNmb3JtIiwgInZhbHVlIiwgIm9iamVjdCIsICJtb2R1bGUiLCAiU3ltYm9sIiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInN0YXJ0IiwgInRyYW5zZm9ybSIsICJhcnJheSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAic3RhcnQiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgImFycmF5IiwgInZhbHVlIiwgIm1vZHVsZSIsICJhcnJheSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgIm5vb3AiLCAibW9kdWxlIiwgIlNldCIsICJub29wIiwgIm1vZHVsZSIsICJhcnJheSIsICJzZXQiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic2VsZiIsICJ2YWx1ZSIsICJjaGlsZHJlbiIsICJmaWx0ZXIiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZGlzdGFuY2UiLCAidiIsICJtb2R1bGUiLCAibW9kdWxlIiwgInciLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2IiwgImluaXQiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX2dyYXBobGliIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAiaXNCaW5hcnkiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgImZpbmQiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiYXJyYXkiLCAibW9kdWxlIiwgInZhbHVlIiwgIm9iamVjdCIsICJtb2R1bGUiLCAiYXJyYXkiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJpZGVudGl0eSIsICJhcnJheSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgImlzT2JqZWN0IiwgIm1vZHVsZSIsICJpc09iamVjdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAiaWRlbnRpdHkiLCAiYXJyYXkiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJyb290IiwgIm5vdyIsICJtb2R1bGUiLCAiaXNPYmplY3QiLCAidmFsdWUiLCAibW9kdWxlIiwgInZhbHVlIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgInBpY2siLCAibW9kdWxlIiwgInN0YXJ0IiwgIm1vZHVsZSIsICJzdGFydCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFycmF5IiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImlkZW50aXR5IiwgInZhbHVlIiwgImNvbGxlY3Rpb24iLCAibW9kdWxlIiwgIm1vZHVsZSIsICJ0b1N0cmluZyIsICJpZCIsICJtb2R1bGUiLCAidmFsdWUiLCAibW9kdWxlIiwgInJlcXVpcmVfbG9kYXNoIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJnIiwgIm1vZHVsZSIsICJ2YWx1ZSIsICJzdGFydCIsICJtb2R1bGUiLCAicmVxdWlyZV91dGlsIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAic3RhcnQiLCAibW9kdWxlIiwgInJvb3QiLCAiZWRnZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImFzY2VuZGluZyIsICJtb2R1bGUiLCAicm9vdCIsICJjaGlsZHJlbiIsICJkZnMiLCAibW9kdWxlIiwgImNoaWxkcmVuIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAibW9kdWxlIiwgImNjIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAiZW50cnkiLCAibW9kdWxlIiwgInBhcnRzIiwgIm1vZHVsZSIsICJtb2R1bGUiLCAicm9vdCIsICJtb2R1bGUiLCAibW9kdWxlIiwgImNjIiwgInJvb3QiLCAibW9kdWxlIiwgInJvb3QiLCAidyIsICJtb2R1bGUiLCAibW9kdWxlIiwgIm1vZHVsZSIsICJyZXF1aXJlX3ZlcnNpb24iLCAibW9kdWxlIiwgIm1vZHVsZSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIlJlYWN0IiwgIlJlYWN0IiwgImltcG9ydF9yZWFjdCIsICJpbml0aWFsU3RhdGUiLCAiUmVhY3RFeHBvcnRzIiwgInVzZVN5bmNFeHRlcm5hbFN0b3JlRXhwb3J0cyIsICJzZWxlY3RvciIsICJ2YWx1ZSIsICJkb2N1bWVudCIsICJzZWxlY3RvciIsICJzZWxlY3RvciIsICJzZWxlY3RvciIsICJkYXR1bSIsICJzZWxlY3RvciIsICJ2YWx1ZSIsICJzZWxlY3Rpb24iLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAidmFsdWUiLCAiY3JlYXRlIiwgImNyZWF0ZSIsICJ2YWx1ZSIsICJwYXJzZVR5cGVuYW1lcyIsICJvbiIsICJ2YWx1ZSIsICJ3aW5kb3ciLCAiZGlzcGF0Y2hfZGVmYXVsdCIsICJkaXNwYXRjaF9kZWZhdWx0IiwgInNlbGVjdF9kZWZhdWx0IiwgInNlbGVjdG9yIiwgInJvb3QiLCAic2VsZWN0aW9uIiwgInNlbGVjdF9kZWZhdWx0IiwgImNvbnN0YW50X2RlZmF1bHQiLCAiZGlzcGF0Y2giLCAidmFsdWUiLCAiZmlsdGVyIiwgInNlbGVjdGlvbiIsICJzZWxlY3RfZGVmYXVsdCIsICJjb250YWluZXIiLCAiZGlzcGF0Y2giLCAiZXZlbnQiLCAidG91Y2giLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ2YWx1ZSIsICJ2YWx1ZSIsICJjb25zdGFudF9kZWZhdWx0IiwgImNvbnN0YW50X2RlZmF1bHQiLCAiY29sb3IiLCAicmdiIiwgInN0YXJ0IiwgImkiLCAiaWRlbnRpdHkiLCAidmFsdWUiLCAiaWRlbnRpdHkiLCAicGFyc2UiLCAibm93IiwgImlkIiwgImdldCIsICJzZXQiLCAic2VsZiIsICJzdGFydCIsICJlbXB0eSIsICJpbnRlcnJ1cHRfZGVmYXVsdCIsICJpZCIsICJzZXQiLCAidmFsdWUiLCAiZ2V0IiwgInRyYW5zaXRpb24iLCAiYXR0clJlbW92ZSIsICJhdHRyUmVtb3ZlTlMiLCAiYXR0ckNvbnN0YW50IiwgImF0dHJDb25zdGFudE5TIiwgImF0dHJGdW5jdGlvbiIsICJ2YWx1ZSIsICJhdHRyRnVuY3Rpb25OUyIsICJhdHRyX2RlZmF1bHQiLCAidmFsdWUiLCAiaWQiLCAidmFsdWUiLCAiZ2V0IiwgImlkIiwgInZhbHVlIiwgInNldCIsICJnZXQiLCAiaWQiLCAidmFsdWUiLCAic2V0IiwgImdldCIsICJpZCIsICJ2YWx1ZSIsICJzZXQiLCAiZmlsdGVyX2RlZmF1bHQiLCAibWVyZ2VfZGVmYXVsdCIsICJ0cmFuc2l0aW9uIiwgImlkIiwgInNldCIsICJvbiIsICJvbl9kZWZhdWx0IiwgImdldCIsICJpZCIsICJyZW1vdmVfZGVmYXVsdCIsICJzZWxlY3RfZGVmYXVsdCIsICJpZCIsICJnZXQiLCAic2VsZWN0QWxsX2RlZmF1bHQiLCAiaWQiLCAiY2hpbGRyZW4iLCAiaW5oZXJpdCIsICJnZXQiLCAiU2VsZWN0aW9uIiwgInNlbGVjdGlvbl9kZWZhdWx0IiwgInN0eWxlUmVtb3ZlIiwgInN0eWxlQ29uc3RhbnQiLCAic3R5bGVGdW5jdGlvbiIsICJ2YWx1ZSIsICJpZCIsICJyZW1vdmUiLCAic2V0IiwgIm9uIiwgInN0eWxlX2RlZmF1bHQiLCAidmFsdWUiLCAidGV4dENvbnN0YW50IiwgInZhbHVlIiwgInRleHRGdW5jdGlvbiIsICJ0ZXh0X2RlZmF1bHQiLCAidmFsdWUiLCAiaW5oZXJpdCIsICJnZXQiLCAiaWQiLCAic2V0IiwgIm9uIiwgImlkIiwgInNlbGVjdF9kZWZhdWx0IiwgInNlbGVjdEFsbF9kZWZhdWx0IiwgImZpbHRlcl9kZWZhdWx0IiwgIm1lcmdlX2RlZmF1bHQiLCAic2VsZWN0aW9uX2RlZmF1bHQiLCAib25fZGVmYXVsdCIsICJhdHRyX2RlZmF1bHQiLCAic3R5bGVfZGVmYXVsdCIsICJ0ZXh0X2RlZmF1bHQiLCAicmVtb3ZlX2RlZmF1bHQiLCAiaWQiLCAidHJhbnNpdGlvbl9kZWZhdWx0IiwgImludGVycnVwdF9kZWZhdWx0IiwgInRyYW5zaXRpb25fZGVmYXVsdCIsICJjb25zdGFudF9kZWZhdWx0IiwgInRyYW5zZm9ybSIsICJkaXNwYXRjaCIsICJsb2NhdGlvbiIsICJpZGVudGl0eSIsICJub3Byb3BhZ2F0aW9uIiwgIm5vZXZlbnRfZGVmYXVsdCIsICJkZWZhdWx0RmlsdGVyIiwgImlkZW50aXR5IiwgImRlZmF1bHRUb3VjaGFibGUiLCAidHJhbnNmb3JtIiwgInpvb21fZGVmYXVsdCIsICJmaWx0ZXIiLCAid2hlZWxEZWx0YSIsICJzZWxlY3Rpb24iLCAiZXh0ZW50IiwgInRyYW5zaXRpb24iLCAic2VsZWN0X2RlZmF1bHQiLCAibm9ldmVudF9kZWZhdWx0IiwgIm5vcHJvcGFnYXRpb24iLCAiZXZlbnQiLCAiY29uc3RhbnRfZGVmYXVsdCIsICJ2YWx1ZSIsICJpZCIsICJzZWxlY3RvciIsICJjaGlsZHJlbiIsICJzdHlsZSIsICJSZWFjdCIsICJ2YWx1ZSIsICJpZCIsICJzdHlsZSIsICJSZWFjdCIsICJpZCIsICJDb25uZWN0aW9uTW9kZSIsICJQYW5PblNjcm9sbE1vZGUiLCAiU2VsZWN0aW9uTW9kZSIsICJDb25uZWN0aW9uTGluZVR5cGUiLCAiTWFya2VyVHlwZSIsICJQb3NpdGlvbiIsICJzdHlsZSIsICJSZWFjdCIsICJ4RGlyIiwgInlEaXIiLCAiX2EiLCAiZGlzdGFuY2UiLCAic2VsZWN0aW9uIiwgImRpc3RhbmNlIiwgImV2ZW50IiwgInRyYW5zZm9ybSIsICJoYW5kbGUiLCAiaWQiLCAiY2hpbGRyZW4iLCAiUmVhY3QiLCAidmFsdWUiLCAiZml0VmlldyIsICJnZXQiLCAiX2EiLCAiaWRlbnRpdHkiLCAiY2hhbmdlIiwgInNldCIsICJub29wIiwgImdldE5vZGVzIiwgInNldE5vZGVzIiwgInNldEVkZ2VzIiwgInpvb21fZGVmYXVsdCIsICJzZWxlY3RfZGVmYXVsdCIsICJzZWxlY3RvciIsICJzdHlsZSIsICJub2RlVHlwZXMiLCAiZWRnZXMiLCAiY29sb3IiLCAiU3ltYm9sIiwgImRlZmF1bHRDb2xvciIsICJjb250YWluZXJTdHlsZSIsICJhcHBseUNoYW5nZXMiLCAiaXRlbXMiLCAiaW1wb3J0X3JlYWN0IiwgIlJlYWN0IiwgImNoaWxkcmVuIiwgInN0eWxlIiwgImZpdFZpZXciLCAiaW1wb3J0X3JlYWN0IiwgIkJhY2tncm91bmRWYXJpYW50IiwgImNvbG9yIiwgIlJlYWN0IiwgInNlbGVjdG9yIiwgImlkIiwgInN0eWxlIiwgInRyYW5zZm9ybSIsICJpbXBvcnRfcmVhY3QiLCAiaW1wb3J0X3JlYWN0X2RvbSIsICJpbXBvcnRfb2JzaWRpYW4iLCAiY2hpbGRyZW4iLCAiZGFncmUiLCAiZGFncmUiLCAiaW1wb3J0X29ic2lkaWFuIiwgInZhbHVlIiwgIkdyYXBoVmlldyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgIm5vdyIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAidmFsdWUiLCAic2VsZWN0aW9uIiwgInVybCIsICJ2YWx1ZSIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAiaXNCaW5hcnkiLCAib24iLCAiZGVjb2RlIiwgImVtcHR5IiwgIl9hIiwgInZhbHVlIiwgImRlY29kZSIsICJwcm90b2NvbCIsICJwcm90b2NvbCIsICJ3aXRoTmF0aXZlQXJyYXlCdWZmZXIiLCAiaXNWaWV3IiwgIndpdGhOYXRpdmVCbG9iIiwgInByb3RvY29sIiwgIlBhY2tldFR5cGUiLCAidmFsdWUiLCAic3RhcnQiLCAiUkVTRVJWRURfRVZFTlRTIiwgIlNvY2tldCIsICJpZCIsICJ0aW1lb3V0IiwgInRpbWVyIiwgInNlbGYiLCAic2VsZiIsICJ0aW1lb3V0IiwgInRpbWVyIiwgIlNvY2tldCIsICJzb2NrZXQiLCAibG9va3VwIiwgImlkIiwgIlNvY2tldCIsICJsb29rdXAiLCAiR3JhcGhWaWV3IiwgInZhbHVlIl0KfQo= diff --git a/src/references/CacheManager.ts b/src/references/CacheManager.ts index 05c8f66..ed67688 100644 --- a/src/references/CacheManager.ts +++ b/src/references/CacheManager.ts @@ -6,6 +6,7 @@ import { TFile, normalizePath } from 'obsidian'; import LLMAgentPlugin from 'main'; import { v4 as uuidv4 } from 'uuid'; // Нужно установить: npm install uuid @types/uuid +import { getMimeType } from 'src/utils/fileUtils'; export class CacheManager { private plugin: LLMAgentPlugin; @@ -114,7 +115,7 @@ export class CacheManager { uuid: uuid, cachedPath: cachedFileName, name: fileName, - mimeType: this.getMimeType(fileName) + mimeType: getMimeType(fileName) }; } @@ -184,36 +185,4 @@ export class CacheManager { return false; } } - - private getMimeType(fileName: string): string { - const ext = fileName.split('.').pop()?.toLowerCase(); - const mimeTypes: Record = { - txt: 'text/plain', - md: 'text/markdown', - json: 'application/json', - js: 'text/javascript', - ts: 'text/typescript', - html: 'text/html', - css: 'text/css', - pdf: 'application/pdf', - png: 'image/png', - jpg: 'image/jpeg', - jpeg: 'image/jpeg', - gif: 'image/gif', - svg: 'image/svg+xml', - webp: 'image/webp', - xml: 'application/xml', - csv: 'text/csv', - zip: 'application/zip', - py: 'text/x-python', - java: 'text/x-java', - cpp: 'text/x-c++src', - c: 'text/x-csrc', - h: 'text/x-chdr', - sh: 'application/x-sh', - yaml: 'text/yaml', - yml: 'text/yaml' - }; - return mimeTypes[ext || ''] || 'application/octet-stream'; - } } \ No newline at end of file diff --git a/src/references/ReferenceExpander.ts b/src/references/ReferenceExpander.ts index 4a50f25..649aa85 100644 --- a/src/references/ReferenceExpander.ts +++ b/src/references/ReferenceExpander.ts @@ -9,6 +9,7 @@ import { FileReference, ReferenceParser } from './ReferenceParser'; import { TemplateEngine } from './TemplateEngine'; import { Attachment, ChatHistoryItem } from 'src/components/models/ChatHistoryItem'; import { CacheManager } from './CacheManager'; +import { getMimeType } from 'src/utils/fileUtils'; // ----------------------------------------------- Reference Expander --------------------------------------------------------------- @@ -110,7 +111,7 @@ export class ReferenceExpander { const cacheResult = await this.cacheManager.cacheVaultFile(file); cachedPath = cacheResult.cachedPath; uuid = cacheResult.uuid; - mimeType = this.getMimeType(file.name); + mimeType = getMimeType(file.name); sourcePath = file.path; // Относительный } else { console.warn(`Файл не найден в vault: ${reference.path}`); @@ -153,38 +154,6 @@ export class ReferenceExpander { }; } - private getMimeType(fileName: string): string { - // Та же логика, что в CacheManager - const ext = fileName.split('.').pop()?.toLowerCase(); - const mimeTypes: Record = { - txt: 'text/plain', - md: 'text/markdown', - json: 'application/json', - js: 'text/javascript', - ts: 'text/typescript', - html: 'text/html', - css: 'text/css', - pdf: 'application/pdf', - png: 'image/png', - jpg: 'image/jpeg', - jpeg: 'image/jpeg', - gif: 'image/gif', - svg: 'image/svg+xml', - xml: 'application/xml', - csv: 'text/csv', - zip: 'application/zip', - py: 'text/x-python', - java: 'text/x-java', - cpp: 'text/x-c++src', - c: 'text/x-csrc', - h: 'text/x-chdr', - sh: 'application/x-sh', - yaml: 'text/yaml', - yml: 'text/yaml' - }; - return mimeTypes[ext || ''] || 'application/octet-stream'; - } - /** * Подготавливает сообщения для LLM с учетом вложений. * Раскрывает только постоянные (@@/##) ссылки и ссылки в последнем сообщении. diff --git a/src/utils/fileUtils.ts b/src/utils/fileUtils.ts new file mode 100644 index 0000000..484763f --- /dev/null +++ b/src/utils/fileUtils.ts @@ -0,0 +1,38 @@ +// src/utils/fileUtils.ts + +/** + * Возвращает MIME-тип файла на основе его расширения. + * @param fileName - Имя файла (например, "document.pdf", "image.png") + * @returns MIME-тип или 'application/octet-stream', если тип неизвестен + */ +export function getMimeType(fileName: string): string { + const ext = fileName.split('.').pop()?.toLowerCase(); + const mimeTypes: Record = { + txt: 'text/plain', + md: 'text/markdown', + json: 'application/json', + js: 'text/javascript', + ts: 'text/typescript', + html: 'text/html', + css: 'text/css', + pdf: 'application/pdf', + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + gif: 'image/gif', + svg: 'image/svg+xml', + webp: 'image/webp', + xml: 'application/xml', + csv: 'text/csv', + zip: 'application/zip', + py: 'text/x-python', + java: 'text/x-java', + cpp: 'text/x-c++src', + c: 'text/x-csrc', + h: 'text/x-chdr', + sh: 'application/x-sh', + yaml: 'text/yaml', + yml: 'text/yaml' + }; + return mimeTypes[ext || ''] || 'application/octet-stream'; +} \ No newline at end of file